由于我是DynamoDB的新手,因此我很难理解用作我的应用程序的分区键的最佳属性。我正在尝试将DynamoDB用于一个简单的应用程序,在该应用程序中,随机选择成对的用户开会并互相介绍。我需要选择适当的表和分区策略,以帮助进行以下查询:
检索已邀请用户参加的聚会(介绍)。它应该显示所有 聚会的详细信息,包括其他受邀用户。
根据我对文档的了解,要“查询”项目,我只能使用查询表达式中的键。此外,良好的分区密钥是具有高基数并促进读写吞吐量活动中的平均分布的密钥。我当时想创建一个Meetup
表,但是在选择分区键时很费力,尤其是当聚会由2个用户“拥有”并且事件项在聚会发生后将到期(处于非活动状态)时,所以我我不确定使用meetupID
是个好主意。但是我当时正在考虑使用两个表:
邀请表:
会议表:
使用此解决方案,需要执行2个请求,以首先获取最新的eventId,然后获取事件详细信息。这似乎是一个好方法吗? metupId是一个好的分区键吗?有更好的解决方案吗?
答案 0 :(得分:1)
如果每个用户的聚会次数遵循正态分布,则您应该可以安全地拥有以下内容:
如果只有某些用户拥有一百万个邀请,而每个用户的平均邀请量很小,那么上述情况就只会成为问题。
答案 1 :(得分:0)
您可以使用此架构。
| ID (PK) | SortKey | MeetupId (GSI1) |
| User1234 | metadata | | age:28 | nationality: US | interestedIn:Economics | name:Tim | ...
| User1234 | meetup#meet1234 | meet1234 | ...
| meet1234 | metadata | meet1234 | location:Central Park | time:122323223 | ...
| User4567 | metadata | | age:27 | nationality: US | interestedIn:Arts | name:Kira | ...
| User4567 | meetup#meet1234 | meet1234 | ...
...
Id is sortkey for GSI1
这将解决诸如此类的用例
获取所有聚会User1234受邀参加
Select * where id=User1234 and SortKey startswith meetup
获取所有聚会10天内邀请User1234参加
Select * where id=User1234 and SortKey startswith meetup filter eventDate < today +10
获取user1234 Select where id=User1234 and SortKey=metadata
获取Meet1234 Select * where MeetupId=meet1234 and SortKeystarts with User From Table GSI1
获取有关事件Meet1234 Select * where MeetupId=meet1234 From Table GSI1
未解决的用例:
在NoSql模式中,应从用例出发。