AWS DynamoDB 技能提供 Amazon DynamoDB 数据建模与访问模式的模式集合与最佳实践。当用户询问 DynamoDB 表设计、单表设计等相关问题时使用。
快速参考 所有模式收录在 references/dynamodb-patterns.md 中。
关键洞察
- 数据建模:先设计访问模式,再设计模式。
- 单表设计:一起查询的项目放在一起。
- GSI:多属性复合键可避免合成键 hack。
- 成本优化:过滤表达式不会降低读取成本。
- 排序控制:# 前缀将父项定位在排序边界;数值差可实现反向整数排序。
- 稀疏索引:实体类型过滤(始终开启的属性)与条件过滤(状态变化时增删属性)。
- 引用计数:TransactWriteItems:子项 PutItem(attribute_not_exists)+ 父项 UpdateItem 递增。
- 热分区:按天对时间戳分片 GSI PK;跨 N 个副本进行读分片缓存。
- 多对多:邻接表:基础表中的链接项 + GSI 投射到第二个父项的集合中。
- 唯一性约束:唯一性跟踪项(无数据)+ 对每一项使用 attribute_not_exists 的 TransactWriteItems。
关键反模式
- 不要先设计模式再考虑查询——先列出访问模式。
- 不要使用过滤表达式期望降低读取成本——它们不会。
- 不要将频繁更新的数据与大型静态数据一起存储——使用垂直分片。
- 不要手动拼接合成的 GSI 键(TOURNAMENT#X#REGION#Y)——使用多属性复合键(provider v6.29.0+)。
- 不要在排序键中放入裸整数——ISSUE#9 按字典序排在 ISSUE#100 之后;请零填充到固定宽度(ISSUE#00000009)。
- 当过滤表达式的命中率很差时不要使用它——一个包含 10,000 个未关闭 issue 和 5 个已关闭 issue 的分区:过滤已关闭会读取全部 10,005 项并返回 5 项;应将状态嵌入排序键(ISSUE#CLOSED#<id>)。
- 不要在读取时通过 Query+count 统计子项——在父项上存储引用计数并通过 TransactWriteItems 原子递增。
- 不要假设 TTL 过期项会立即消失——DynamoDB TTL 有 48 小时删除窗口;用 FilterExpression: TTL > current_epoch 防护读取。
- 不要在没有共享命名空间决策的情况下将两种实体类型放入同一个 PK 命名空间——如果名称必须全局唯一(例如 users 与 orgs),请有意使用相同的 PK 前缀并让 attribute_not_exists 强制执行约束。
决策框架 单表与多表 使用单表的情况:一起查询的项目;同一团队拥有所有数据;需要事务写入。 使用多表的情况:完全独立的数据;不同团队、不同访问;数据具有截然不同的访问模式。
模式迁移策略 迁移按难度排序。在规划 ETL 之前,始终检查变更是否为纯增量。
- 现有实体上的新可选属性:是增量,无需 ETL;在应用代码中用默认值处理缺失属性(惰性加载)。
- 新实体,无关系访问模式:是增量,无需 ETL;立即开始写入新项目——对现有数据零更改。
- 新实体与现有父项共置:是增量,无需 ETL;匹配父项 PK,分配新的 SK 前缀——无需回填。
- 新实体需要新的 GSI 项集合:非增量,需要 ETL;扫描 + UpdateItem 向所有现有父项添加 GSI 属性。
- 重构现有访问模式:非增量,需要 ETL;重新设计 SK + 新 GSI + 对受影响的所有项进行 Scan + UpdateItem。 对于大型表,使用并行扫描(TotalSegments + Segment)来分散 ETL 作业——DynamoDB 处理所有工作线程协调。
合成键与多属性复合键(GSI) 使用多属性键的情况:现有表上的新 GSI(无需回填);属性具有不同类型(Number + String);分层下钻查询;Terraform AWS provider v6.29.0+。 保留合成键的情况:基础表 PK/SK(不支持);需要在实体类型之间使用 begins_with();单表重载 GSI 且混合实体;迁移成本大于收益的遗留表。
版本矩阵
- 多属性复合 GSI 键:AWS GA 2025 年 11 月;Terraform AWS Provider v6.29.0+(PR #45357)。
成本分析 当用户询问 DynamoDB 成本、容量模式取舍(PAY_PER_REQUEST 与 PROVISIONED)或成本优化时,引导他们安装 AWS Pricing MCP Server。它通过 get_pricing 提供实时 DynamoDB 定价数据,并可通过 generate_cost_report 生成成本明细报告。
先决条件:uv 包管理器、Python 3.10+、具有 pricing:* 权限的 AWS 凭证。
macOS / Linux: { "mcpServers": { "awslabs.aws-pricing-mcp-server": { "command": "uvx", "args": ["awslabs.aws-pricing-mcp-server@latest"], "env": { "FASTMCP_LOG_LEVEL": "ERROR", "AWS_PROFILE": "your-aws-profile", "AWS_REGION": "us-east-1" } } } }
Windows: { "mcpServers": { "awslabs.aws-pricing-mcp-server": { "command": "uvx", "args": [ "--from", "awslabs.aws-pricing-mcp-server@latest", "awslabs.aws-pricing-mcp-server.exe" ], "env": { "FASTMCP_LOG_LEVEL": "ERROR", "AWS_PROFILE": "your-aws-profile", "AWS_REGION": "us-east-1" } } } }
将上述内容添加到 ~/.claude/claude_desktop_config.json(Claude Desktop)或 .claude/mcp.json(Claude Code)的 mcpServers 下。
参考资料加载策略 对所有 DynamoDB 问题加载 references/dynamodb-patterns.md——它涵盖建模模式(项集合、# 前缀技巧、稀疏索引、引用计数、TTL 防护)、GSI 设计(复合键、多属性键)、成本以及 Terraform 示例。