用途:为分布式宽列与键值存储(Apache Cassandra、Amazon DynamoDB 等)提供设计心智模型与模式,适用于规模扩展设计、选型、性能调优(热分区、高延迟)以及微服务中每次服务独立数据库的高效读取场景。
核心理念:与 SQL 先建模实体不同,这类系统需先建模查询(访问模式)。联接在写入时预先完成(反规范化),存储成本低可复制数据换读取速度,一致性为最终一致或可调,扩展为水平扩展。
主要能力与模式:
- 查询优先建模:先列出实体与所有访问模式,再设计能一次查找满足这些模式的表,事后加查询往往需要迁移或新建索引。
- 分区键决定数据分布,应使用高基数键(用户 ID、设备 ID、复合键),避免低基数键(如 status、gender)导致热分区。
- 聚类键/排序键在分区内对磁盘数据排序,支持范围查询,相当于为特定检索预排序。
- 单表设计(邻接表):在 DynamoDB 中把多种实体放同一张表,用 PK/SK 实现预联接读取,例如 PK=USER#123 一次取回用户资料与全部订单。
- 反规范化与复制:同一数据可存多表服务不同查询,代价是需自行维护跨表一致性。
Cassandra/ScyllaDB 要点:主键结构为((分区键), 聚类列);不支持 JOIN 与 GROUP BY,聚合需预计算到独立计数表;避免 ALLOW FILTERING,出现即说明模型错误;写入廉价(LSM 追加),读效率更值得关注;删除产生墓碑,避免高频删除模式。
DynamoDB 要点:GSI 提供数据的替代视图但最终一致;LSI 在同一分区内改排序且须建表时创建;需理解 WCU/RCU 容量模式,单表设计有助于优化消耗;TTL 可自动过期旧数据且不产生墓碑。
检查清单:每个查询模式是否映射到确定的表或索引;分区键基数是否足够均摊流量;单分区是否可能无限增长(超过 10GB 需分片,如 USER#123#2024-01);应用能否容忍该读取模式的最终一致。
常见反模式:全分区扫描找单项、热键(把同一“周一”数据放一个分区)、关系式建模后再在代码中联接。
限制:资料未提供具体安装命令、版本要求、收费信息或平台细节,暂未提供。