amazon-dynamodb - 如何为给定的一组关系表设计 dynamodb 表
问题描述
我有一组 3 个关系表。我想将它们转换为 dynamodb 中的单个表。每个表都托管不同 tranType 的数据。每个表都有 Id, tranDate 作为它的键。对于给定的 Id、tranDate 和 tranType,有多个行。
我的访问模式是获取给定 Id 和 TranDate 的数据 - 这将为我获取所有 tranTypes 的数据。
对于给定的 Id、tranDate,每个表中的行在 400KB 以内,但如果我在 3 个表中添加给定 Id 和 tranDate 的行,它将超过 400KB。
Definitions
Table1
Id, tranDate,tranType,col1,col2,col3,col4
Table2
Id, tranDate,tranType,col1,col2,col3,col4,col5
Table3
Id, tranDate,tranType,col1,col2
Table1 (Sample Data)
1, 2018-12-01,'DETAIL',12,13,14,'A'
1, 2018-12-01,'DETAIL',15,23,11,'B'
1, 2018-12-01,'DETAIL',17,33,24,'C'
1, 2018-12-01,'DETAIL',19,43,14,'D'
2, 2018-12-01,'DETAIL',11,13,14,'A1'
2, 2018-12-01,'DETAIL',12,23,11,'B1'
1, 2018-11-01,'DETAIL',42,13,14,'X'
1, 2018-11-01,'DETAIL',45,23,11,'Y'
1, 2018-11-01,'DETAIL',47,33,24,'Z'
Table2 (Sample Data)
1, 2018-12-01,'SUMMARY',12,13,14,'A','S'
1, 2018-12-01,'SUMMARY',15,23,11,'B','B1'
2, 2018-12-01,'SUMMARY',17,33,24,'C','D1'
2, 2018-12-01,'SUMMARY',22,43,14,'D','D2'
2, 2018-12-01,'SUMMARY',33,13,14,'A1' ,'D3'
Table3 (Sample Data)
1, 2018-12-01,'GEO',11,'MI'
1, 2018-12-01,'GEO',12,'NY'
1, 2018-12-01,'GEO',11,'AL'
2, 2018-12-01,'GEO',14,'DE'
2, 2018-12-01,'GEO',15,'PA'
给定 Id=1,tranDate='2018-12-01' -- 预期结果
1, 2018-12-01,'DETAIL',12,13,14,'A'
1, 2018-12-01,'DETAIL',15,23,11,'B'
1, 2018-12-01,'DETAIL',17,33,24,'C'
1, 2018-12-01,'DETAIL',19,43,14,'D'
1, 2018-12-01,'SUMMARY',12,13,14,'A','S'
1, 2018-12-01,'SUMMARY',15,23,11,'B','B1'
1, 2018-12-01,'GEO',11,'MI'
1, 2018-12-01,'GEO',12,'NY'
1, 2018-12-01,'GEO',11,'AL'
解决方案
根据您的描述,一种可能的设计是使用 id + date 的串联作为分区键,并使用事务类型作为排序键,可能将排序键与其他 id 之一组合。
因此,您的表格可能如下所示:
PK | TranType | data
----------------+-------------------+------------------------------------------
"1:2018-12-01" | "DETAIL" | ["12,13,14,A", "15,23,11,B",...]
"1:2018-12-01" | "SUMMARY" | ["12,13,14,A,S", "15,23,11,B,B1"]
"1:2018-12-01" | "GEO" | ["11,MI", "12,NY", "11,AL"]
"2:2018-12-01" | "DETAIL" | [...]
"2:2018-12-01" | "SUMMARY" | [...]
"2:2018-12-01" | "GEO" | [...]
假设数据有效负载不是太大,这将起作用。
另一种可能性是将数据进一步分解为离散属性,并为排序键创建一个复合列,由事务类型前缀和数据中的一个 id 组成,或者只是一个数字索引(这实际上取决于那些您示例中的其他列的真正含义)。
一个示例,假设col1
对于详细信息和摘要是唯一的,可能如下所示:
PK | TTID | states | c2 | c3 | c4 | c5 |
----------------+-------------------+-------------+----+----+-----+----+--
"1:2018-12-01" | "DETAIL:12" | | 13 | 14 | 'A'
"1:2018-12-01" | "DETAIL:15" | | 23 | 11 | 'B'
"1:2018-12-01" | "DETAIL:17" | | 33 | 24 | 'C'
"1:2018-12-01" | "DETAIL:19" | | 43 | 14 | 'D'
"1:2018-12-01" | "SUMMARY:12" | | 13 | 14 | 'A' | 'S'
"1:2018-12-01" | "SUMMARY:15" | | 23 | 11 | 'B' | 'B1'
"1:2018-12-01" | "GEO:11" | ["MI","AL"] |
"1:2018-12-01" | "GEO:12" | ["NY"] |
"2:2018-12-01" | "DETAIL:11" | | 13 |14 | A1
"2:2018-12-01" | "DETAIL:.." | | ...
"2:2018-12-01" | "SUMMARY:17" | | ...
"2:2018-12-01" | "SUMMARY:.." | | ...
"2:2018-12-01" | "GEO:.." | ... |
这个问题没有一个单一的答案。根据您拥有的数据以及您访问数据的方式设计架构。
推荐阅读
- reactjs - 无法从 Link 接收道具
- javascript - 如何在 Javascript 中设置表格单元格的背景图像?
- c# - 在 WCF 客户端使用 DTO 的最佳方式
- c - 在 malloc 中,为什么要使用 brk 呢?为什么不直接使用 mmap?
- python - 带有 IPv6 的 ParallelSSHClient()
- javascript - 为基于 flex 框的进度条设置动画时出现一个奇怪的故障
- mysql-workbench - 在 ubuntu 19.04 上安装 mysql-workbench 的问题
- javascript - 使用 vue.js 对列表进行排序
- python - 如何基于一对一(三个表)创建一对多关系?
- dart - pubspec.yaml 中的配置标志如何工作?