我正试图围绕DynamoDB的扫描和查询,以及如何构建表格。
假设我有水桶和弹珠,每个水桶都可以包含许多弹珠。在传统的关系数据库中,我可能会这样设置:
id name
---------------
B1 Blue Bucket
B2 Red Bucket
id name bucketId lots more fields...
------------------------------------------------
M1 Deep Swirls B1
M2 Fire Red B1
M3 Obsidian B2
据我了解,如果我在DynamoDB中以这种方式构建我的数据,那么RCU可能会花费很多,因为我必须进行扫描。如果我想要获取存储桶B1中的所有弹珠,我必须扫描Marbles
其中bucketId = B1
,其中包含完整的弹珠列表,然后移除那些不匹配的弹珠(如果我正确理解DynamoDB的内部工作原理)。
听起来效率不高或性价比高。我该如何构建这些数据?
重要提示:大理石应该能够独立存在,即无桶的一部分。 (bucketId = null
)
答案 0 :(得分:0)
您需要两个表来跟踪此情况。铲斗为bucket
,大理石为marble
。 bucket
将包含marbles
的列表,其中包含一些基本信息(名称,颜色等),您可以使用这些信息显示集合的快速列表。确保包含marble
的ID。然后在实际的marble
表示中,放置大理石的所有信息,加上一个bucket
对象,该对象将链接回它的指定存储桶。它看起来像这样:
大理石
{
"id": 1,
"name": "Deep Swirls",
"color": "Red",
"complexProp": {
...
},
"bucket": {
"name": "Blue Bucket",
"id": 1
"
}
铲斗
{
"id": 1,
"name": "Blue Bucket",
"marbles": [
{
"id": 1,
"name": "Deep Swirls",
"color": "Red"
},
{
"id": 2,
"name": "Fire Red",
"color": "Red"
}
]
}
这种方法的缺点是,如果有任何变化(如果大理石改变颜色会令人印象深刻),如果两个地方都有变化的数据,你需要在两个地方更新大理石。如果您更改了它所在的存储桶,您还需要在两个位置更改数据。如果您不关心快速发现哪个bucket
表示,则可以省略marble
属性。 {1}}给定的bucket
位于。