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

无明确分区键的DynamoDB转账时序数据Schema设计咨询

DynamoDB Schema 设计方案(适配你的转账数据查询需求)

针对你的核心需求——优化特定日期范围内转账方/收款方的查询与聚合操作,结合DynamoDB的特性,推荐两种实用的Schema设计方案:


方案一:双条目主表设计(无GSI,查询延迟最低)

每条转账记录在主表中存储两条独立条目,分别适配from和to的查询场景,无需依赖全局二级索引:

  • 转账方视角条目:
    • 分区键(PK):FROM#<from_address>(例:FROM#0xabc123...)
    • 排序键(SK):ts(直接用原Unix时间戳字符串,保持排序能力)
    • 属性:block, to, value(可选加type: "FROM"用于区分条目类型)
  • 收款方视角条目:
    • 分区键(PK):TO#<to_address>(例:TO#0xdef456...)
    • 排序键(SK):ts
    • 属性:block, from, value(可选加type: "TO")

优势

  • 所有核心查询都是主表的Query操作,延迟最低,直接命中分区+排序键范围
  • 无需维护GSI,减少写入开销和存储成本(小型应用数据量小,冗余完全可接受)
  • 天然支持日期范围过滤:直接指定SK的起始/结束时间戳即可

操作示例

  • 查询y向x的转账总额:执行Query,指定PK=FROM#y,SK范围为目标日期的时间戳,通过ProjectionExpression只返回value,客户端累加转换后的数值
  • 查询所有向x转账的用户:执行Query,指定PK=TO#x,SK范围为目标日期,投影from字段后去重即可

方案二:主表+双GSI设计(无数据冗余)

主表存储原始转账记录,通过两个全局二级索引(GSI)覆盖from和to的查询需求:

  • 主表结构:
    • 分区键(PK):BLOCK#<block>(用区块编号做分区键,自然分散数据到多个分区,避免单分区热点)
    • 排序键(SK):ts
    • 属性:from, to, value
  • GSI 1(转账方索引):
    • 分区键(GSI1PK):from
    • 排序键(GSI1SK):ts
    • 投影属性:to, value, block(按需选择,减少不必要的读取开销)
  • GSI 2(收款方索引):
    • 分区键(GSI2PK):to
    • 排序键(GSI2SK):ts
    • 投影属性:from, value, block

优势

  • 无数据冗余,每条记录仅存储一次
  • 主表用区块做分区键,彻底避免热点问题
  • GSI直接适配核心查询模式,逻辑清晰

操作示例

  • 查询某日期范围内向x转账的用户:针对GSI2执行Query,指定GSI2PK=x,GSI2SK范围为目标时间戳,投影from字段后去重
  • 查询y向x的转账总额:针对GSI1执行Query,指定GSI1PK=y,GSI1SK范围为目标时间戳,过滤to=x的条目后累加value

补充优化建议

  1. 数据类型调整:将ts转为Number类型(直接存Unix时间戳数字),value如果是数值型也转为Number,避免字符串转义开销,提升排序和数值计算效率
  2. 聚合操作:小型应用直接在客户端完成聚合即可;若后续需要按天/按周的汇总统计,可定时触发Lambda预聚合数据到专门的汇总表
  3. 单条记录查询:如果需要频繁查询单条转账,可在主表中添加交易唯一标识(如tx_id)作为属性,通过Query配合过滤条件定位单条记录

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 06:50:29