为了以下目的,在DynamoDB上构建表的最佳方法是什么?
如果我制作一个电影评论应用,我需要一个电影页面,其中包含该电影和用户帐户页面的评论,其中包含用户在应用上写的所有评论。
电影表
-------------------------
| movie_id | movie_name |
-------------------------
评论表
---------------------------------------------------
| review_id | movie_id | user_id | review_content |
---------------------------------------------------
DynamoDB有意义吗?所以我可以查询
电影页面上的movie_id
和movie_name
以及review_content
列表movie_id
然后
在用户帐户页面上review_content
查询user_id
。
提前谢谢。
答案 0 :(得分:2)
与RDBMS一样,您不需要对数据进行规范化,即不要创建两个不同的表。 NoSQL数据库的重点是如果可能的话,将用例的大部分必需数据保存在一个表中。
假设上述数据不会超过项目的 400 KB最大限制(即DynamoDB中项目的最大限制),您可以将所有数据保存在一个表中。
建议的数据模型: -
创建一个名为 Movie
的表格,其中包含所有必需的信息。您的用例的好处是您知道分区键,即movie_id
。您可以使用DynamoDB中提供的查询API 按movie_id
获取数据,这将为您提供已为user_ids
撰写评论评论的所有movie_id
人。
在这种方法中,您不能将评论数据与另一个表格分开,这将节省您的成本并提供更好的性能。
电影表:
movie_id ==>分区键
user_id ==>排序键
MOVIE_NAME
REVIEW_ID
review_content
注意: - 强>
我不理解review_id
的目的,除非您有一个单独的用例来通过review_id
获取详细信息。
编辑 - Json格式: -
user_id
是一个SORT键。它应该在reviews
之外。
{
"movie_id" : 1,
"user_id" : "1"
"movie_name" "Name of movie",
"review_comments" : ["A great movie", "I love it"]
}
分区和排序键: -
对于复合主键(分区键和排序键),您必须 按顺序提供两个元素:第一个元素必须 KeyType为HASH,第二个元素的KeyType必须为 范围。
分区键和排序键 - 由两个组成的复合主键 属性。第一个属性是分区键,第二个属性 attribute是排序键。 DynamoDB使用分区键值作为 输入到内部哈希函数;哈希函数的输出 确定将存储项目的分区。所有物品 相同的分区键按排序顺序存储在一起 核心价值。两个项目可能具有相同的分区键 值,但这两个项必须具有不同的排序键值。
在上面的模型中,我们有唯一标识项目的哈希和排序键(即RDBMS中的记录)。哈希键为movie_id
,排序键为user_id
。一个movie_id可以有多个user_id,它在DynamoDB表中形成多个项目(即RDBMS术语,称为记录)。
示例: - 强>
movie id 1, user id 1, movie name 1, review comments 1
movie id 1, user id 2, movie name 1, review comments 2
movie id 2, user id 3, movie name 2, review comments 1
如前所述,review_comments
是Dynamodb List或Set数据类型,可以有多个值。