最好是通过UserId有一个巨型表,并将所有内容存储在DynamoDB中,还是创建一个包含大量表的超常规化模式?
假设我有像Flickr这样的图像共享网站。我想要:
users (userId, email, passwords, names)
images (imageId, userId, filename, size)
comments (commentId, userId, imageId, textOfComment)
以上是一种非常规范化的做事方式(我理解)并且将是3个表格。我会根据我的需要来查询它们。
如果我有一个userId并且想要获得他们的所有图像,那就说:
query = select * from images where userId = @userId
但DynamoDB似乎没有这种方式,因为它通过键分配数据:
userId,imageId,commentsId将是表格的键和分区
我如何获得特定用户的所有图像?我只有一张大桌子(看起来好像错了)?或者我应该将imageId作为用户表中的一个集合(如果一个用户拥有1,000,000个图像,可能会变大)?或者有更好的方法吗?
答案 0 :(得分:0)
我认为这可以很好地运作。 DynamoDB(或一般NoSQL)的一般经验法则是:storage = cheap和CPU =昂贵(这也反映在定价中)。
您可以复制数据:在评论中,您不仅可以指定image_id,还可以指定所有图像属性。这比2个查询更便宜,更有效(前提是没有数百个'列')。
您的查询可以正常工作,只需正确设置索引(在图像上设置全局二级索引,其中userId为hash,imageId为范围,然后您可以使用该索引单独查询userId。)