Dynamodb分区密钥策略-多个所有者

时间:2019-01-28 22:32:10

标签: database-design nosql amazon-dynamodb database-schema

由于我是DynamoDB的新手,因此我很难理解用作我的应用程序的分区键的最佳属性。我正在尝试将DynamoDB用于一个简单的应用程序,在该应用程序中,随机选择成对的用户开会并互相介绍。我需要选择适当的表和分区策略,以帮助进行以下查询:

  

检索已邀请用户参加的聚会(介绍)。它应该显示所有   聚会的详细信息,包括其他受邀用户。

根据我对文档的了解,要“查询”项目,我只能使用查询表达式中的键。此外,良好的分区密钥是具有高基数并促进读写吞吐量活动中的平均分布的密钥。我当时想创建一个Meetup表,但是在选择分区键时很费力,尤其是当聚会由2个用户“拥有”并且事件项在聚会发生后将到期(处于非活动状态)时,所以我我不确定使用meetupID是个好主意。但是我当时正在考虑使用两个表:

邀请表:

  • userId(分区键)
  • eventId(排序键)
  • 一些属性
  • 另一个属性

会议表:

  • meetupId(分区键)->我对此很犹豫
  • invitedUsers(这将是一组用户对象)
  • 取消
  • meetDate

使用此解决方案,需要执行2个请求,以首先获取最新的eventId,然后获取事件详细信息。这似乎是一个好方法吗? metupId是一个好的分区键吗?有更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

如果每个用户的聚会次数遵循正态分布,则您应该可以安全地拥有以下内容:

  • 一个 users 表::分区键= user_id(某些UUID)
  • 一个会议表::分区键= metup_id(某些UUID)
  • 一个 meetup_invites 表:分区键= user_id,排序键= metup_id

如果只有某些用户拥有一百万个邀请,而每个用户的平均邀请量很小,那么上述情况就只会成为问题。

答案 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

这将解决诸如此类的用例

  1. 获取所有聚会User1234受邀参加 Select * where id=User1234 and SortKey startswith meetup

  2. 获取所有聚会10天内邀请User1234参加 Select * where id=User1234 and SortKey startswith meetup filter eventDate < today +10

  3. 获取user1234 Select where id=User1234 and SortKey=metadata

  4. 的userInfo
  5. 获取Meet1234 Select * where MeetupId=meet1234 and SortKeystarts with User From Table GSI1

  6. 的所有被邀请者
  7. 获取有关事件Meet1234 Select * where MeetupId=meet1234 From Table GSI1

  8. 的所有详细信息

未解决的用例:

  1. 获取今天所有的聚会。

在NoSql模式中,应从用例出发。