数据模型
- S:在学习和实践“数据模型”时,需要建立统一的概念和问题边界。
- C:相关概念、实现机制和工程取舍容易混在一起,导致只记住结论而无法判断适用条件。
- Q:“数据模型”要解决什么问题?它的核心抽象、工作机制和边界分别是什么?
- A:本文围绕“数据模型”整理核心概念、关键机制和工程实践,并明确其适用边界。
系统如何理解、组织、约束、查询、演化信息的方式
数据模型是系统对业务世界的压缩表示。 它决定了哪些事实被保存,哪些关系被显式表达,哪些约束可以被维护,哪些查询会变简单,哪些变化可以被追踪,以及系统未来如何演化。
认知模型
- 关系模型视角:世界由实体和关系组成
- 文档模型视角:世界由聚合对象组成
- 事件模型视角:世界由变化过程组成
同一个业务,可以有多个数据模型,服务于不同的目的
擅长、不擅长
数据模型提供了一种抽象,将X问题转换为Y问题; 也是一种取舍,擅长某方面,与不擅长某方面
- 关系模型:关系、约束 -> 强
- 文档模型:聚合、嵌套 -> 灵活
- KV 模型:快速拿值 -> 快
- 图 模型:沿着关系走 -> 关系遍历
- 列式模型:对大量数据的少数字段做扫描、过滤、聚合 -> 大数据
访问路径
数据的访问路径决定数据模型
查完整对象 -> 文档模型 运营分析 -> 列式宽表 按唯一键高频点查 -> KV 模型 按多种条件组合、连接并维护约束 -> 关系模型 沿多跳关系探索 -> 图模型 追溯变化、重放状态 -> 事件模型
从访问模式开始反推数据模型:
- 谁在读?读什么?按什么条件读?读多少?
- 延迟要求多少?一致性要求多少?
- 数据怎么变化?变化频率多高?
拆分读写模型
一个写模型,派生出多个读模型:
- 源数据模型:表达业务事实
- 派生数据模型:服务查询场景
关系模型
把数据抽象成 relation,然后用代数操作组合
结构化数据 + 约束 + 集合运算 + 查询组合性
通用性
文档模型
把访问边界内聚起来
把经常一起访问、一起变化的数据放在一起
事件模型
把状态还原成变化历史
日志记录变化,状态是日志折叠后的结果
宽表模型
为查询牺牲规范化
数据类型:事实、状态、查询视图
事实 Fact:已经发生、不可改变的东西;适合用事件、日志保存。 状态 State:由事实推导出的当前结果;适合用于业务判断和快速读取。 视图 View:为了某个查询目的构造出来的投影;适合被重建、缓存、派生。
一致性
哪些数据必须强一致? 哪些数据可以最终一致?
时间
建模的不是“东西”,而是“东西在时间中的变化”。
领域边界
一个大关系模型 -> 多个领域模型 + 事件集成模型 + 查询投影模型
对应存储引擎
存储引擎不是孤立技术,它服务于某种数据模型和访问模式。
关系模型 + B+Tree
适合 OLTP、事务、范围查询、索引查询
文档模型 + B-tree/LSM
适合聚合对象读写、半结构化数据
KV 模型 + Hash/LSM
适合高速点查、缓存、状态存储
列式模型 + 压缩 + 向量化执行
适合分析、聚合、扫描
图模型 + 邻接结构
适合关系遍历
日志模型 + append-only log
适合事件流、复制、重放、异步集成
评论