【问题标题】:Modeling data in NoSQL DynamoDB在 NoSQL DynamoDB 中建模数据
【发布时间】:2016-10-12 07:16:25
【问题描述】:

我正在尝试弄清楚如何在 AWS DynamoDB 表中对以下数据进行建模。

我有很多物联网设备,每个设备每隔几秒发送一次遥测数据。

属性

  1. device_id
  2. 时间戳
  3. 恶意软件名称
  4. 公司名称
  5. action_performed(两个可能的值)

查询

  1. 显示上周发生的所有事件。
  2. 显示特定 device_id 的所有事件。
  3. 显示所有带有“unable_to_remove”操作的事件。
  4. 显示与特定恶意软件相关的所有事件。
  5. 显示与特定公司相关的所有事件。

想法

  1. 我知道我可以为每个属性添加 GSI,但我只想在别无选择的情况下使用 GSI,因为这会花费我更多的钱。

  2. 什么是主主键(分区键:排序键)?

请分享你的想法,我更关心它们而不是完美的答案,因为我正在努力学习如何思考和考虑什么,而不是为特定问题提供答案。

非常感谢!

【问题讨论】:

标签: amazon-web-services indexing database-design amazon-dynamodb nosql


【解决方案1】:

如果您绝对需要提到的可查询模式,那么您别无选择,只能为每个模式创建 GSI。这也有一些注意事项:

  • 对于查询 #1,您的 GSI 将是 incident_date(或其他)作为分区键,device_id 作为排序键。根据您的访问模式,这可能会导致 DynamoDB 中的热分区。
  • 每张表有 5 个 GSI 的限制,您将立即用完。如果您将来需要支持另一种查询,您会怎么做?

在评估在特定情况下使用 NoSQL 的利弊时,需要同时考虑读取和写入访问模式。那么,您应该问的问题是,为什么选择 DynamoDB?

例如,您真的需要实时查询吗?如果没有,您可以使用 DynamoDB 作为主数据库,并定期将数据(使用 AWS Lambda 或 Kinesis Firehose)同步到 EMR 或 Redshift,以便以后进行批处理。

编辑:建议的主键:

  • device_id 作为分区键,incident_date 作为排序键,如果您知道对于给定的device_id,不会有 2 个或更多事件同时发生。
  • 如果上述方法不起作用,则将incident_id 作为分区键,将incident_date 作为排序键。

【讨论】:

  • 你的主键是什么?
  • 所以@ketan,您会建议将它们用作主键和排序键并使用另外 4 个 GSI?
  • 是的。如果您需要这 5 种实​​时查询模式,您别无选择
  • 如何在您的建模中检索上周的所有事件?顺便说一句,我没有incident_id
猜你喜欢
  • 2016-11-07
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
相关资源
最近更新 更多