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
- GSI1PK:
- 场景2:如果主要聚焦站点内的聚合数据快速筛选,可以设置:
- GSI1PK:
Site#<SiteID>#Agg(如Site#1#Agg) - GSI1SK:
Year#2023/Month#2023-01/Day#2023-01-01
- GSI1PK:
- 注意:如果当前的核心访问模式都能通过主表的PK+SK组合满足,也可以暂时不创建GSI,后续根据实际查询瓶颈再补充。
内容的提问来源于stack exchange,提问作者Suresh
相关产品推荐
相关产品推荐

