【问题标题】:Dynamodb partition key strategy - multiple ownersDynamodb 分区键策略 - 多个所有者
【发布时间】:2019-06-22 00:03:49
【问题描述】:

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

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

根据我从文档中了解到的情况,要“查询”一个项目,我只能使用查询表达式中的键。此外,良好的分区键是具有高基数并促进读/写吞吐量活动均匀分布的分区键。我正在考虑创建一个Meetup 表,但我在选择分区键时遇到了困难,特别是当聚会由 2 个用户“拥有”并且在聚会发生后事件项将过期(非活动)所以我不是确保使用meetupID 是个好主意。但我正在考虑这样使用两个表:

邀请表:

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

聚会桌:

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

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

【问题讨论】:

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


    【解决方案1】:

    如果每个用户的聚会次数服从正态分布,您应该能够安全地拥有这样的东西:

    • users 表 :: 分区键 = user_id(一些 UUID)
    • meetups 表 :: 分区键 = meetup_id(一些 UUID)
    • meetup_invites 表:分区键 = user_id,排序键 = meetup_id

    在大规模情况下,上述情况只会成为问题,例如,如果您有一些用户拥有 100 万次邀请,而每个用户的平均邀请非常少。

    【讨论】:

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

    您可以使用此架构。

    | 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. 获取所有聚会 User1234 在 10 天内被邀请参加 Select * where id=User1234 and SortKey startswith meetup filter eventDate < today +10

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

    4. 获取所有受邀者参加 meet1234 Select * where MeetupId=meet1234 and SortKeystarts with User From Table GSI1

    5. 获取有关活动 meet1234 Select * where MeetupId=meet1234 From Table GSI1的所有详细信息

    未解决的用例:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      • 2019-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多