【问题标题】:DynamoDB Maps vs Lists for storing IoT Data用于存储 IoT 数据的 DynamoDB 地图与列表
【发布时间】:2021-03-01 21:28:39
【问题描述】:

我正在尝试存储来自可以连接各种传感器的数据记录器的 IoT 数据,下面是一个示例。每个记录器每 20 秒发送一条 MQTT 消息

"state": {
    "reported": {
      "batv": 5105,
      "ts": 1614595073655,
      "temp": 20,
      "humidity": 50
    }
  }

我的问题是关于将这些 MQTT 消息/读数有效地存储在 DynamoDB 表中,我是否应该将读数存储在包含这样的地图的地图中。 (注意这是我目前正在做的事情,当读数变大时,在 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 或存储 IoT 数据的人有什么建议吗?非常感谢

(顺便说一句,数据流是)

数据记录器 -> AWS IoT -> AWS Lambda -> DynamoDB

【问题讨论】:

    标签: database amazon-web-services amazon-dynamodb iot aws-iot


    【解决方案1】:

    DDB List 操作可能是一个限制因素,当您遇到尝试可靠地修改列表中保存的属性等用例时

    示例 - 列表

    在一个列表中,要将temp to 30 设置为ts = 1614594313407,您需要从DDB 获取列表,搜索/遍历每个对象直到ts = 1614594313407set temp to 30,然后将整个列表写回DDB。不是很交易

    [
        {
          "batv": 5105,
          "ts": 1614594313407,
          "temp": 20,
          "humidity": 50
        },
         {
          "batv": 5105,
          "ts": 1614594313555,
          "temp": 20,
          "humidity": 50
        }
      ]
    

    示例 - 地图

    使用 Map,您可以在一次更新 "SET readings.#ts_id.temp = :temp_val" 中可靠地更新 temp to 30 其中 ts = ts1614592810955 的值

    {
      "readings": {
        "ts1614592810955": {
          "battery_level": 5089,
          "temp": 20,
          "humidity": 50
        },
        "ts1614593692395": {
          "battery_level": 5093,
          "temp": 20,
          "humidity": 50
        }
      },
      "serial_number": "TDG_logger_thing"
    }
    

    【讨论】:

      【解决方案2】:

      我不会使用地图或列表来拆分这些读数并将它们存储在单独的项目中。使用与设备 ID 相同的分区键,结合每次读取的排序键,还包括时间戳。这样,您可以更轻松地查询所有临时数据,并使用排序键中的时间戳,您可以使用查询仅获取特定时期的测量值。

      所以主键是: PK[device id] - SK[Measurement type - Data time]:(每次测量的属性)

      之后,您可以存储每次测量所需的任何数据。并且您可以快速更新和检索单个测量值,希望对您有所帮助。

      【讨论】:

      • 所以不是为每个记录器设置一个项目,而是建议为每个读数设置一个项目?
      • 是的,不要害怕 DynamoDB 中的很多项目你不能让它慢下来。主要是把它存储在这样一种方式,你以后可以通过查询很容易地找到它,查询是直接获取一个项目后最快的方式。顺便说一句,在你开始之前有一个好的设计真的很值得。如果您想了解更多信息,我强烈推荐 Alex DeBrie 的 DynamoDB 书籍,以获得一些关于 dynamodb 设计的非常好的实用建议。
      猜你喜欢
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 2023-02-09
      • 2023-03-24
      • 2020-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多