数据模型

2026-05-211 出链
  • S:在学习和实践“数据模型”时,需要建立统一的概念和问题边界。
  • C:相关概念、实现机制和工程取舍容易混在一起,导致只记住结论而无法判断适用条件。
  • Q:“数据模型”要解决什么问题?它的核心抽象、工作机制和边界分别是什么?
  • A:本文围绕“数据模型”整理核心概念、关键机制和工程实践,并明确其适用边界。

系统如何理解、组织、约束、查询、演化信息的方式

数据模型是系统对业务世界的压缩表示。 它决定了哪些事实被保存,哪些关系被显式表达,哪些约束可以被维护,哪些查询会变简单,哪些变化可以被追踪,以及系统未来如何演化。

认知模型

  • 关系模型视角:世界由实体和关系组成
  • 文档模型视角:世界由聚合对象组成
  • 事件模型视角:世界由变化过程组成

同一个业务,可以有多个数据模型,服务于不同的目的

擅长、不擅长

数据模型提供了一种抽象,将X问题转换为Y问题; 也是一种取舍,擅长某方面,与不擅长某方面

  • 关系模型:关系、约束 -> 强
  • 文档模型:聚合、嵌套 -> 灵活
  • KV 模型:快速拿值 -> 快
  • 图 模型:沿着关系走 -> 关系遍历
  • 列式模型:对大量数据的少数字段做扫描、过滤、聚合 -> 大数据

访问路径

数据的访问路径决定数据模型

查完整对象 -> 文档模型 运营分析 -> 列式宽表 按唯一键高频点查 -> KV 模型 按多种条件组合、连接并维护约束 -> 关系模型 沿多跳关系探索 -> 图模型 追溯变化、重放状态 -> 事件模型

从访问模式开始反推数据模型:

  • 谁在读?读什么?按什么条件读?读多少?
  • 延迟要求多少?一致性要求多少?
  • 数据怎么变化?变化频率多高?

拆分读写模型

cqrs

一个写模型,派生出多个读模型:

  • 源数据模型:表达业务事实
  • 派生数据模型:服务查询场景

关系模型

把数据抽象成 relation,然后用代数操作组合

结构化数据 + 约束 + 集合运算 + 查询组合性

通用性

文档模型

把访问边界内聚起来

把经常一起访问、一起变化的数据放在一起

事件模型

把状态还原成变化历史

日志记录变化,状态是日志折叠后的结果

宽表模型

为查询牺牲规范化

数据类型:事实、状态、查询视图

事实 Fact:已经发生、不可改变的东西;适合用事件、日志保存。 状态 State:由事实推导出的当前结果;适合用于业务判断和快速读取。 视图 View:为了某个查询目的构造出来的投影;适合被重建、缓存、派生。

一致性

哪些数据必须强一致? 哪些数据可以最终一致?

时间

建模的不是“东西”,而是“东西在时间中的变化”。

领域边界

一个大关系模型 -> 多个领域模型 + 事件集成模型 + 查询投影模型

对应存储引擎

存储引擎不是孤立技术,它服务于某种数据模型和访问模式。

关系模型 + B+Tree
适合 OLTP、事务、范围查询、索引查询

文档模型 + B-tree/LSM
适合聚合对象读写、半结构化数据

KV 模型 + Hash/LSM
适合高速点查、缓存、状态存储

列式模型 + 压缩 + 向量化执行
适合分析、聚合、扫描

图模型 + 邻接结构
适合关系遍历

日志模型 + append-only log
适合事件流、复制、重放、异步集成

评论