跳到主要内容

NoSQL 数据模型

文档数据库如何存放可变结构的实体?​

  • 文档模型: 以文档保存一个实体及其嵌套属性,读取聚合实体时可减少拆表和组装;
  • 适用条件: 实体字段变化较多,常按整个对象读写;灵活模式方便演进,但校验与版本兼容仍需维护;
  • 权衡: 跨文档关联和约束需要额外设计,不能由“无固定模式”推出数据天然一致;
  • 原文示例: MongoDB、DocumentDB、CouchDB;

键值数据库如何快速定位数据?​

  • 键值模型: 根据键存取一个值,适合会话、缓存和已知主键的高吞吐查询;
  • 权衡: 简单键值抽象不擅长任意字段过滤或复杂联接;某些产品另有索引能力,不能一概说都不支持扫描或索引;
  • 原文示例: Redis、Memcached、DynamoDB、Aerospike;

图数据库如何表达关系遍历?​

  • 图模型: 用节点表示实体、边表示关系、属性表示附加信息,使多跳关系查询围绕图结构展开;
  • 适用条件: 社交关系、推荐、欺诈检测和网络拓扑等场景,问题重点是实体之间如何连接;
  • 权衡: 建模、查询和分布式遍历有自身复杂度,应检查查询语言、工具和热点路径,而非只看单点查询速度;
  • 原文示例: Neo4j、ArangoDB、Neptune、JanusGraph;

时间序列数据库如何处理按时间增长的数据?​

  • 时间序列: 为带时间戳的数据写入、压缩、按时间范围读取和聚合优化;
  • 适用条件: IoT 采样、应用监控、指标分析及市场时间数据;
  • 权衡: 应明确采样频率、维度基数和保留策略,长期保存所有原始点未必符合成本目标;
  • 原文示例: InfluxDB、Apache Druid;

宽列数据库如何组织稀疏的大规模记录?​

  • 宽列模型: 围绕行键及列族组织数据,允许不同记录出现不同列,适合按已知键或范围访问大规模数据;
  • 适用条件: 大规模属性数据与实时读写,分区键和聚簇顺序往往需要围绕查询预先设计;
  • 权衡: 运维与多副本开销可能较高,但写入是否慢取决于实现,不能把原文结论当模型定义;
  • 模型边界: 宽列存储不等同于分析数据库按列压缩扫描的“列式存储”;
  • 原文示例: Bigtable、Cassandra、ScyllaDB;

多模型数据库如何整合不同访问方式?​

  • 多模型: 一个后端同时支持文档、图、键值或关系等多个模型,减少跨产品拼接;
  • 适用条件: 同一业务确实需要多种模型,并且产品在这些模型下的保证满足需求;
  • 权衡: 接口更统一不等于所有模型共享同样的事务、性能或成熟度,需逐个验证;
  • 原文示例: ArangoDB、Cosmos DB、Couchbase;