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。
实体 vs 值对象 对比图 实体(Entity) IndexVersion • versionId: "v2.1.0" • status: DRAFT → PUBLISHED • createdAt: 2025-01-15 • 身份不变,属性可变 • 有生命周期追踪 值对象(Value Object) DocumentField • fieldName: "user.email" • fieldType: STRING • fieldValue: "alice@ex.com" • 无 ID,全属性决定相等 • 不可变,替换即新建 组合

1.2 聚合与聚合根

聚合(Aggregate) 是一组相关对象的集群,外部只能通过聚合根(Aggregate Root)访问内部成员。聚合定义了事务一致性和数据变更的边界——这是倒排索引版本管理中最重要的建模工具。

要素 说明 索引版本管理示例
聚合根 唯一对外入口,持有全局标识 IndexVersion 作为根实体
内部实体 在聚合内被根引用,不对外暴露 DocumentNode(文档树节点)
内部值对象 属于聚合的不可变属性集 FieldMapping、TokenPosition
事务边界 聚合内所有变更必须在一个事务中完成 版本发布时,文档树+字段映射+倒排索引同时更新
关键约束:聚合根负责保证内部不变量。例如,IndexVersion 发布时,必须校验所有 DocumentNode 的字段映射完整、倒排索引已构建完成——这些校验逻辑封装在聚合根方法内,不允许外部直接修改内部状态。
聚合与聚合根结构图 聚合边界(事务一致性单元) 聚合根:IndexVersion versionId: String | status: VersionStatus | rootNode: DocumentNode 内部实体:DocumentNode nodeId | parentRef | children[] 值对象:FieldMapping fieldPath | analyzer | boost 外部只能访问聚合根

1.3 领域事件

领域事件(Domain Event) 是聚合中发生的、对业务有意义的过往事实记录。在索引版本管理中,领域事件驱动了版本状态流转、索引重建通知、文档变更传播等跨聚合协作场景。

事件名称 触发时机 承载数据 订阅者行为
VersionPublished 版本从 DRAFT → PUBLISHED versionId, publishedAt, docCount 触发倒排索引构建、更新搜索缓存
DocumentNestedChanged 文档树节点新增/删除/移动 nodeId, parentPath, changeType 更新嵌套路径索引、重新计算文档评分
FieldMappingUpdated 字段分析器或权重变更 fieldPath, oldAnalyzer, newAnalyzer 重建该字段的倒排索引段
实践要点:领域事件应使用过去时态命名(如 VersionPublished 而非 PublishVersion),事件数据应包含足够信息供订阅者处理,但不要包含聚合内部细节——保持事件契约的稳定性。
领域事件驱动流程 IndexVersion 发布版本 VersionPublished versionId, publishedAt 索引构建服务 缓存更新服务 版本审计日志

1.4 统一语言与限界上下文

统一语言(Ubiquitous Language) 是 DDD 的基石——开发团队、领域专家、产品经理使用同一套术语沟通。在索引版本管理课程中,我们约定以下核心术语:

  • 版本(Version):一个不可变的索引快照,包含完整的文档树和倒排索引。
  • 文档节点(DocumentNode):文档树中的单个节点,可以是叶子字段或嵌套容器。
  • 字段路径(FieldPath):从根到节点的点分隔路径,如 user.profile.name。
  • 倒排索引段(InvertedSegment):单个字段的倒排列表,是版本的最小可替换单元。

限界上下文(Bounded Context) 划定了模型的应用边界。在本课程中,我们主要关注以下上下文:

限界上下文 核心职责 与相邻上下文的集成方式
版本管理上下文 版本创建、发布、回滚、生命周期管理 发布领域事件 → 索引构建上下文
文档建模上下文 文档树结构定义、嵌套路径解析、字段映射 提供 DocumentNode 值对象 → 版本管理
索引构建上下文 倒排索引生成、段合并、存储优化 订阅 VersionPublished 事件