惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
Jina AI
Jina AI
大猫的无限游戏
大猫的无限游戏
Martin Fowler
Martin Fowler
博客园 - 司徒正美
云风的 BLOG
云风的 BLOG
C
Cybersecurity and Infrastructure Security Agency CISA
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
S
Securelist
S
Security Affairs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
L
LINUX DO - 热门话题
博客园 - 三生石上(FineUI控件)
T
Threatpost
T
The Blog of Author Tim Ferriss
C
CERT Recently Published Vulnerability Notes
IT之家
IT之家
P
Palo Alto Networks Blog
Microsoft Azure Blog
Microsoft Azure Blog
Spread Privacy
Spread Privacy
Cyberwarzone
Cyberwarzone
腾讯CDC
L
LangChain Blog
Know Your Adversary
Know Your Adversary
C
CXSECURITY Database RSS Feed - CXSecurity.com
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
I
Intezer
T
Tor Project blog
AWS News Blog
AWS News Blog
T
Tenable Blog
NISL@THU
NISL@THU
Security Latest
Security Latest
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
H
Hackread – Cybersecurity News, Data Breaches, AI and More
人人都是产品经理
人人都是产品经理
MongoDB | Blog
MongoDB | Blog
MyScale Blog
MyScale Blog
D
DataBreaches.Net
Microsoft Security Blog
Microsoft Security Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
量子位
美团技术团队
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
罗磊的独立博客
The GitHub Blog
The GitHub Blog
阮一峰的网络日志
阮一峰的网络日志
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Stack Overflow Blog
Stack Overflow Blog

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解 【002】HTTPS 粗解:证书、TLS 握手与对后端配置的影响 Hermes Agent 一周暴涨五万 Star,但我劝你别急着追 明明连接的是Redis的DB0,为什么能查到DB3的数据? 【从0到1构建一个ClaudeAgent】协作-Agent团队 熟悉电子元器件之后,电子小白下一步该怎么走? MAF快速入门(23)通过C#类定义Skills .NET 高级开发 | 手写一个对象映射框架 FastAPI数据库ORM怎么选?我肝了三个Demo后,终于不再纠结了 mysqldump 参数拾遗:在遗忘与铭记之间 C# .NET 周刊|2026年3月5期 Claude code入门 - 陈彦斌 一文学习入门 ThingsBoard 开源物联网平台 GitHub 热门项目 | 2026年04月16日 如何为GIT设置全局勾子,为每次提交追加信息 Number.isFinite和isFinite与isNaN()和Number.isNaN的区别 PortSwigger SQL注入LAB2 推荐一个测试人必备的Skills,从功能到性能全搞定(附详细实操和安装下载方式) 筑基期:掌握Odoo基础核心知识点02(Odoo XML 开发方式详解) GLM模型这么火,咱们用vllm也咧一个呗! 深入理解 AbortController:从底层原理到跨语言设计哲学 字符串学习笔记 多租户系统框架的基础模块设计和分析设计 Apache SeaTunnel Zeta 为什么能做到“又快又稳”? AI开发-python-LangGraph框架(3-26-LangGraph基本概念及第一个简单样例) Vue 3 组件通信,别只会用 Props 和 Emits 了,这几个狠活儿你得看看 ElasticSearch7.X版本配置密码 用Manim实现动态交点计算--从一个动点问题说起 团结引擎+Addressable+Instant Game打包抖音小游戏 function call 实战:让 LLM 自动判断 pod 异常、调用日志工具并完成故障分析 bubseek —— 让 Agent 的足迹,变成团队的洞察 通过 C# 读取并导出 PDF 书签 如何用 GitHub Actions 实现 Steam 自动化发布 【从0到1构建一个ClaudeAgent】并发-后台任务 .NET 高级开发 | 定制 ASP.NET Core 框架 电子小白:什么是运算放大器(运放) zero2Agent:面向大厂面试的 Agent 工程教程,从概念到生产的完整学习路线 堆上的ORW HC32F460 USB CDC通信异常:非对齐访问异常排查 20260413-Hyperbridge 攻击事件:发生在默克尔山上的验证绕过 那些喊着AI 要淘汰你的人,正在靠你的焦虑赚大钱! 深度学习进阶(八)Swin Transformer 最小二乘问题详解19:带先验约束的增量式SFM优化与实现 SnapTranslate 3.0 正式发布:全局划词翻译 + 完整英语学习闭环,一站式搞定查词、记词、复习 工作的意义、工作的困难认知再思考 .NET + AI 进阶实战:基于类的技能开发 - 打造可治理的 Agent 能力模块 【从0到1构建一个ClaudeAgent】规划与协调-技能 上周热点回顾(4.6-4.12) 电子小白的工具三件套:面包板、杜邦线、万能板 单表五亿数据的查询优化 | Mysql、StarRocks 2. WorkBuddy:从“我是谁”到“帮我干活” C# 如何减少代码运行时间:7 个实战技巧 基于HelixToolkit.SharpDX 渲染3D模型 - 笺上知微 从零开始的双臂具身VLA起源及现阶段发展综述 - SkyXZ 记对 xonsh shell 的使用, 脚本编写, 迁移及调优 - pluvium27 受够了Vibe Coding的失控?换个起点,让AI事半功倍 从开始配置漏洞环境到漏洞复现流程 - 難しい 关于10年工作经验的程序员对OpenClaw的实战经验分享以及看法 - 虚无境 Any metadata 的内存布局 C# .NET 周刊|2026年3月2期 - InCerry 我帮你测过了,测试圈排名第二的 Skill 依然很牛逼 Skill Discovery | 无监督技能发现的经典工作总结 - MoonOut 上下文工程是什么?过时了么?一文讲明白! - 一枫说码 开了 TUN 模式还是直连?90% 的人都踩过这个坑 AScript扩展多种脚本语言 - rockey627 AI 学习笔记:Agent 的记忆机制 你能被装进一个文件里吗?——7 万人把同事"蒸馏"成了 AI - 我没有三颗心脏 Claude Code 通关手册(七):给 AI 装上技能包——Skills 完全指南 - 暮色之狐 在浏览器中快速编辑代码:VSCode Web 集成实践 - Newbe36524 蒸馏自己 skill?基于 Deepseek 的蒸馏器,丐版蒸馏方式,简单便捷 - To_Carpe_Diem Spring AI Aliababa和AgentScope,哪个更好? - 苏三说技术
领域驱动 vs 本体驱动:DDD 代码建模与 Ontology 语义建模的对比分析
刀法如飞 · 2026-06-13 · via 博客园_首页

DDD 与 Ontology 对比分析:代码建模与语义建模的异同

探讨领域驱动设计(DDD)与本体论建模(Ontology)之间的本质差异,搞清其背后的理论体系和运行机制。

一、双维建模:逻辑深度与语义广度

复杂业务系统的建模方法与开发方式可以分为两条路线:

  • DDD 范式:以应用代码开发为主,利用充血对象与限界上下文,在微服务内部构建精确的业务规则。其核心在于“逻辑的深度”。目前的主流开发范式。
  • Ontology 范式:以平台语义层为载体,通过 ObjectType、LinkType 与 ActionType 构建跨系统的全局知识图谱。其核心在于“语义的广度”。随着Palantir走红而被业界研究。

二者在表面上都涉及“对象、关系与行为”,但其实际解决的问题层级截然不同:

flowchart TB BIZ["复杂业务系统建模"]:::root L1["L1 · 应用级建模 (DDD)<br/>━━━━━━━━━━━━<br/>解决单服务内部逻辑自洽"]:::layer1 L2["L2 · 企业级建模 (Ontology)<br/>━━━━━━━━━━━━<br/>解决跨系统语义与数据治理"]:::layer2 DDD["DDD<br/>充血模型 / 限界上下文<br/>分层架构 / 领域事件"]:::ddd ONTO["Ontology<br/>ObjectType / LinkType<br/>ActionType / Function"]:::onto BIZ --> L1 BIZ --> L2 L1 --> DDD L2 --> ONTO classDef root fill:#37474F,stroke:#263238,stroke-width:2px,color:#ECEFF1 classDef layer1 fill:#FFE0B2,stroke:#EF6C00,stroke-width:2px,color:#BF360C classDef layer2 fill:#B2DFDB,stroke:#00796B,stroke-width:2px,color:#004D40 classDef ddd fill:#FFCDD2,stroke:#C62828,stroke-width:2px,color:#B71C1C classDef onto fill:#C8E6C9,stroke:#2E7D32,stroke-width:2px,color:#1B5E20

  • DDD 聚焦局部(Micro):确保在一个特定的限界上下文内,代码能忠实反映业务意图。
  • Ontology 聚焦全局(Macro):确保在整个企业生态内,不同系统对“客户”、“资产”等核心概念拥有统一的定义、权限与审计链路。

误用二者的典型代价是:用 DDD 做全企业模型会导致架构僵化;而用 Ontology 做纯应用框架则会显得过于沉重。只有各司其职,才能发挥其最大价值。

二、概念体系对比

二者都有一套自己的"基础词汇",下面把对齐项放在一起看。

2.1 术语对照表

关注点 DDD Ontology(Palantir) 关键差异
实体 Entity(领域层中带 ID 的对象) ObjectType + 实例 DDD 实体是代码类;Ontology Object 是平台一等公民
值对象 Value Object(不可变、按值判等) Property 上的 Value Type(约束、单位、枚举) DDD 值对象封装行为;Ontology Value Type 偏数据约束
关系 实体 / 聚合根间的引用(聚合内强引用 + 聚合外 ID 引用) LinkType(独立一等类型,带语义、基数、属性) Ontology 关系本身就是"对象",可以挂属性
聚合根 Aggregate Root(保证内部不变量) ⊘ 无直接对应——Ontology 不假设强一致性边界 DDD 聚合 = 事务一致性边界;Ontology 一致性由 Action 显式约束
行为 聚合根 / 实体 / 领域服务的方法 ActionType(声明式:参数 + 校验 + 副作用 + 权限 + 审计) DDD 行为编码在类里;Ontology 行为是平台契约
业务规则 充血模型的方法 + 领域服务 ActionType 校验 + Function(外部 / 内部规则) DDD 规则与对象共生;Ontology 规则与对象解耦但绑定
领域事件 Domain Event(应用层发布) 写后事件 / 流(依据 ActionType 自动产生审计与下游事件) Ontology 事件天然带审计、自动派发
边界 Bounded Context(限界上下文,按业务边界) 通常按 ObjectType + 权限组划分,不强制"上下文" DDD 强调边界清晰;Ontology 强调跨边界统一语义
统一语言 Ubiquitous Language(团队术语表 + 代码命名) Ontology 本身就是企业级的统一语言 DDD 限于一个团队 / 上下文;Ontology 跨整个企业
权限 外挂在应用层(Spring Security、网关) 内建于 ObjectType / ActionType,随每次调用自动生效 Ontology 权限是一等公民,DDD 默认不管
审计 应用层手工埋点 / AOP ActionType 调用自动落审计日志 Ontology 把审计变成"无需努力即默认开启"

2.2 抽象层次的差异

flowchart TB subgraph DDDStack["DDD 抽象栈(代码即模型)"] direction TB DDD_App["应用代码<br/>(Java / Go / Python)"]:::dddTop DDD_Lang["编程语言<br/>(OOP / FP)"]:::dddMid DDD_Run["运行时<br/>(JVM / OS / 容器)"]:::dddBot DDD_App --> DDD_Lang --> DDD_Run end subgraph ONTOStack["Ontology 抽象栈(平台即模型)"] direction TB ONTO_Sem["语义层<br/>(Ontology DSL / 元数据)"]:::ontoTop ONTO_Plat["平台<br/>(Foundry / OSv2 / OMS / Funnel)"]:::ontoMid ONTO_Infra["基础设施<br/>(数据湖 / OLTP / OLAP)"]:::ontoBot ONTO_Sem --> ONTO_Plat --> ONTO_Infra end classDef dddTop fill:#FFCDD2,stroke:#C62828,stroke-width:2px,color:#B71C1C classDef dddMid fill:#FFE0B2,stroke:#EF6C00,stroke-width:2px,color:#BF360C classDef dddBot fill:#F5F5F5,stroke:#616161,stroke-width:2px,color:#212121 classDef ontoTop fill:#C8E6C9,stroke:#2E7D32,stroke-width:2px,color:#1B5E20 classDef ontoMid fill:#B2DFDB,stroke:#00796B,stroke-width:2px,color:#004D40 classDef ontoBot fill:#F5F5F5,stroke:#616161,stroke-width:2px,color:#212121 style DDDStack fill:#FFEBEE,stroke:#C62828,stroke-width:2px,color:#000 style ONTOStack fill:#E8F5E9,stroke:#2E7D32,stroke-width:2px,color:#000

DDD 的载体是"程序"——业务模型靠源代码表达,靠编译器和测试保证一致性,部署到 JVM / 容器中执行。

Ontology 的载体是"平台"——业务模型靠元数据声明(ObjectType / LinkType / ActionType),由平台保证一致性,由专门的语义层服务(如 OSv2、OMS、Funnel)执行。

这一抽象层级的差异,决定了二者在"表达力 / 工程成本 / 跨系统统一性"上的所有不同。

三、建模哲学对比

二者背后的本体观(哲学层面)截然不同。

3.1 实体本体论 vs 关系 / 过程本体论

哲学立场 工程范式 代表
实体本体论:世界由对象构成,关系是对象的附属 ER / OOP / DDD 关系数据库、Java / C# 类、DDD 聚合
关系 / 过程本体论:关系与变化更基本,对象是关系的节点 知识图谱 / Ontology / 函数式 RDF / OWL、Palantir Ontology、F# 函数式 DDD

DDD 继承了 OOP 的实体本体观——对象是建模的中心,关系靠对象引用(聚合内)或 ID 引用(聚合外)表达;行为是对象的方法。

Ontology 站在关系本体观一侧——LinkType 是独立的一等公民,可以挂属性、可以被查询、可以参与 Action;对象是"关系网络中的节点",而不是建模的中心。

工程后果:DDD 适合表达"对象内部的强一致性规则";Ontology 适合表达"对象之间的复杂关系网络与跨域决策"。试图用 DDD 表达"任意两个对象间的 N 种关系且关系本身有属性",会让聚合根膨胀;试图用 Ontology 表达"聚合内部 7 条不变量的强一致性事务",会发现它的最终一致性语义不直接支持。

3.2 Palantir 的三层哲学(认识论与实践论的延伸)

Ontology 不仅是本体论的实现,Palantir 把它扩展为"本体—认识—实践"三层(详见 ../ontology-research/技术原理介绍.md 1.2 节):

哲学层 Palantir 对应 DDD 对应
本体论(有什么) ObjectType + LinkType + Property 实体 + 值对象 + 聚合
认识论(如何认识 / 推理) ActionType + Function + Models / Analytics 领域服务 + 领域事件 + 规则引擎
实践论(如何变成行动) AIP Agent + 审批流 + 写回 应用服务编排 + 工作流引擎

DDD 主要回答本体论与认识论,把"实践论"留给业务方与应用层。Ontology 的雄心更大——它要把三层合到同一个语义平台、同一套权限、同一条审计链路上。

四、技术形态对比

下面把二者在工程上的具体形态摆在一起,差异立刻清晰。

4.1 "实体 + 关系 + 行为"的写法对比

DDD 写法(Java / Spring Boot):

// 实体(聚合根)
public class Vehicle {
    private VehicleId id;
    private String model;
    private VehicleStatus status;
    private List<RequiredPart> requiredParts;   // 聚合内强引用
    private ProductionLineId assignedLine;       // 聚合外用 ID

    public void startProduction(ProductionLine line, InventoryView inventory) {
        if (!inventory.hasAllParts(this.requiredParts))
            throw new IllegalStateException("缺料");
        if (!line.isIdle())
            throw new IllegalStateException("产线繁忙");
        this.status = VehicleStatus.IN_PRODUCTION;
        this.assignedLine = line.getId();
        addDomainEvent(new VehicleStartedProductionEvent(this.id, line.getId()));
    }
}

Ontology 写法(Palantir 风格的伪代码,详见 ../ontology-research/数据存储与使用方式对比.md):

// ObjectType 声明
{ "ObjectType": "Vehicle", "properties": { "model": ..., "status": ... } }

// LinkType 声明(关系是一等公民)
{ "LinkType": "REQUIRES_PART",
  "from": "Vehicle", "to": "Part",
  "properties": { "mandatory": "boolean", "quantity": "integer" } }

// ActionType 声明(行为是一等公民)
{ "ActionType": "startProduction",
  "subject": "Vehicle",
  "params": { "line": "ProductionLine" },
  "preconditions": [
    { "rule": "allRequiredPartsInStock(vehicle)" },
    { "rule": "line.status == 'IDLE'" }
  ],
  "effects": [
    { "set": "vehicle.status = 'IN_PRODUCTION'" },
    { "link": "vehicle ASSIGNED_TO line" }
  ],
  "permissions": ["role:PLANT_MANAGER"],
  "audit": "auto"
}

核心差异

维度 DDD 方法 Ontology 方法
关系 requiredParts 写为聚合内集合 写为独立 LinkType 实体
行为 startProduction 写为聚合根方法 写为 ActionType 声明
校验 方法体内 if/else + 异常 preconditions 声明
权限 外挂 @PreAuthorize ActionType 内置 permissions
审计 手工 audit.log(...) 或 AOP ActionType 内置 audit:auto
外部消费 必须再写一份 OpenAPI / RPC 契约 OSDK / 平台 API 自动衍生

4.2 跨系统调用对比

flowchart TB subgraph DDDSide["DDD:多服务各自实现,事件解耦"] direction LR D_Order["订单服务<br/>充血 Order"]:::dddNode D_Pay["支付服务<br/>充血 Payment"]:::dddNode D_Stock["库存服务<br/>充血 Stock"]:::dddNode D_MQ[("消息队列<br/>Kafka / RocketMQ")]:::mq D_Order --> D_MQ D_Pay --> D_MQ D_Stock --> D_MQ D_MQ --> D_Order D_MQ --> D_Pay D_MQ --> D_Stock end subgraph ONTOSide["Ontology:共享语义底座,调用即写回"] direction LR O_Order["Order<br/>ObjectType"]:::ontoObj O_Pay["Payment<br/>ObjectType"]:::ontoObj O_Stock["Stock<br/>ObjectType"]:::ontoObj O_Action["Action / Function<br/>(一等公民)"]:::ontoAct O_Sem["Ontology 语义层<br/>权限 / 审计 / 链接"]:::ontoSem O_Order --- O_Action O_Pay --- O_Action O_Stock --- O_Action O_Action --- O_Sem end classDef dddNode fill:#FFCDD2,stroke:#C62828,stroke-width:2px,color:#B71C1C classDef mq fill:#FFE0B2,stroke:#EF6C00,stroke-width:2px,color:#BF360C classDef ontoObj fill:#C8E6C9,stroke:#2E7D32,stroke-width:2px,color:#1B5E20 classDef ontoAct fill:#FFF9C4,stroke:#F9A825,stroke-width:2px,color:#F57F17 classDef ontoSem fill:#B3E5FC,stroke:#0277BD,stroke-width:2px,color:#01579B style DDDSide fill:#FFEBEE,stroke:#C62828,stroke-width:2px,color:#000 style ONTOSide fill:#E8F5E9,stroke:#2E7D32,stroke-width:2px,color:#000

DDD 体系下,三个服务各有一套领域模型,靠领域事件 + 上下文映射协作;每跨一个上下文都要做防腐层翻译。
Ontology 体系下,三个领域共享同一套语义底座,跨系统调用即在同一个 Ontology 内调用 Action——不需要"防腐层",因为根本没有"腐"可防。

代价对比:DDD 的代价是"跨上下文翻译成本";Ontology 的代价是"必须先有一个像 Foundry 这样的平台"。前者可以用 Spring + Kafka 起步,后者需要数百万级的平台采购或自建。

五、表达力对比

5.1 各类业务现象的建模能力

业务现象 DDD 表达力 Ontology 表达力
单聚合内强一致性事务(如订单状态机) ★★★★★ 充血模型直接表达 ★★★ 需要把多个 Action 组合
跨聚合 / 跨服务的关系网络(如供应链上下游) ★★ 必须用 ID 引用,难以查询 ★★★★★ LinkType 是一等公民,可查询、可挂属性
同一字段的多种含义(同名异义) ★★★★★ 用限界上下文天然解决 ★★★ 必须显式区分 ObjectType
复杂业务规则与状态机 ★★★★★ 充血方法 + 状态枚举 ★★★★ ActionType 校验 + Function
企业级权限治理 ★★ 外挂、易遗漏 ★★★★★ 内置、随调用生效
全链路审计 ★★ 需手工埋点 ★★★★★ 自动
复杂跨实体查询(图遍历) ★ 必须靠 JOIN ★★★★★ 沿 LinkType 走
AI Agent 在权限下安全操作 ★★ 工程负担大 ★★★★★ Ontology 是 AI 的语义底座
单元测试领域逻辑 ★★★★★ new Order().pay() ★★★ 需在平台环境运行
团队多语言异构落地 ★★★★★ 各语言各写一套 ★★ 锁定平台技术栈

5.2 一句话总结

  • DDD 在单系统内部的业务规则表达力上是冠军;
  • Ontology 在跨系统的语义统一、权限、审计、关系网络与 AI 协作上是冠军。

六、适用场景对比

6.1 何时选 DDD

  • 项目是单个应用 / 单个微服务,业务复杂但范围有限
  • 团队规模几人到几十人,沟通成本可控
  • 没有平台预算,技术栈以开源为主(Spring Boot / Gin / .NET)
  • 业务规则高度领域特定,需要工程师与领域专家深度协作建模
  • 关心代码可维护性、可测试性、团队可移植性

6.2 何时选 Ontology

  • 项目是企业级 / 跨多事业部 / 多系统整合
  • 业务对象与关系需要被多种角色和工具消费(应用、BI、AI Agent、外部合作方)
  • 权限、合规、审计是硬性要求(金融、军工、医疗、政府)
  • 已有或计划采购Palantir / 类似平台,或愿意自建语义层
  • 需要 LLM / Agent 在安全可控的语义层上自主决策

6.3 何时都不要

  • 简单 CRUD 应用:两者都过重,朴素 MVC + 关系数据库即可
  • 快速原型 / 验证想法:先跑通业务再考虑建模方法

七、共性与互补

虽然抽象层级不同,二者仍有大量共识:

共识 DDD 表达 Ontology 表达
业务语言贯穿模型 统一语言(Ubiquitous Language) Ontology 即企业级统一语言
行为绑定数据 充血模型(方法绑在聚合根上) ActionType 绑在 ObjectType 上
拒绝业务规则散落 规则在领域层 规则在 ActionType / Function
边界保护不变量 聚合一致性边界 ActionType preconditions + 权限
显式建模关系与事件 实体关系 + 领域事件 LinkType + 写后事件

二者并非对立:在 Palantir 体系内,单个 Ontology 内的 ActionType / Function 实现仍可遵循 DDD 充血模型;反过来,DDD 项目在跨多个限界上下文做企业级统一时,可以借鉴 Ontology 的"关系 / 行为一等公民"思想引入图模型或语义层(如 GraphQL Federation + 共享词表)。

八、决策树:如何选择?

%%{init: {'flowchart': {'rankSpacing': 20, 'nodeSpacing': 50, 'padding': 10}}}%% flowchart TD Start(["新项目 / 现有系统重构"]):::start Q1{"业务复杂度<br/>足够高?"}:::question Simple["朴素 MVC<br/>+ 关系数据库"]:::simple Q2{"跨多事业部?<br/>强合规审计?<br/>需要 LLM 在权限下操作?"}:::question Q3{"有平台预算<br/>或自建语义层意愿?"}:::question DDD["选 DDD<br/>充血模型 + 分层架构"]:::ddd ONTO["选 Ontology<br/>(Foundry / 自建语义层)"]:::onto Hybrid["混合方案<br/>(Ontology + DDD)<br/>详见《应用结合》"]:::hybrid Start --> Q1 Q1 -->|否| Simple Q1 -->|是| Q2 Q2 -->|否| DDD Q2 -->|是| Q3 Q3 -->|否| DDD Q3 -->|"是,且需要单服务内部规则强表达"| Hybrid Q3 -->|"是,且追求全企业统一"| ONTO classDef start fill:#37474F,stroke:#263238,stroke-width:2px,color:#ECEFF1 classDef question fill:#FFF9C4,stroke:#F9A825,stroke-width:2px,color:#ff3300 classDef simple fill:#ECEFF1,stroke:#607D8B,stroke-width:2px,color:#263238 classDef ddd fill:#FFCDD2,stroke:#C62828,stroke-width:2px,color:#B71C1C classDef onto fill:#C8E6C9,stroke:#2E7D32,stroke-width:2px,color:#1B5E20 classDef hybrid fill:#FFE0B2,stroke:#EF6C00,stroke-width:2px,color:#BF360C

九、小结

维度 DDD Ontology
解决的核心问题 单应用内部代码如何对齐业务 企业级语义、权限、审计如何统一
载体 应用代码(OOP / FP) 平台(语义层 + 元数据)
建模哲学 实体本体论 关系 / 过程本体论 + 三层哲学
强项 单聚合一致性、可测试性、低成本 跨系统统一、权限审计、AI 协作
弱项 跨上下文协作成本高 平台门槛高、单聚合强一致性表达弱
典型工程 Spring Boot + COLA Palantir Foundry
典型场景 微服务领域建模 企业中台 / 决策系统 / AI 平台

两者并非互斥——在一个真实的企业级 AI 决策系统里,二者经常以"Ontology 作知识层 + DDD 作执行层"的方式协作。详见DDD与Ontology应用结合.md


参考文档