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

Database design Dynamodb分区密钥策略-多所有者,database-design,nosql,amazon-dynamodb,database-schema,Database Design,Nosql,Amazon Dynamodb,Database Schema,我发现很难理解作为应用程序分区键的最佳属性,因为我是DynamoDB新手。我正在尝试将DynamoDB用于一个简单的应用程序,在这个应用程序中,随机选择成对的用户进行会面并相互介绍。我需要选择适当的表和分区策略,以帮助进行以下查询: 检索已邀请用户参加的会议(简介)。它应该显示一切 会议的详细信息,包括其他受邀用户 根据我在文档中的理解,要“查询”一个项目,我只能使用查询表达式中的键。此外,一个好的分区键是一个具有高基数并在读/写吞吐量活动中促进平等分布的分区键。我想创建一个Meetup表,但是

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

检索已邀请用户参加的会议(简介)。它应该显示一切 会议的详细信息,包括其他受邀用户

根据我在文档中的理解,要“查询”一个项目,我只能使用查询表达式中的键。此外,一个好的分区键是一个具有高基数并在读/写吞吐量活动中促进平等分布的分区键。我想创建一个
Meetup
表,但是我正在努力选择一个分区键,特别是当Meetup被2个用户“拥有”并且事件项在Meetup发生后将过期(非活动)时,所以我不确定使用
meetupID
是否是一个好主意。但我想用两张这样的桌子:

邀请表:

  • 用户ID(分区键)
  • eventId(排序键)
  • 某些属性
  • 另一个属性
会议桌:

  • meetupId(分区键)->我对此犹豫不决
  • invitedUsers(这将是一个用户对象数组)
  • 取消
  • 会议日期

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

如果每个用户的会议次数服从正态分布,您应该能够安全地拥有如下内容:

  • 用户表::分区键=用户id(某些UUID)
  • meetup表::分区键=meetup_id(某些UUID)
  • meetup_邀请表:分区键=用户id,排序键=meetup_id

在大规模情况下,上述情况只会出现问题,比如说,当每个用户的平均邀请量非常小时,您的一些用户有一百万个邀请。

您可以使用此模式

| 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
这将解决如下用例

  • Get all Meetup User1234受邀参加
    选择*where id=User1234和SortKey startswith meetup

  • 10天内邀请用户1234参加所有会议
    选择*where id=User1234和SortKey startswith meetup filter eventDate

  • 获取user1234的userInfo
    选择其中id=user1234和SortKey=metadata

  • 获取meet1234的所有受邀者
    从表GSI1中选择*其中MeetupId=meet1234和SortKeyStart with User

  • 获取有关事件meet1234的所有详细信息
    从表GSI1中选择*其中MeetupId=meet1234

  • 未解决的用例:

  • 让所有的聚会都在今天举行

  • 在NoSql模式中,应该从用例中驱动。

    感谢您回复我。因此,为了获得所需的结果,我必须对数据库进行两次往返,并执行两个查询。。。对吗?是的-这是DynamoDB的一种非常常见的模式。如果您不希望每个用户都有很多邀请,那么您也可以在users表中有一个包含关联meetup ID数组的邀请字段。再次感谢Daniel,我不希望对特定用户有很多邀请。所有用户每月都会收到一次随机邀请,让他们见面。我计划可能启动两个表:一个具有
    meetups
    数组属性的
    users
    表,以及一个具有
    users
    数组属性的
    meetups
    表。我对此不是很有信心,但似乎我可能不需要
    邀请
    透视表。