
关于
分布式 NoSQL 数据库(Cassandra、DynamoDB)专家指导。聚焦心智模型、查询优先建模、单表设计,以及高规模系统中避免热分区。
name: nosql-expert description: "分布式 NoSQL 数据库(Cassandra、DynamoDB)的专家指导。专注于心智模型、查询优先建模、单表设计,以及在高规模系统中避免热分区。" risk: unknown source: community date_added: "2026-02-27"
NoSQL 专家模式(Cassandra 和 DynamoDB)
概述
本技能为分布式宽列和键值存储(特别是 Apache Cassandra 和 Amazon DynamoDB)提供专业心智模型和设计模式。
与 SQL(建模数据实体)或文档存储(如 MongoDB)不同,这些分布式系统要求你先建模查询。
何时使用
- 为规模设计:从简单的单节点数据库迁移到分布式集群。
- 技术选型:评估或使用 Cassandra、ScyllaDB 或 DynamoDB。
- 性能调优:排查现有 NoSQL 系统中的"热分区"或高延迟。
- 微服务:实现需要高度优化读取的"每服务一数据库"模式。
心智转变:SQL vs 分布式 NoSQL
| 特性 | SQL(关系型) | 分布式 NoSQL(Cassandra/DynamoDB) | | :--- | :--- | :--- | | 数据建模 | 建模实体 + 关系 | 建模查询(访问模式) | | 连接 | CPU 密集,读取时执行 | 写入时预计算(反规范化) | | 存储成本 | 昂贵(最小化重复) | 便宜(为读取速度复制数据) | | 一致性 | ACID(强一致) | BASE(最终一致) / 可调 | | 可扩展性 | 垂直(更大的机器) | 水平(更多节点/分片) |
黄金法则: 在 SQL 中,你设计数据模型来回答任何查询。在 NoSQL 中,你设计数据模型来高效回答特定查询。
核心设计模式
1. 查询优先建模(访问模式)
通常不能"以后再添加查询"而不进行迁移或创建新表/索引。
流程:
- 列出所有实体(用户、订单、产品)。
- 列出所有访问模式("按邮箱获取用户"、"按用户获取订单并按日期排序")。
- 设计表专门用单次查找服务这些模式。
2. 分区键为王
数据基于分区键 (PK) 分布在物理节点上。
- 目标: 数据和流量的均匀分布。
- 反模式: 使用低基数 PK(如
status="active"或gender="m")创建热分区,将吞吐量限制在单节点容量。 - 最佳实践: 使用高基数键(用户 ID、设备 ID、组合键)。
3. 聚簇/排序键
在分区内,数据按**聚簇键(Cassandra)或排序键(DynamoDB)**在磁盘上排序。
- 这允许高效的范围查询(如
WHERE user_id=X AND date > Y)。 - 它有效地为特定检索需求预排序数据。
4. 单表设计(邻接列表)
主要用于:DynamoDB(但概念适用于其他地方)
在一个表中存储多种实体类型以实现预连接读取。
| PK(分区) | SK(排序) | 数据字段... |
| :--- | :--- | :--- |
| USER#123 | PROFILE | { name: "Ian", email: "..." } |
| USER#123 | ORDER#998 | { total: 50.00, status: "shipped" } |
| USER#123 | ORDER#999 | { total: 12.00, status: "pending" } |
- 查询:
PK="USER#123" - 结果: 在一次网络请求中获取用户资料和所有订单。
5. 反规范化和数据复制
不要害怕在多个表中存储相同数据以服务不同查询模式。
- 表 A:
users_by_id(PK: uuid) - 表 B:
users_by_email(PK: email)
权衡:你必须管理跨表的数据一致性(通常使用最终一致性或批量写入)。
具体指导
Apache Cassandra / ScyllaDB
- 主键结构:
((分区键), 聚簇列) - 无连接、无聚合: 不要尝试
JOIN或GROUP BY。在单独的计数器表中预计算聚合。 - 避免
ALLOW FILTERING: 如果在生产中看到这个,你的数据模型是错误的。它意味着全集群扫描。 - 写入便宜: 插入和更新只是 LSM 树的追加。不要像担心读取效率那样担心写入量。
- 墓碑: 删除是昂贵的标记。避免在标准表中使用高频删除模式(如队列)。
AWS DynamoDB
- GSI(全局二级索引): 使用 GSI 创建数据的替代视图(如"按日期搜索订单"而非按用户)。
- 注意: GSI 是最终一致的。
- LSI(本地二级索引): 在同一分区内以不同方式排序数据。必须在建表时创建。
- WCU / RCU: 理解容量模式。单表设计有助于优化消耗的容量单位。
- TTL: 使用生存时间属性自动过期旧数据。
