在 DynamoDB 中创建统计信息 table 的推荐方法是什么?
What is the recommended way to create a statistics table in DynamoDB?
我想在 DynamoDB 中存储以下数据属性作为统计信息:
deviceId, property, value, timestamp
value
属性变化相当频繁,每次变化都需要保存在新的item中。
检索时,我想将上述table查询为:
- 获取给定
deviceId
和 property
的所有 value
和 timestamp
。
- 获取给定
deviceId
的所有 property
、value
和 timestamp
我需要经常检索这些统计数据。
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 的经验。但同样,这是一个新产品,我没有太多经验,只是指出它存在。
我想在 DynamoDB 中存储以下数据属性作为统计信息:
deviceId, property, value, timestamp
value
属性变化相当频繁,每次变化都需要保存在新的item中。
检索时,我想将上述table查询为:
- 获取给定
deviceId
和property
的所有value
和timestamp
。 - 获取给定
deviceId
的所有
property
、value
和 timestamp
我需要经常检索这些统计数据。
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 的经验。但同样,这是一个新产品,我没有太多经验,只是指出它存在。