database - 在 Amazon dynamodb 中设计表

标签 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、current-project、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 ?**

我想过加一张新表:user-Battles: student-id, team-id 所以我可以查询特定学生的团队,然后 batch_get_item 所有团队 但是上次更新是怎么回事?我怎样才能在 batch_get_item 中通过这个进行查询?

  1. 当一个项目结束时,我就不再使用它了。旧元素怎么办? 删除 ?将它们移到另一个表?

  2. 在project表中,可以更新的属性是answers属性 所以我想把他们搬到另一张 table 上表演。

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

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

您将如何设计表格?请告诉我。

最佳答案

有很多细节的好问题:)

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

keep in mind that, with NoSQL, it is not only OK but normal, even recommended to de-normalize your data.

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

  • hash_key: 学生
  • range_key: 日期
  • 团队:team_id

但是,这仍然不是完美的,因为表格会继续增长。每次更新插入一个新对象。实际上,无法编辑 key 。您将必须执行自己的清洁代码。

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

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

关于database - 在 Amazon dynamodb 中设计表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12751660/

相关文章:

sql-server - SET-ting ALLOW_SNAPSHOT_ISOLATION ON 的含义是什么?

mysql - 如何在 laravel 中最大化行大小 | mysql

'tags-heavy' CRM 应用程序的 SQL 与 NoSQL 数据库

nosql - 嵌套集合中的 Cosmos Db DateTime 查询

mysql - 数据建模/标准化问题

java - 从MySql数据库到嵌入式数据库?

php - 将值从数据库写入另一个表

mysql - 酒店预订系统的数据库设计

mysql - 如何为多个用户设计数据库表(MySQL)?

mysql - 如何将 "top 10"列表从 SQL 转换为 NoSQL