循序渐进 · 教学 · 反模式(Anti-patterns)

避开这 8 个本体设计反模式

建模时最容易踩的坑,往往不是语法错,而是"看似合理、后患无穷"的结构选择。这一篇逐个拆解官方列出的 8 个反模式(anti-pattern),并带你做病例诊断。

原文 Ontology anti-patterns 预计阅读 16 分钟 互动演示 + 6 道测验
本文来源 · Source 内容整理自 Palantir Foundry 官方文档:
https://www.palantir.com/docs/foundry/ontology/ontology-anti-patterns/
原始标题:Ontology anti-patterns

一句话速览

避开这 8 个本体设计反模式:建模时最容易踩的坑,往往不是语法错,而是"看似合理、后患无穷"的结构选择。这一篇逐个拆解官方列出的 8 个反模式(anti-pattern),并带你做病例诊断。

1 反模式(anti-pattern)
反模式(anti-pattern)指一种"表面上解决了一个问题、实际上带来更大麻烦"的常见做法
2 切分现实
基于数据来源系统(而非实体本身)为同一个现实世界实体创建不同的对象类型
3 噪声与歧义
对象类型包含了来自外部系统、在本体语境中毫无业务关联的不必要列("everything but the kitchen sink")…
4 用错锤子
过度依赖单一工具解决所有问题
1

什么是反模式(anti-pattern)

它能跑、能存,但会把你拖进长期维护泥潭。

反模式(anti-pattern)指一种"表面上解决了一个问题、实际上带来更大麻烦"的常见做法。在本体设计里,它通常不是一个会报错的硬错误,而是一个结构性选型错误:建模者用看似合理的捷径,换来了碎片化、难维护、难扩展的本体。

官方文档明确列出了 8 个反模式,覆盖三类问题:实体怎么分(System Silos、Department Silos、God Object、Time Machine)、属性与名字怎么取(Kitchen Sink、Misnomer)、工具与动作怎么用(Golden Hammer、Action Sprawl)。

为什么重要:躲开这些反模式,你得到的本体才能准确代表业务领域、减少维护开销,并支撑跨职能的工作流。下一节我们就逐个开刀。
2

实体建模反模式(一):怎么切分现实

这 4 个反模式都出在"一个实体该不该被拆/被合并"上。

1

The System Silos

系统孤岛 · 按来源系统拆同一个实体

病症

基于数据来源系统(而非实体本身)为同一个现实世界实体创建不同的对象类型。例如 HR 系统、门禁系统、项目管理工具里都有"员工",于是分别建了 HR System EmployeeBadge System EmployeeProject Management Employee

危害

现实视图碎片化、动作/链接/应用要重复建多份、同一实体信息互相冲突、业务逻辑改动要在所有类型里重做。

处方

创建代表现实实体的单一对象类型,用数据管道(pipelines)把多源系统合并到统一后备数据集;用主键(如员工 ID)跨系统唯一标识,并定义冲突值的优先规则(如 HR 对职位名有权威性)。

2

The Department Silos

部门孤岛 · 各部门各建一份

病症

不同部门为同一对象类型创建自己的版本,让本体映射了组织结构而非业务现实。例如销售建 Sales Customer、支持建 Support Customer、财务建 Billing Customer、营销建 Marketing Contact

危害

没有单一真相源、跨职能工作流做不了、重复开发、治理噩梦(一个类型里的修复不会传播到其他类型)。

处方

创建服务多部门的共享对象类型,需要时用属性和链接捕获部门特定信息(如 Customer → Support Ticket);用受限视图控制属性可见范围。

3

The God Object

上帝对象 · 一个类型装下所有实体

病症

单一对象类型被过度加载,代表多个不同的现实实体。例如一个 Asset 想装下卡车、软件许可证、房产、金融工具,甚至"员工作为人力资产",结果 150+ 属性,大多数为 null。

危害

语义混淆、稀疏数据(大量 null)、无法强制业务规则、搜索结果混杂、动作类型需要大量条件逻辑。

处方

为不同实体创建不同的对象类型;当实体确实共享特征时,用接口(interfaces)建模共享属性与行为。

4

The Time Machine

时光机 · 把历史版本建成对象

病症

把实体的历史版本建模成独立的对象或对象类型,而不是用时间序列/快照/版本策略。例如同对象类型里放 Contract v1/v2/v3,甚至每年一个 Contract 2023/2024/2025 类型。

危害

对象数量爆炸、当前状态模糊(哪个是权威?)、链接到底链哪版含糊、跨时段报告要去重。

处方

每个实体用单一对象反映当前状态;历史变更存到单独的链接对象类型(如 Contract Amendment),或启用编辑历史、用时间序列属性。

3

属性与命名反模式(二):噪声与歧义

这 2 个反模式让本体"看得到、读不懂"。

5

The Kitchen Sink

洗碗池 · 把无关列全倒进来

病症

对象类型包含了来自外部系统、在本体语境中毫无业务关联的不必要列("everything but the kitchen sink")。例如从 CRM 建 Customer 时把 _crm_extracted_at_crm_sequencelast_etl_update_timestamp 等技术产物也暴露成属性。

危害

用户困惑、性能下降(索引变大、搜索变慢)、重要业务属性被技术元数据淹没。

处方

有意地策划属性:只保留业务含义清晰、对工作流有用的列(业务标识、可读属性、业务日期、用于筛选/动作的状态);ETL 元数据留在后备数据集,不暴露为属性。

6

The Misnomer

名不副实 · 模糊误导的命名

病症

对对象类型、属性、链接类型使用模糊、通用或误导性的名字。例如对象类型叫 Item,属性叫 valuetypedate,链接叫 Related Item——没人知道到底指什么。

危害

用户误解、学习曲线陡、文档变成必需且易过时、跨团队各解释各的。

处方

具体、自解释的名字:模糊属性加限定(monetaryValue)、链接按关系命名(Supervisor)、建立命名规范并加描述。

4

工具与动作反模式(三):用错锤子

这 2 个反模式出在"能力选错、动作切太碎"。

7

The Golden Hammer

黄金锤 · 一把锤子敲所有钉子

病症

过度依赖单一工具解决所有问题。俗话说"If all you have is a hammer, everything looks like a nail"(手里只有锤子,看什么都像钉子)。例如用动作类型算本可管道预聚合的指标、用管道做本该事件驱动的自动化、用函数实现本可 concat 的简单派生。

危害

触及工具上限、不必要的复杂度、把本可自动化的步骤推给用户、性能差、调试难。

处方

按用例选工具:批量/流处理用 pipelines;人类决策用 action types;事件驱动反应用 automations;跨多对象的复杂实时逻辑用 functions;循环编排用 schedules。用 automations 填补"变了 → 该发生什么"之间的空白,无需用户点按钮。

8

The Action Sprawl

动作蔓延 · 一堆单属性动作

病症

创建大量范围狭窄、各改一个属性的动作类型,而不是设计有意义业务操作的 cohesive 动作。例如 Update Employee First NameUpdate Employee Email……二三十个单属性动作。

危害

用户面对冗长动作列表、一次业务更新要多次提交、动作不映射真实流程、审计轨迹碎片化。

处方

围绕业务操作设计动作:把相关改动打包成有意义工作流(如 Transfer Employee),用动作参数容纳可选字段,以业务操作命名并加规则校验。

5

怎么识别反模式:常见症状信号

建模中一旦看到这些信号,立刻警觉。

  • God Object 信号:大量属性频繁为 null;属性含义随另一个属性的值而变;你忍不住问"这到底是个什么对象?";业务规则需要大量基于"类型"的条件逻辑。
  • System / Department Silos 信号:同一概念在本体里出现多个版本;改一处逻辑要在多处重复;跨团队对"客户/员工"说法不一。
  • Kitchen Sink 信号:属性里混着 _etl_*_received_at 之类技术时间戳;用户问"这列是干嘛的?"。
  • Misnomer 信号valuetypedate 等无限定名满天飞;不同团队对同名解释不同。
  • Action Sprawl 信号:单对象类型动作超 10 个;动作名形如 Set [Property];用户抱怨步骤太多。
  • Golden Hammer 信号:什么都用动作/管道/函数一种工具;本可预计算却实时算。
  • Time Machine 信号:对象类型里含 version/isCurrent;对象数随"变更次数"而非"实体数"增长。
一个心法:每当你想"先都留着/都建一份/都用一个工具",先问一句"这代表业务现实吗?"——反模式往往就藏在"图省事"里。
6

病例诊断室:这段建模犯了哪个反模式?

读病例,点"点我诊断 →"翻出病名与处方。

病例诊断室 · 点击翻出病名与处方
病例 1
某组织 HR、门禁、项目系统里都有员工,团队没建统一的 Employee,而是建了 HR System EmployeeBadge System EmployeeProject Management Employee 三个对象类型。
点我诊断 →
病例 2
一个 Asset 对象类型想代表"任何有价值的东西",装进了卡车、软件许可证、房产、金融工具甚至员工,150+ 属性,大多数对任何给定对象都是 null。
点我诊断 →
病例 3
从 CRM 建 Customer 时,把 _crm_extracted_at_crm_sequencelast_etl_update_timestamp 等技术产物也暴露成了属性。
点我诊断 →
病例 4
需要一个"按地区总销售额"的仪表板指标,团队却建了一个由用户手动触发的动作 Calculate Regional Sales Totals 写回对象,而不是用管道预计算。
点我诊断 →
病例 5
Employee 建了 Update Employee First NameUpdate Employee EmailUpdate Employee Department 等二十多个动作,每次换部门要连续提交好几个。
点我诊断 →
病例 6
追踪合同变更时,团队在同对象类型里放了 Contract v1/v2/v3 作为独立对象,每年还另开 Contract 2023/2024/2025 对象类型。
点我诊断 →

一页带走

① 反模式是结构坑
它不报错,却让本体碎片化、难维护;8 个反模式分三类。
② 实体切分
按实体而非系统/部门建类型;一个类型别装多种实体;历史用链接对象而非版本对象。
③ 属性与命名
只留业务属性、剔除 ETL 噪声;名字要具体自解释,别用 value/type/date。
④ 工具与动作
按用例选工具别万能锤;动作围绕业务操作打包,别切成单属性碎片。

延伸阅读 · 相关页面

按主题横向跳转,不必顺着目录一篇篇读。

常见问题速答 · FAQ

关于「避开这 8 个本体设计反模式」,读者最常问的几个问题。

什么是反模式(anti-pattern)?
反模式(anti-pattern)指一种"表面上解决了一个问题、实际上带来更大麻烦"的常见做法。在本体设计里,它通常不是一个会报错的硬错误,而是一个结构性选型错误:建模者用看似合理的捷径,换来了碎片化、难维护、难扩展的本体。
实体建模反模式(一):怎么切分现实?
基于数据来源系统(而非实体本身)为同一个现实世界实体创建不同的对象类型。例如 HR 系统、门禁系统、项目管理工具里都有"员工",于是分别建了 HR System Employee、Badge System Employee、Project Management…
属性与命名反模式(二):噪声与歧义是什么?
对象类型包含了来自外部系统、在本体语境中毫无业务关联的不必要列("everything but the kitchen sink")。例如从 CRM 建 Customer 时把 _crm_extracted_at、_crm_sequence、last_etl_…
工具与动作反模式(三):用错锤子是什么?
过度依赖单一工具解决所有问题。俗话说"If all you have is a hammer, everything looks like a nail"(手里只有锤子,看什么都像钉子)。