在 DynamoDB 中创建统计信息 table 的推荐方法是什么?

What is the recommended way to create a statistics table in DynamoDB?

我想在 DynamoDB 中存储以下数据属性作为统计信息:

deviceId, property, value, timestamp

value属性变化相当频繁,每次变化都需要保存在新的item中。

检索时,我想将上述table查询为:

我需要经常检索这些统计数据。

deviceId 是独一无二的。

我应该如何创建我的架构?需要注意什么? DynamoDB 是这方面的最佳选择吗?

我无法回答 DynamoDB 是否最适合这个。

但是,您可以轻松地设计一个 table 来支持这些查询。您可以使用 deviceId 作为哈希键,使用 属性+timestamp 的 compound key 作为范围键。

要获取 deviceId 的所有 属性、时间戳和值,您的查询关键条件表达式将为

deviceId = :deviceId

要获取 deviceId 和 属性 的所有时间戳和值,它将是

deviceId = :deviceId AND begins_with(prop_timestamp, :propertyName)

如果你真的很关心space,并且你确定你不需要任何其他查询,那么你可以选择只有三个属性,就像这样

 deviceId | prop_timestamp             | value
--------------------------------------------------------
 38b518f5 | speed_2019-03-05T12:15:00Z | 25.3 m/s
 38b518f5 |  temp_2019-03-05T12:30:00Z | 65°F

如果您不能 100% 确定不需要任何其他查询,那么我建议除了作为复合范围键。

DynamoDB 是存储大量您不确定如何存储的数据的不错选择。但当我们谈论真正大的 table 关系数据库时,这并不是最佳选择。

你应该问自己的第一个问题,你知道所有可能的属性吗?或者每个设备可以有 10 多个独特的 属性?

你可以制作两个 table:

  • devices: 具有主分区键设备 ID(数字)和一个属性(不是预定义架构的一部分),它是一个字符串列表表示设备的所有属性。每个查询都必须从查询这个 table 开始,但检索结果的速度应该非常快,存储的代价和跳过扫描查询的能力应该足够了。

  • 值: 具有主分区键,它是设备 ID 和 属性 的串联。和时间戳的排序键。该值应该是一个属性。

您也可以将此连接设为数字,如果您想加快速度并节省存储成本,也可以使用 between 运算符进行查询。

这个解决方案可能比 Matthew 的答案便宜得多,但人类的可读性要差得多,而且可能更难调试和实施。因此,我建议您明智地考虑这两种选择。

此外,最近亚马逊发布了他们的 DocumentDB。我没有使用该产品的经验,但根据我在面向文档的数据库方面的经验,您应该检查它可能是一个不错的选择。一般的想法应该是每个设备的密钥,其中包含属性的子集合(我认为它称为嵌入式或嵌套文档)。比起如果你需要所有的属性你可以查询一个键的所有子集合,如果你需要特定的属性,你可以查询子集合。但同样,我没有使用 DocumentDB 的经验。但同样,这是一个新产品,我没有太多经验,只是指出它存在。