1. 领域驱动设计基础:DDD 核心概念
领域驱动设计(Domain-Driven Design,DDD)是一种以业务领域为核心的软件建模方法论。它强调通过统一语言(Ubiquitous Language)将业务概念精确映射到代码模型,从而应对复杂业务逻辑的演化。在倒排索引版本管理与文档嵌套结构设计中,DDD 提供了将索引版本、文档树、字段变更等业务概念转化为可维护聚合的思维框架。
核心认知:DDD 不是技术架构,而是业务建模的思维工具。它帮助我们在索引版本控制中识别“什么是一个完整的版本单元”、“文档嵌套的边界在哪里”、“哪些变更需要触发领域事件”。
1.1 实体与值对象
| 概念 | 定义 | 标识特征 | 索引场景示例 |
|---|---|---|---|
| 实体(Entity) | 具有唯一标识、生命周期可追踪的对象 | 有 ID,属性变化但身份不变 | IndexVersion(版本 ID 不变,内容可更新) |
| 值对象(Value Object) | 由属性值定义、不可变、无标识的对象 | 无 ID,相等性由所有属性决定 | DocumentField(字段名+类型+值,替换即新建) |
- 实体:在索引版本管理中,
VersionId是实体的锚点。即使版本状态从“草稿”变为“已发布”,该实体依然指向同一个版本。 - 值对象:文档嵌套结构中的
FieldPath(如user.address.city)是典型值对象——路径字符串相同即视为相等,无需独立 ID。 - 建模原则:优先使用值对象表达概念,只有当需要跟踪身份变化时才使用实体。
避坑提示:不要将数据库主键直接当作实体的业务标识。实体的 ID 应来自业务领域(如版本号
v2.1.0),而非数据库自增 ID。
1.2 聚合与聚合根
聚合(Aggregate) 是一组相关对象的集群,外部只能通过聚合根(Aggregate Root)访问内部成员。聚合定义了事务一致性和数据变更的边界——这是倒排索引版本管理中最重要的建模工具。
| 要素 | 说明 | 索引版本管理示例 |
|---|---|---|
| 聚合根 | 唯一对外入口,持有全局标识 | IndexVersion 作为根实体 |
| 内部实体 | 在聚合内被根引用,不对外暴露 | DocumentNode(文档树节点) |
| 内部值对象 | 属于聚合的不可变属性集 | FieldMapping、TokenPosition |
| 事务边界 | 聚合内所有变更必须在一个事务中完成 | 版本发布时,文档树+字段映射+倒排索引同时更新 |
关键约束:聚合根负责保证内部不变量。例如,
IndexVersion 发布时,必须校验所有 DocumentNode 的字段映射完整、倒排索引已构建完成——这些校验逻辑封装在聚合根方法内,不允许外部直接修改内部状态。
1.3 领域事件
领域事件(Domain Event) 是聚合中发生的、对业务有意义的过往事实记录。在索引版本管理中,领域事件驱动了版本状态流转、索引重建通知、文档变更传播等跨聚合协作场景。
| 事件名称 | 触发时机 | 承载数据 | 订阅者行为 |
|---|---|---|---|
VersionPublished |
版本从 DRAFT → PUBLISHED | versionId, publishedAt, docCount | 触发倒排索引构建、更新搜索缓存 |
DocumentNestedChanged |
文档树节点新增/删除/移动 | nodeId, parentPath, changeType | 更新嵌套路径索引、重新计算文档评分 |
FieldMappingUpdated |
字段分析器或权重变更 | fieldPath, oldAnalyzer, newAnalyzer | 重建该字段的倒排索引段 |
实践要点:领域事件应使用过去时态命名(如
VersionPublished 而非 PublishVersion),事件数据应包含足够信息供订阅者处理,但不要包含聚合内部细节——保持事件契约的稳定性。
1.4 统一语言与限界上下文
统一语言(Ubiquitous Language) 是 DDD 的基石——开发团队、领域专家、产品经理使用同一套术语沟通。在索引版本管理课程中,我们约定以下核心术语:
- 版本(Version):一个不可变的索引快照,包含完整的文档树和倒排索引。
- 文档节点(DocumentNode):文档树中的单个节点,可以是叶子字段或嵌套容器。
- 字段路径(FieldPath):从根到节点的点分隔路径,如
user.profile.name。 - 倒排索引段(InvertedSegment):单个字段的倒排列表,是版本的最小可替换单元。
限界上下文(Bounded Context) 划定了模型的应用边界。在本课程中,我们主要关注以下上下文:
| 限界上下文 | 核心职责 | 与相邻上下文的集成方式 |
|---|---|---|
| 版本管理上下文 | 版本创建、发布、回滚、生命周期管理 | 发布领域事件 → 索引构建上下文 |
| 文档建模上下文 | 文档树结构定义、嵌套路径解析、字段映射 | 提供 DocumentNode 值对象 → 版本管理 |
| 索引构建上下文 | 倒排索引生成、段合并、存储优化 | 订阅 VersionPublished 事件 |