在亚马逊dynamodb中设计表格

use*_*454 9 database database-design nosql amazon-dynamodb

我是DynamoDB的新手,我有一大堆:我的表应该是什么样子.

我已经阅读了这里的帖子:(建议谁还没有阅读) http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/BestPractices.html

现在我有一些困境,我认为每个开始使用DynamoDB的人都会有.

首先,我的表:学生,团队,项目

学生: 身份,年龄......

团队:id,student-1-id,student-2-id,当前项目,prev-project,last-updated-on

PROJECTS:id,team-id,问题列表,list student1answers,list student2answers

一些评论:

  1. 如你所见,我不使用范围键.我需要吗?.
  2. 每个答案都是json(问题数,文字数,插入日期)
  3. 每个学生都可以在多个团队中.

我的困境:

  1. 我想让特定学生的所有团队在特定日期之后更新.

现在我使用2次扫描操作:一次搜索student1,第二次搜索student2.

       **Is there a better way ?**
Run Code Online (Sandbox Code Playgroud)

我考虑过添加一个新表:user-Battles:student-id,team-id所以我可以查询特定学生的团队,然后batch_get_item所有团队,但最后更新的是什么?我怎样才能在batch_get_item里面查询?

  1. 当项目结束时我不再使用它了.怎么处理旧物品?删除?把它们移到另一张桌子?

  2. 在项目表中,可以更新的属性是答案属性,因此我认为将它们移动到另一个表以进行演出.

如果它只更新两次,我真的需要移动它们吗?(当student1发送答案并且student2发送答案时 - 然后项目已经过时)

*如果我为答案创建一个新表,我将不必以JSON格式存储它们

你会如何设计表格?请告诉我.

yad*_*taf 3

好问题,有很多细节:)

如果我只有一个建议,那就是:

请记住,使用 NoSQL 不仅可以,而且很正常,甚至建议对数据进行非规范化。

话虽如此,对于你的“困境”来说,你的建议还是不错的。您应该将日期反规范化为range_key. 一种方法是添加一个像这样的表:

  • hash_key: 学生
  • range_key: 日期
  • team: 团队 ID

但这仍然并不完美,因为表格会继续增长。每次更新都会插入一个新对象。事实上,编辑键是不可能的。您必须编写自己的清洁代码。

在DynamoDB中,您不必担心“旧”项目(扫描除外)导致的性能下降,这是DynamoDB的主要优势。尽管如此,这始终是保持数据干净但保持一致的好习惯。如果您开始移动过期的项目,请移动所有项目,否则您最终将不知道数据在哪里。

最后建议:您确定“ids”是描述您的对象的最佳选择吗?大多数时候,名称、日期或任何唯一属性都是更好的密钥。