gpt4 book ai didi

database - DynamoDB - 设计一对多关系

转载 作者:搜寻专家 更新时间:2023-10-30 22:24:58 25 4
gpt4 key购买 nike

我是 DynamoDB 技术的新手,但不是 NoSQL(我已经使用 Firebase 完成了一些项目)。

读到 DynamoDB 最佳实践是每个应用程序一个表 我一直很难设计我的 1 对 N 关系。

我有这个实体(伪json):

{
machineId: 'HASH_ID'
machineConfig: /* a lot of fields */
}

一个 machineConfig对于每台机器来说都是独一无二的,并且很少可以更改,并且只能由管理人员更改(这里没有一致性问题)。

问题是我必须管理来自每台机器传感器的数据日志。日志描述为:
{
machineId: 'HASH_ID',
sensorsData: [
/* Huge list of: */
{ timestamp: ..., data: /* lot of fields */ },
...
]
}

我想保留我的 machineConfig在一个地方。日志列表不能插入机器实体,因为它是随时间推移而获取的连续数据流。

此外,我不明白哪个可能是复合键,分区键显然是 machineId ,但是顺序键呢?

考虑到数据的潜在维度,如何设计这种关系?

最佳答案

你可以用 1 张 table 做到这一点。主键可以是 (machineId, sortKey)在哪里 machineId是分区键和 sortKey是一个字符串属性,将用于覆盖这两种情况。你可能会想出一个更好的名字。

存储machineConfig您将插入一个带有主键 (machineId, "CONFIG") 的项目. sortKey属性将具有常量值 CONFIG .

存储sensorsData您可以使用 timestamp作为 sortKey值(value)。您将为每条传感器数据插入一个新项目。您将存储 timestamp作为字符串(作为纪元以来的时间,ISO8601 等)

然后要查询有关机器的所有内容,您将运行 Dynamo 查询,仅指定 machineId分区键 - 这将返回许多项目,包括 machineConfig和传感器数据。

只查询 machineConfig您将运行指定 machineId 的 Dynamo 查询分区键和常量 CONFIG作为 sortKey值(value)

要查询传感器数据,您可以为 sortKey 指定准确的时间戳或时间戳范围。 .如果您需要通过其他值查询传感器数据,那么这种设计可能无法正常工作。

编辑以回答后续问题:

您必须使用过滤器进行扫描才能返回所有机器及其 machineId。和 machineConfig .如果您最终插入了大量传感器数据,那么这将是一项非常昂贵的操作,因为 Dynamo 将查看表中的每个项目。如果你需要这样做,你有几个选择。

如果没有很多机器,您可以插入带有主键的项目,如 ("MACHINES", "ALL")以及所有 machineIds 的列表.您将查询该键以获取 machineIds 的列表,然后你会做一堆查询(或批量获取)来检索所有相关的machineConfigs .但是,由于 Dynamo 项目的最大大小为 400KB,因此您可能无法全部容纳它们。

如果有太多机器无法容纳一个项目,您可以稍微改变上述方法并使用 ("MACHINES", $machineIdSubstring)作为主键并存储 machineIds 的 block 在每个排序键下。例如,所有 machineIds以 0 开头的进入 ("MACHINES", "0") .然后您将按每个主键 0-9 进行查询,构建所有 machineIds 的列表并如上查询每台机器。

或者,您不必将所有内容都放在一张表中 - 它只是适用于许多用例的指南。如果有太多机器无法容纳小于 400 KB,但没有数万台,并且您不想一直查询所有机器,则可以有一个单独的表 machineIdmachineConfig必要时进行扫描。

关于database - DynamoDB - 设计一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54323410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com