设计此 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 的主键,它没有排序键。
有没有更好的方法来重新设计这个模式,这样即使我们有越来越多的评级,我们也不会爆炸条目?
请注意:
所有栏目names/attributes已组成。它们仅作为示例(尽管可能是不好的示例)。
在我们的用例中,我们可能有更多的“性别”(男性、女性、非二元性别等等...)
在我们的用例中,我们假设一个人可能有不同的性别,换句话说,我们可能会看到 id_2:male
和 id_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
这使用通用键名称(PK
和 SK
)和复合排序键值来建模 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
如果您的用例需要按电影查询,您可以在交换键的地方添加一个 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
目前我的 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 的主键,它没有排序键。
有没有更好的方法来重新设计这个模式,这样即使我们有越来越多的评级,我们也不会爆炸条目?
请注意:
所有栏目names/attributes已组成。它们仅作为示例(尽管可能是不好的示例)。
在我们的用例中,我们可能有更多的“性别”(男性、女性、非二元性别等等...)
在我们的用例中,我们假设一个人可能有不同的性别,换句话说,我们可能会看到
id_2:male
和id_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 |
这使用通用键名称(PK
和 SK
)和复合排序键值来建模 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
如果您的用例需要按电影查询,您可以在交换键的地方添加一个 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