构建DynamoDB表与传统关系模型

时间:2018-01-29 17:02:15

标签: database relational-database amazon-dynamodb

我正试图围绕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

1 个答案:

答案 0 :(得分:0)

您需要两个表来跟踪此情况。铲斗为bucket,大理石为marblebucket将包含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位于。