在亚马逊dynamodb中设计表格

时间:2012-10-05 18:02:08

标签: database database-design nosql amazon-dynamodb

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

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

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

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

学生 ID ,年龄......

TEAMS id ,student-1-id,student-2-id,当前项目,prev-project,last-updated-on

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

一些评论:

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

    1. 我想让特定学生的所有团队在特定日期之后更新。
    2. 现在我正在使用2次扫描操作:一次搜索student1,第二次搜索student2。

             **Is there a better way ?**
      

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

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

      2. 在项目表中,可以更新的属性是答案属性 所以我想把它们搬到另一张桌子进行表演。

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

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

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

1 个答案:

答案 0 :(得分:3)

很多细节的好问题:)

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

  

请记住,使用NoSQL,它不仅可以正常,甚至可以推荐对数据进行反规范化。

这就是说,对你来说,“dilemna”,你的建议非常好。您应该将日期标准化为range_key。一种方法是添加这样的表:

  • hash_key:学生
  • range_key:date
  • team:team_id

但是,这仍然不完美,因为桌子会继续增长。每次更新都插入一个新对象。实际上,编辑密钥是不可能的。你必须自己做清洁代码。

在DynamoDB中,您不必担心“旧”项目导致的性能下降(扫描除外),这是DynamoDB的主要优势。尽管如此,保持数据清洁但始终如一仍是一种很好的做法。如果你开始移动已过期的项目,那么移动所有,否则你最终不知道你的数据在哪里。

最后的建议:你确定“ids”是描述你的对象最好的东西吗?大多数情况下,名称,日期或任何唯一属性都是更好的关键。