DDIA 1-3-2 图数据模型、事件溯源与 CQRS
1. 图数据模型(Graph Data Model)
图数据模型以节点(nodes)与边(edges)为核心,用于表达实体与关系。
示例:
(Alice) -[:FOLLOWS]-> (Bob)
图模型并非只有图数据库使用,很多知识表达、社交网络、推荐系统、路径分析本质都依赖图结构。
1.1 图模型的核心优势
| 能力 | 说明 |
|---|---|
| 表达复杂关系 | 自然适合 n 对 n、多跳路径、层级归属等复杂数据结构 |
| 可变架构(Schema-less) | 实体类型、关系种类可以随时扩展 |
| 性能随关系增长更稳定 | 多跳查询通常比关系数据库 JOIN 更高效 |
| 支持递归查询 | e.g., 组织结构、地理包含(within)、路径发现 |
1.2 与关系数据模型的差异
- 关系模型强调表 + 外键,适合结构清晰的业务数据
- 图模型强调关系与连接性,适合遍历、搜索、推荐、溯源类问题
图模型在工业界大量用于:
- 知识图谱(Knowledge Graph)
- 风控路径溯源
- 网络拓扑分析
- 社交关系图
- 供应链依赖图
- 事件因果链
2. 事件溯源(Event Sourcing)
事件溯源是一种把数据存成事件序列,而不是当前状态的模式。
传统系统存当前状态:
{ "balance": 120 }
事件溯源存变化事件:
Deposit 100
Withdraw 20
Deposit 40
当前状态由事件回放推导得到。
2.1 为什么使用事件溯源?
| 需求 | 事件溯源的优势 |
|---|---|
| 审计能力 | 所有状态变化都有记录 |
| 系统恢复能力 | 可从事件重放恢复任意时刻状态 |
| 可追踪业务逻辑演化 | 数据的形成路径清晰可见 |
| 天然支持时间旅行 | 还原过去状态、比较差异 |
| 事件驱动架构天然契合 | 事件可以驱动其他微服务更新、通知等 |
2.2 事件存储格式
事件通常包含:
{
"eventType": "ItemAdded",
"data": { ... },
"timestamp": "...",
"version": 17 // 乐观锁 / 回放顺序
}
不同系统可把事件保存在:
- 日志(Kafka)
- EventStore
- 关系库(按聚合分 EventStream)
- 文档库
3. CQRS(Command Query Responsibility Segregation)
CQRS 是 命令(Command) 与 查询(Query) 分离的架构模式。
核心思想:
修改数据与读取数据应该使用不同模型,因为需求完全不同。
3.1 为什么要分离?
| Command(写) | Query(读) |
|---|---|
| 强一致性 | 高性能、高可用 |
| 验证复杂 | 可缓存、可做物化视图 |
| 更新有限数据 | 读取跨聚合、多维度数据 |
| 事务性强 | 可用异步、最终一致性 |
3.2 CQRS 与事件溯源的关系
两者常一起使用:
- 写模型(Command Model)
- 产出事件(events)
- 事件被广播(event bus)
- 读模型(Query Model)
- 订阅事件
- 更新自己的投影(projection / view)
这种结构天然适合:
- 高读写分离系统
- 报表系统
- 活动日志
- 复杂读取视图的业务(如电商订单状态汇总)
4. 数据框、矩阵、数组的模型差异
数据框(DataFrame)、矩阵(Matrix)、数组(Array)是数据系统中三种常见结构,各有侧重点。
4.1 数组(Array)
一维或多维,元素类型一致。
示例:
[1, 2, 3]
或多维:
[[1,2], [3,4]]
适合数值计算、图像矩阵、向量空间。
4.2 矩阵(Matrix)
本质是二维数组,但承担数学意义:线性代数运算。
- 强调行列(shape)
- 支持矩阵乘法、特征分解、转置等
矩阵可以看成数组的一个语义化子集。
4.3 数据框(DataFrame)
一种类似表格的结构:
- 列可不同类型(字符串、浮点、日期)
- 每列有标签,每行有索引
- 常用于数据分析(Pandas、R DataFrame)
示例:
| name | age | score |
|---|---|---|
| Alice | 25 | 88 |
| Bob | 30 | 92 |
适用于:
- 统计分析
- 数据清洗
- 多字段结构化数据处理
4.4 三者对比
| 特性 | 数组 | 矩阵 | 数据框 |
|---|---|---|---|
| 维度 | 任意 | 二维 | 二维(带列名) |
| 类型一致性 | 要求一致 | 一致 | 不要求一致 |
| 运算重点 | 数值计算 | 线代运算 | 分析 / ETL |
| 应用领域 | AI、图像处理 | 机器学习算法内部 | 数据分析、BI |
5. 综合视角:数据模型与架构模式的关系
图数据模型、事件溯源、CQRS、数据框/矩阵/数组其实处于数据处理链条的不同层次:
📌 数据表达层(结构)
- 数组 / 矩阵:数值运算
- 数据框:分析型数据
- 图数据模型:关系与连接性最强的数据形式
📌 数据行为层(数据如何变化)
- 事件溯源:数据的演化记录
- CQRS:对读写需求的结构性分离
📌 架构层(系统如何组织数据)
在复杂系统中,它们往往组合出现:
- 图模型 + 事件溯源
→ 用事件构建知识图谱(事件流形成关系图) - CQRS + 事件溯源
→ 微服务常见模式,写端产生事件,读端构建多种视图(表格视图、图视图) - 数据框 / 数组 / 矩阵
→ 事件的二次处理(分析、机器学习)
📌 总结
这篇总结的核心思想是:
图模型强于关系表达,事件溯源记录状态来源,CQRS 优化读写逻辑,而数据框/矩阵/数组是数据分析与计算层的基石。
它们在现代系统架构中往往共同构成:
- 数据采集(事件)
- 数据关系构建(图)
- 数据查询(CQRS 的读模型)
- 数据分析(DataFrame / Matrix / Array)
- 机器学习与推理