DynamoDB 地图与用于存储物联网数据的列表
DynamoDB Maps vs Lists for storing IoT Data
我正在尝试存储来自数据记录器的物联网数据,这些数据记录器可以连接各种传感器,下面是一个示例。每个记录器每 20 秒发送一条 MQTT 消息
"state": {
"reported": {
"batv": 5105,
"ts": 1614595073655,
"temp": 20,
"humidity": 50
}
}
我的问题是关于将这些 MQTT messages/readings 有效地存储在 DynamoDB table 中,我是否应该将读数存储在包含这样的地图的地图中。 (请注意,这是我目前正在做的事情,当读数变大时,在 AWS DynamoDB 控制台中加载会非常慢。)
{
"readings": {
"ts1614592810955": {
"battery_level": 5089,
"temp": 20,
"humidity": 50
},
"ts1614593692395": {
"battery_level": 5093,
"temp": 20,
"humidity": 50
}
},
"serial_number": "TDG_logger_thing"
}
我倾向于的替代方法是将读数存储在列表中
{
"readings": [
{
"batv": 5105,
"ts": 1614594313407,
"temp": 20,
"humidity": 50
},
{
"batv": 5105,
"ts": 1614594313555,
"temp": 20,
"humidity": 50
}
],
"serial_number": "TDG_Logger_Thing"
}
任何了解 DynamoDB 或存储物联网数据的人有什么建议吗?非常感谢
(BTW 数据流是)
数据记录器 -> AWS IoT -> AWS Lambda -> DynamoDB
DDB List
操作可能是一个限制因素,当你有像尝试可靠地修改列表中保存的属性这样的用例时
示例 - 列表
在列表中,要在 ts = 1614594313407
中设置 temp to 30
,您需要从 DDB 中获取列表,搜索/遍历每个对象直到 ts = 1614594313407
、set temp to 30
,然后将整个 List 写回 DDB。不太具有交易性
[
{
"batv": 5105,
"ts": 1614594313407,
"temp": 20,
"humidity": 50
},
{
"batv": 5105,
"ts": 1614594313555,
"temp": 20,
"humidity": 50
}
]
示例 - 地图
使用地图,您可以更新 temp to 30
的值,其中 ts = ts1614592810955
在单个更新中 "SET readings.#ts_id.temp = :temp_val"
可靠地
{
"readings": {
"ts1614592810955": {
"battery_level": 5089,
"temp": 20,
"humidity": 50
},
"ts1614593692395": {
"battery_level": 5093,
"temp": 20,
"humidity": 50
}
},
"serial_number": "TDG_logger_thing"
}
我不会使用地图或列表来拆分这些读数并将它们存储在单独的项目中。使用与设备 ID 相同的分区键,结合每次读取的排序键,还包括时间戳。这样您就可以更轻松地查询所有临时数据,并且使用排序键中的时间戳,您可以使用查询仅获取特定时期的测量值。
所以主键是:
PK[设备 id] - SK[测量类型 - 数据时间]:(每次测量的属性)
之后,您可以存储每次测量所需的任何数据。您可以快速更新和检索个人测量值,希望对您有所帮助。
我正在尝试存储来自数据记录器的物联网数据,这些数据记录器可以连接各种传感器,下面是一个示例。每个记录器每 20 秒发送一条 MQTT 消息
"state": {
"reported": {
"batv": 5105,
"ts": 1614595073655,
"temp": 20,
"humidity": 50
}
}
我的问题是关于将这些 MQTT messages/readings 有效地存储在 DynamoDB table 中,我是否应该将读数存储在包含这样的地图的地图中。 (请注意,这是我目前正在做的事情,当读数变大时,在 AWS DynamoDB 控制台中加载会非常慢。)
{
"readings": {
"ts1614592810955": {
"battery_level": 5089,
"temp": 20,
"humidity": 50
},
"ts1614593692395": {
"battery_level": 5093,
"temp": 20,
"humidity": 50
}
},
"serial_number": "TDG_logger_thing"
}
我倾向于的替代方法是将读数存储在列表中
{
"readings": [
{
"batv": 5105,
"ts": 1614594313407,
"temp": 20,
"humidity": 50
},
{
"batv": 5105,
"ts": 1614594313555,
"temp": 20,
"humidity": 50
}
],
"serial_number": "TDG_Logger_Thing"
}
任何了解 DynamoDB 或存储物联网数据的人有什么建议吗?非常感谢
(BTW 数据流是)
数据记录器 -> AWS IoT -> AWS Lambda -> DynamoDB
DDB List
操作可能是一个限制因素,当你有像尝试可靠地修改列表中保存的属性这样的用例时
示例 - 列表
在列表中,要在 ts = 1614594313407
中设置 temp to 30
,您需要从 DDB 中获取列表,搜索/遍历每个对象直到 ts = 1614594313407
、set temp to 30
,然后将整个 List 写回 DDB。不太具有交易性
[
{
"batv": 5105,
"ts": 1614594313407,
"temp": 20,
"humidity": 50
},
{
"batv": 5105,
"ts": 1614594313555,
"temp": 20,
"humidity": 50
}
]
示例 - 地图
使用地图,您可以更新 temp to 30
的值,其中 ts = ts1614592810955
在单个更新中 "SET readings.#ts_id.temp = :temp_val"
可靠地
{
"readings": {
"ts1614592810955": {
"battery_level": 5089,
"temp": 20,
"humidity": 50
},
"ts1614593692395": {
"battery_level": 5093,
"temp": 20,
"humidity": 50
}
},
"serial_number": "TDG_logger_thing"
}
我不会使用地图或列表来拆分这些读数并将它们存储在单独的项目中。使用与设备 ID 相同的分区键,结合每次读取的排序键,还包括时间戳。这样您就可以更轻松地查询所有临时数据,并且使用排序键中的时间戳,您可以使用查询仅获取特定时期的测量值。
所以主键是: PK[设备 id] - SK[测量类型 - 数据时间]:(每次测量的属性)
之后,您可以存储每次测量所需的任何数据。您可以快速更新和检索个人测量值,希望对您有所帮助。