amazon-web-services - 在 dynamodb 单表中处理更多的多对多关系
问题描述
我正在为一个研究所设计一个 dynamodb 表。它有机构、学生、科目和教师等实体。他们之间的关系是这样的。
- 学院 - 学生多对多
- 学院 - 教师多对多
- 研究所 - 多对多科目
我选择 Institute id作为PK和location作为SK。但是在这种情况下有更多的多对多关系。那么在 was dynamodb 中如何处理这种情况呢?
提前致谢。
解决方案
DynamoDB 是一个 noSQL 数据库,您应该在其中尽可能地对数据进行非规范化和复制。您正在思考 SQL 并试图规范化您的数据,您需要转换您的思维方式。
为每个学院、学生、教师和学科创建一个项目。在机构内部创建students
地图或列表(我更喜欢以 ID 作为键的地图),institutes
在学生内部创建地图或列表。这些地图或列表是由您的原始项目的副本制成的:
inst-0 | USA | Institute name | { stud-0: { name: John }, studo-1: { name: Matt } }
-----------------------------------------------------------------------------------------------------------------
stud-0 | John | { inst-0: { name: Institute name } } |
-----------------------------------------------------------------------------------------------------------------
stud-1 | Matt | { inst-0: { name: Institute name } } |
这里的缺点是您需要在原始更改时更新每个副本。但这通常不是问题,除非您的数据更改非常频繁。
如果您复制的数据经常更改,您可以创建一个中间关系项,但是关系数据库可能更适合您的项目。
您还可以为每个学生创建一个项目,并将对这些学生的引用存储到学院项目中。但是在这里,您并没有对数据进行非规范化,但是如果您的数据经常更改或每个学院都有大量学生,这可能是一个可行的解决方案。
推荐阅读
- laravel - 将 Laravel 表绑定到其他数据库连接
- assembly - FASM align 32 部分对齐不够
- text - 如何在颤动中显示文本以使 RTL 语言右对齐而 LTR 左对齐?
- debugging - 为什么我的 admob 广告没有在最终版本的 apk(签名)上显示,但在调试 apk(未签名)上完美显示?
- angular - ng bootstrap typeahead 不适用于角度反应形式
- python - 如何从列中的每个组中选择前 100 名?
- r - 使用函数 randomForest 时,分类变量的类型应该是什么?
- swift - 使用 NSKeyedArchiver 保存不可编码的 Swift 字典
- c++ - 查找给定序列是单调的还是严格单调的
- python - Python 自动化,关注 Chrome 浏览器,获取 URL