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

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(按需选择全量投影或特定字段投影)

支持的访问模式

  1. 查询某商品的所有版本:
    执行Query操作,条件为:

    PK = :shop_uuid AND SK BEGINS_WITH :item_prefix
    

    其中:item_prefix为 ITEM#<目标item_uuid>#VERSION#,可一次性获取该商品的全部历史版本。

  2. 通过版本ID直接查询对应记录:
    对GSI执行Query操作,条件为:

    PK = :shop_uuid AND SK = :version_uuid
    

    可快速定位到目标版本记录,同时获取所属的item_uuid。

优势

  • 单表管理所有版本数据,避免跨表操作的复杂度
  • 两种访问模式均通过高效的Query实现,性能优异
  • 扩展性强,版本数量增长不会影响查询效率

方案二:原表结构+版本索引表+事务

若希望尽量保留原表结构,可采用此方案,但仅适合版本数量较少的场景:

表结构设计

  1. 原items表:保持原有结构(PK=shop_uuid,SK=item_uuid),data字段改为存储版本列表,示例格式:
    {
      "versions": [
        {"version_uuid": "v1", "data": "xxx", "created_at": "..."},
        {"version_uuid": "v2", "data": "yyy", "created_at": "..."}
      ]
    }
    
  2. 新增version_index表:用于映射版本ID到商品ID
    • PK:shop_uuid
    • SK:version_uuid
    • 属性:item_uuid(关联的商品ID)

操作逻辑

  • 新增版本:使用DynamoDB事务,同时完成两个操作:
    1. 向version_index表插入(shop_uuid, version_uuid)→ item_uuid的映射
    2. 更新items表中对应商品的data.versions,添加新版本数据
  • 通过版本ID查询:
    1. 先查询version_index表,通过shop_uuid+version_uuid拿到对应item_uuid
    2. 再查询items表获取商品数据,最后从data.versions中过滤出目标版本内容

劣势

  • 版本数量较多时,items表单条记录会过大,导致查询/更新效率下降
  • 事务操作增加了写操作的复杂度和延迟
  • 查询版本需要两次操作,性能弱于方案一

方案选择建议

  • 若需高效支持两种访问模式且版本数量可能较多,优先选方案一
  • 若版本数量极少且希望复用原表结构,可考虑方案二

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 07:53:25