DynamoDB单表设计:如何建模一对多关系满足多App最新版本查询需求
DynamoDB单表设计调整方案
核心思路
利用你当前App总数最多仅数百个的规模优势,通过冗余每条App的最新版本、最新已发布版本两条专属记录+稀疏GSI的方式,低成本满足所有访问模式。
调整步骤
1. 基础表结构补充
原有表结构无需修改,仅需在每次新增版本、切换IsReleased状态时,同步更新对应App的两条冗余记录:
- 最新版本记录:pk和对应App的defaults记录一致,sk固定为
latest_version,冗余存储该App当前最高版本号的全量版本属性 - 最新已发布版本记录:pk和对应App的defaults记录一致,sk固定为
latest_released_version,冗余存储该App当前版本号最高且IsReleased=1的全量版本属性
同时给这两条冗余记录新增两个属性: platform:从pk中拆分出的平台标识,取值为ios/androidbundle_id:从pk中拆分出的应用包名
2. 新增两个稀疏GSI
| GSI编号 | GSI PK | GSI SK | 适用场景 |
|---|---|---|---|
| GSI1 | platform | bundle_id | 仅latest_version记录写入 |
| GSI2 | platform | bundle_id | 仅latest_released_version记录写入 |
所有访问模式实现方式
- 列出所有App的最新版本:直接Scan GSI1,总数据量最多数百条,毫秒级返回
- 列出指定平台下所有App的最新版本:Query GSI1,PK=指定平台(
ios/android)
- 列出指定平台下所有App的最新版本:Query GSI1,PK=指定平台(
- 列出所有
IsReleased=1的App的最新版本:直接Scan GSI2
- 列出所有
- 列出指定平台下所有
IsReleased=1的App的最新版本:Query GSI2,PK=指定平台
- 列出指定平台下所有
- 获取指定App的最新版本:直接GetItem基础表,pk=App唯一标识,sk=
latest_version
- 获取指定App的最新版本:直接GetItem基础表,pk=App唯一标识,sk=
- 获取指定App的最新已发布版本:直接GetItem基础表,pk=App唯一标识,sk=
latest_released_version
- 获取指定App的最新已发布版本:直接GetItem基础表,pk=App唯一标识,sk=
- 获取指定App的所有版本:Query基础表,pk=App唯一标识,sk以
version_为前缀,按sk降序排序
- 获取指定App的所有版本:Query基础表,pk=App唯一标识,sk以
- 获取指定App的所有已发布版本:Query基础表,pk=App唯一标识,sk以
version_为前缀,增加FilterExpressionIsReleased=1,或额外新增GSI(PK=App标识,SK=版本号,仅IsReleased=1的版本写入)避免过滤
- 获取指定App的所有已发布版本:Query基础表,pk=App唯一标识,sk以
- 获取指定App的Default属性:直接GetItem基础表,pk=App唯一标识,sk=
defaults
- 获取指定App的Default属性:直接GetItem基础表,pk=App唯一标识,sk=
适配约束说明
- 冗余记录总数量最多仅为App总数的2倍,存储成本几乎可忽略
- 版本发布、
IsReleased状态切换时仅需额外1-2次写操作,开销极低 - 高频的已发布版本相关查询均直接走索引或单点查询,性能满足要求
- 即使后续App规模扩容到数千个,Scan操作的性能依然足够
内容的提问来源于stack exchange,提问作者iamthegeek
相关产品推荐
相关产品推荐

