【问题标题】:A reasonable way to design this dynamoDB schema?设计此 dynamoDB 模式的合理方法?
【发布时间】:2022-01-01 04:03:47
【问题描述】:

我的 DynamoDB 表中目前有以下数据:

person_id_and_gender | ttl(timestamp) | person_movie_rate                                             |
-------------------------------------------------------------------------------------------------------
id_1:male            | 123456789      | amazing_spider_man:0.8, iron_man:0.674, dr_strange:0.32, ...  |
id_9:non-binary      | 123000089      | batman:0.9, iron_man:0.874, terminator:0.55, lala_land:0.5 ...|
...

如您所见,此表试图将一个人与其/她/他们的评分之间的关​​系保存到不同电影的列表中。随着新电影数量的迅速增加,条目大小限制(400k)已经达到,因此我们必须切断一些评分以适应一个人的条目。

当前配置:person_id_and_gender 是该表的主键,它没有排序键。

有没有更好的方法来重新设计这个架构,这样即使我们有越来越多的评分,我们也不会爆炸条目?

请注意:

  1. 所有列名/属性都是由组成的。它们仅用作示例(尽管可能是不好的示例)。

  2. 在我们的用例中,我们可能有更多的“性别”(男性、女性、非二元等等……)

  3. 在我们的用例中,我们假设一个人可能有不同的性别,换句话说,我们可能会看到 id_2:male 和 id_2:female 出现在同一张表中,我们需要这两个数据点。

更新: 当前的查询模式只是获取person_id_and_gender 的电影评分列表,即单个人的所有评分。

【问题讨论】:

  • 我能想到的一种方法:person_movie_rate 对象可以存储在单独的 S3 存储桶中,并且该对象的链接可以存储在 dynamo db 中。
  • 无论何时设计 NoSQL 架构,您都需要了解您想要服务的访问模式 - 那些是什么?
  • @AmeyaS 谢谢,这就是我尝试的方法:我将评级列表保存为 csv 文件并将其上传到 s3,但它导致上传作业经常超时。我花了大约 30 分钟使用 32 个线程上传数据。
  • @Maurice 谢谢我已经更新了这个问题。对于未来的 NoSQL 问题,我会这样做。

标签: amazon-web-services nosql amazon-dynamodb


【解决方案1】:

正如其他人所指出的,关于starting with access patterns 的常见健康警告适用。考虑到这一点,随着评分数量的增加,模式将是:

PK SK rating birthday
id_1:male Attributes 2000-01-10
id_1:male Rating#amazing_spider_man 0.8
id_1:male Rating#iron_man 0.674
id_9:non-binary Rating#iron_man 0.874

这使用通用键名(PK 和 SK)和复合排序键值来模拟 many-to-many relationships 中的 single table design。

PK = "id_1:male" AND SK = "Attributes" # user attributes
PK = "id_1:male" AND SK > "Rating" # all ratings for a user
PK = "id_1:male" AND SK = "Rating#amazing_spider_man" # user rating for a specific movie

如果您的用例需要按电影查询,您可以在交换键的位置添加一个index:GSI1PK 是电影,GSI1SK 是 user_id。

此外,如果将索引的SK中的gender和id倒置,可以按性别查询电影评分。

GSI1PK = "iron_man" AND GSI1SK > "" # iron man ratings for all users
GSI1PK = "iron_man" AND begins_with(GSISK, "non-binary") #  iron man ratings for non-binary users

【讨论】:

  • 我想更新一下,我们最终将数据上传到 s3 并使用 s3 键(目录路径)作为“主键”来获取数据,因为数据太大了——对于一个id 最多可以有 111,000 个评分,将其存储在 ddb 中可能最终会出现许多重复项(例如 id:gender)。
【解决方案2】:

您没有指定查询和更新模式,因此很难给出明确的答案。

猜测您的模式,我的建议是将电影标题作为排序键。然后,您可以 get_item 一个人对一部电影的评分或查询以获取一个人的所有(与性别相关的)评分。没有电影计数限制。如果您愿意,可以保留每个项目的 TTL。

【讨论】:

    猜你喜欢
    • 2018-04-27
    • 2019-03-10
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 2014-05-29
    • 2016-01-21
    • 2018-10-16
    相关资源
    最近更新 更多