Database design Dynamodb分区密钥策略-多所有者
我发现很难理解作为应用程序分区键的最佳属性,因为我是DynamoDB新手。我正在尝试将DynamoDB用于一个简单的应用程序,在这个应用程序中,随机选择成对的用户进行会面并相互介绍。我需要选择适当的表和分区策略,以帮助进行以下查询: 检索已邀请用户参加的会议(简介)。它应该显示一切 会议的详细信息,包括其他受邀用户 根据我在文档中的理解,要“查询”一个项目,我只能使用查询表达式中的键。此外,一个好的分区键是一个具有高基数并在读/写吞吐量活动中促进平等分布的分区键。我想创建一个Database design Dynamodb分区密钥策略-多所有者,database-design,nosql,amazon-dynamodb,database-schema,Database Design,Nosql,Amazon Dynamodb,Database Schema,我发现很难理解作为应用程序分区键的最佳属性,因为我是DynamoDB新手。我正在尝试将DynamoDB用于一个简单的应用程序,在这个应用程序中,随机选择成对的用户进行会面并相互介绍。我需要选择适当的表和分区策略,以帮助进行以下查询: 检索已邀请用户参加的会议(简介)。它应该显示一切 会议的详细信息,包括其他受邀用户 根据我在文档中的理解,要“查询”一个项目,我只能使用查询表达式中的键。此外,一个好的分区键是一个具有高基数并在读/写吞吐量活动中促进平等分布的分区键。我想创建一个Meetup表,但是
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
这将解决如下用例
选择*where id=User1234和SortKey startswith meetup
选择*where id=User1234和SortKey startswith meetup filter eventDate
选择其中id=user1234和SortKey=metadata
从表GSI1中选择*其中MeetupId=meet1234和SortKeyStart with User
从表GSI1中选择*其中MeetupId=meet1234
在NoSql模式中,应该从用例中驱动。感谢您回复我。因此,为了获得所需的结果,我必须对数据库进行两次往返,并执行两个查询。。。对吗?是的-这是DynamoDB的一种非常常见的模式。如果您不希望每个用户都有很多邀请,那么您也可以在users表中有一个包含关联meetup ID数组的邀请字段。再次感谢Daniel,我不希望对特定用户有很多邀请。所有用户每月都会收到一次随机邀请,让他们见面。我计划可能启动两个表:一个具有
meetups
数组属性的users
表,以及一个具有users
数组属性的meetups
表。我对此不是很有信心,但似乎我可能不需要邀请
透视表。