DynamoDB条目版本表结构设计:shop_uuid与version_uuid查询方案问询
DynamoDB 条目版本表设计方案
方案一:单表复合排序键+全局二级索引(推荐)
这是最贴合DynamoDB单表设计最佳实践的方案,可同时满足两种核心访问需求:
表结构调整
对原items表做如下修改:
- 主键(PK):保留
shop_uuid不变 - 排序键(SK):采用复合格式
ITEM#<item_uuid>#VERSION#<version_uuid> - 附加属性:
item_uuid:单独存储(用于GSI关联)version_uuid:版本唯一标识data:版本对应的业务数据
全局二级索引(GSI)配置
创建GSI以支持shop_uuid+version_uuid的查询:
- GSI主键(PK):
shop_uuid - GSI排序键(SK):
version_uuid - 投影属性:至少包含
item_uuid、data(按需选择全量投影或特定字段投影)
支持的访问模式
查询某商品的所有版本:
执行Query操作,条件为:PK = :shop_uuid AND SK BEGINS_WITH :item_prefix其中
:item_prefix为ITEM#<目标item_uuid>#VERSION#,可一次性获取该商品的全部历史版本。通过版本ID直接查询对应记录:
对GSI执行Query操作,条件为:PK = :shop_uuid AND SK = :version_uuid可快速定位到目标版本记录,同时获取所属的
item_uuid。
优势
- 单表管理所有版本数据,避免跨表操作的复杂度
- 两种访问模式均通过高效的
Query实现,性能优异 - 扩展性强,版本数量增长不会影响查询效率
方案二:原表结构+版本索引表+事务
若希望尽量保留原表结构,可采用此方案,但仅适合版本数量较少的场景:
表结构设计
- 原
items表:保持原有结构(PK=shop_uuid,SK=item_uuid),data字段改为存储版本列表,示例格式:{ "versions": [ {"version_uuid": "v1", "data": "xxx", "created_at": "..."}, {"version_uuid": "v2", "data": "yyy", "created_at": "..."} ] } - 新增
version_index表:用于映射版本ID到商品ID- PK:
shop_uuid - SK:
version_uuid - 属性:
item_uuid(关联的商品ID)
- PK:
操作逻辑
- 新增版本:使用DynamoDB事务,同时完成两个操作:
- 向
version_index表插入(shop_uuid, version_uuid)→ item_uuid的映射 - 更新
items表中对应商品的data.versions,添加新版本数据
- 向
- 通过版本ID查询:
- 先查询
version_index表,通过shop_uuid+version_uuid拿到对应item_uuid - 再查询
items表获取商品数据,最后从data.versions中过滤出目标版本内容
- 先查询
劣势
- 版本数量较多时,
items表单条记录会过大,导致查询/更新效率下降 - 事务操作增加了写操作的复杂度和延迟
- 查询版本需要两次操作,性能弱于方案一
方案选择建议
- 若需高效支持两种访问模式且版本数量可能较多,优先选方案一
- 若版本数量极少且希望复用原表结构,可考虑方案二
内容的提问来源于stack exchange,提问作者Evilguy
相关产品推荐
相关产品推荐

