0

我有一组 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'  
4

1 回答 1

0

根据您的描述,一种可能的设计是使用 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:.."         |  ...        |

这个问题没有一个单一的答案。根据您拥有的数据以及您访问数据的方式设计架构。

于 2019-02-13T18:02:51.817 回答