You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DynamoDB单表设计咨询:预计算能耗存储结构与GSI配置

DynamoDB单表设计答疑

背景信息

  • 已完成实体图、访问模式梳理
  • 计划搭建日/月/年度数据计算服务
  • 数据规模:50000台设备 × 每日48个数据点(设备日志每30分钟生成一条)

主要实体

  • Sites:Site ID、Site Name、Location
  • Devices:Device ID、Device Name、设备配置参数
  • Device Log:LogID、Datetime、consumed energy

核心访问模式

  • 获取某站点年度或指定日期范围内的总能耗
  • 获取某站点指定日期范围内的月度能耗(如2023年1月、2月)
  • 获取某站点下所有设备或指定设备的每日能耗

问题与解答

问题1:计划将Site ID作为PK(如Site#1),Device ID作为SK(如DeviceID#100、DeviceID#200等)是否合理?

这个设计有基础合理性,但存在明显局限:

  • 优势:能快速聚合同一站点下的所有设备,契合站点-设备的层级关系。
  • 局限:没法直接承载站点级的预计算聚合数据(这类数据不属于单个设备),也无法高效查询站点总能耗;同时原始设备日志也没法直接挂在这个结构下。
  • 优化建议:PK保留站点维度标识(如Site#1),SK用前缀区分不同类型数据:
    • 站点基础信息:SiteMeta
    • 设备基础信息:Device#100
    • 设备原始日志:DeviceLog#100#2023-10-05T12:30:00
    • 聚合数据:Agg#Year#2023、Agg#Device#100#Month#2023-01

问题2:希望存储预计算的日、月、年度能耗数据以避免查询时计算,采用如下SK格式是否可行:YEAR#2023(存储年度数据)、DEVICE#100#YEAR#2023、DEVICE#100#YEAR#2023#MONTH#01、DEVICE#100#YEAR#2023#MONTH#01#DAY#01

这个格式可行,但可以优化得更规范实用:

  • 统一聚合数据前缀:给所有预计算数据加Agg前缀,和基础数据、日志数据明确区分,比如Agg#Site#Year#2023(站点年度总能耗)、Agg#Device#100#Year#2023(单设备年度能耗)
  • 日期格式标准化:用YYYY-MM/YYYY-MM-DD代替纯数字,既直观又能保证字符串排序的正确性(DynamoDB的SK按字典序排序,这种格式天然支持时间范围查询)
  • 站点级聚合直接绑定到站点PK下:比如PK=Site#1,SK=Agg#Year#2023,就能直接查询该站点的年度总能耗,无需额外计算

问题3:针对上述设计,建议将哪些属性设为GSI1PK和GSI1SK?

GSI的设计要完全匹配你的实际访问需求,给你两种常见场景的建议:

  • 场景1:如果需要跨站点查询单设备的能耗数据(比如查看设备100在所有站点的月度能耗),可以设置:
    • GSI1PK:Device#<DeviceID>(如Device#100)
    • GSI1SK:Agg#Year#2023/Agg#Month#2023-01/Log#2023-10-05T12:30:00
  • 场景2:如果主要聚焦站点内的聚合数据快速筛选,可以设置:
    • GSI1PK:Site#<SiteID>#Agg(如Site#1#Agg)
    • GSI1SK:Year#2023/Month#2023-01/Day#2023-01-01
  • 注意:如果当前的核心访问模式都能通过主表的PK+SK组合满足,也可以暂时不创建GSI,后续根据实际查询瓶颈再补充。

内容的提问来源于stack exchange,提问作者Suresh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:05:30