0

我目前正在设计一个 DynamoDB 模式,我不知道我是否走在正确的轨道上。

我需要将以下数据存储到 DynamoDB 表中:

  • 设备ID(编号)
  • deviceLogType(字符串)
  • timestamp (number) // 时间戳的单位是 utc 秒
  • 其他杂项属性

此 DynamoDB 表的主要查询是通过 deviceID 和 deviceLogType 在一个时间范围内查询数据。是

分区键deviceLogType_deviceID

排序键timestamp

我的问题是:

  • 上面的设计正确吗?
  • 使用复合键作为分区键来表示层次关系是否属于最佳实践?
4

2 回答 2

0
deviceLogType_deviceID (hash key)
timestamp (sort key)
deviceID (I would keep this separate for future query possibilities)
deviceLogType (I would keep this separate for future query possibilities)
other misc attributes

Using this schema, you can use your current query and will open future possibilities for querying only by deviceId or deviceLogType (only add an index).

Composite key is indeed a good practice (best to have a separator which will not appear in both values), but not sure about which inheritance you mean.

But for example if we have AndroidDeviceLogType > DeviceLogType, best practise would be to store that value in deviceLogType in a serialised form (JSON in Base64 for example, or just plain JSON...).

于 2019-09-30T18:49:15.463 回答
0

您的方法将适用于您描述的用例。

使用复合分区键是可以接受的。您不能使用分区键上的部分匹配来执行任何分层查询,但从历史上看,它具有帮助防止热分区的额外好处。热分区现在已成为过去,因此您无需再担心这一点。

我只看到一个可能的问题。如果您有多个具有相同deviceLogType_deviceID和的日志条目timestamp,则最后一个将覆盖具有相同时间戳的所有先前条目。为避免这种情况,您可以将时间戳存储为ISO 8601字符串,并将 UUID 附加到时间戳的末尾以防止主键冲突。

于 2019-10-01T00:21:59.397 回答