设计此 dynamoDB 模式的合理方法?

A reasonable way to design this dynamoDB schema?

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

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 ...|
...

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

当前配置: person_id_and_gender 是这个 table 的主键,它没有排序键。

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

请注意:

  1. 所有栏目names/attributes已组成。它们仅作为示例(尽管可能是不好的示例)。

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

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

更新: 当前的查询模式只是获取 person_id_and_gender 的电影评分列表,换句话说,一个人的所有评分。

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

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

正如其他人所指出的,有关 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

这使用通用键名称(PKSK)和复合排序键值来建模 many-to-many relationships in a 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

如果您的用例需要按电影查询,您可以在交换键的地方添加一个 indexGSI1PK 是电影,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