Skip to content

数据模型是骨架

另有 28 种语言版本

English · Español · 日本語 · Português (Brasil) · Français · Deutsch · Italiano · 한국어 · Português (Portugal) · 繁體中文 · Bahasa Indonesia · Türkçe · Polski · Tiếng Việt · ไทย · Nederlands · العربية · עברית · Українська · हिन्दी · Русский · Svenska · Dansk · Norsk bokmål · Suomi · Español (México) · Français (Canada) · Deutsch (Schweiz)

An older room opened up mid-renovation: its timber beams exposed, a new beam held on steel props, the furniture waiting under dust sheets.
图片由 AI 生成

第 2 个模块,共 7 个,属于 Data Architect 课程的第一章像数据架构师一样思考。每个模块都可以单独阅读。 上一篇:像架构师一样思考 · 下一篇:可逆性测试

**本模块回答的问题:**为什么数据模型比建在它之上的任何东西都重要?又该如何评判一个数据模型?

我教数据架构时,有一句话会一再提起:数据模型是骨架。

数据模型是系统的骨架。其他一切都围绕它构建,正是它把身体的其余部分撑在一起。你看一个人时看不到骨头,但骨头决定了这个人站得多高、怎么活动、能扛多重。

想想我们在 Salesforce 实施中构建的所有东西。我们围绕数据模型构建自动化。我们针对它编写 Apex,编写读取和更新它的 Flow。我们构建集成,把数据送进去、拉出来。我们在它之上做报表和分析,围绕它设计安全。而且越来越多地,我们构建需要理解这些数据并据此行动的 AI 智能体。所有这些都依赖于底层的结构。

这就是为什么尽早把数据模型做对如此重要。骨架以后可以改,但多半会很痛。

好的数据模型始于一个简单的问题:**业务真正需要表示的是什么?**不是“我们有哪些 Salesforce 对象?”,更不是“我能快速构建什么?”

我们要先理解业务。这个业务里重要的东西是什么?它们之间是什么关系?谁拥有它们?它们如何随时间变化?什么需要被记住,什么在各个业务流程之间共享?只有理解了这些,我们才应该开始把它们转化成对象、字段和关系。

这听起来理所当然,但实际上很容易本末倒置。有人认出某个东西看起来像业务机会、个案或资产,就立刻开始围绕它设计。有时这完全正确。有时我们是在把方钉往圆孔里塞,而一旦围绕这个决定构建了足够多的东西,再把钉子拔出来就会代价高昂。

有个问题我经常听到。一个客户的业务可能有很多个送货地点。每个地点应该是一个客户,还是一个自定义对象?回答之前,先注意你需要先知道什么:地点对这个业务意味着什么,它会经历什么。这就是先给业务建模,再谈对象。(我会在第 3 章给出我的答案。)

审视一个数据模型时,我希望它通过三项检验:支撑业务,随业务成长,并且性能过关。

**支撑。**模型必须支撑业务真正想要达成的目标。一个技术上能存下数据的模型,和一个真正把业务表示好的模型,差别很大。如果因为模型不太合适,我不断添加奇怪的字段、特殊的标志、复杂的自动化和例外,我就会开始怀疑问题是否真的出在自动化上。也许是模型错了。好的模型应该让业务更容易理解,而不是更难。

成长。我说的成长,不只是指记录更多。数据量确实重要:一万条记录和一亿条记录带来的问题截然不同。但业务也会在复杂度上成长。它们会增加产品、进入新市场、收购公司、改变流程、增加渠道、连接新系统。它们会发现,原以为是一样东西的,其实是五样不同的东西。一个今天运行得很漂亮的模型,如果没有给明天留出空间,就可能变成陷阱。这就是为什么我更喜欢通过添加来成长的设计,而不是不断修改已有部分的设计。添加新东西,通常比重新定义几十样东西都依赖的东西要容易。

性能。数据不会只是静静地待在那里。我们写入它、查找它、查询它、共享它、对它做报表、集成它,而且越来越多的 AI 系统会在行动前把它作为上下文检索出来。一个模型在图上可能很漂亮,运行起来却很糟糕。所以我们既要为数据如何存储而设计,也要为数据将如何被使用而设计。

而且它必须持续保持性能。它必须在规模下保持性能:用户数增加时,数据量增加时,在真实条件下和高峰时段,在一年中最忙的那一天而不是平均的一天。当意外发生时,它也必须继续保持性能。

支撑。成长。性能。整门课里我们会一再回到这三项检验。

支撑、成长、性能 数据模型是系统的基础,下面有三项检验。支撑:它契合业务吗?成长:能否靠添加而不是修改来成长?性能:在规模下和高峰时能撑住吗? 数据模型 系统的基础 支撑 它契合业务吗? 成长 能否靠添加而不是修改来成长? 性能 在规模下和高峰时能撑住吗? 支撑。成长。性能。我们会一再回到这三项检验。 © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

过于扁平、过于复杂,或者干脆错了

Section titled “过于扁平、过于复杂,或者干脆错了 ”

我见过数据模型以三种方式出错。

第一种是一开始就选错了东西。我们因为某个标准对象看起来够接近就用了它,然后花好几年不断添加例外,因为它从来就不合适。这就是方钉。

第二种是把模型做得过于扁平。所有东西都放进一个对象里,一开始这显得简单极了。然后业务成长,我们发现其中有些东西有自己的生命周期,可能有多个实例,需要自己的安全设置,或者有自己的关系。突然之间,我们只能用字段 1、字段 2、字段 3,或者越来越复杂的标志和自动化,来表示一对多关系。模型没有给我们留下任何成长的空间。

第三种是相反的错误:我们过度规范化。我们画出一张优雅的图,对象一个接一个,每个概念都分得清清楚楚。技术上很漂亮,用起来很痛苦。用户很难理解它,页面布局和 Lightning 页面上一个接一个的相关列表,会让人感觉深不见底。查询变得更复杂,自动化要跨越更多关系,报表更难做,平台为了回答普通的业务问题也要做更多工作。

那么扁平和规范化,哪个正确?没有公式。你在脑子里装着一个最优模型的样子,并在偏离它时理解其中的权衡。这就是架构的艺术,我们会在模块 4以及下一章学习如何建模时再回到这个话题。现在,先认识到:结构本身就是一个架构决定。

过于扁平、大致合适、过度规范化 同样的审批,三种建模方式。过于扁平:一张业务机会表,把审批人 1、2、3 及其日期都做成字段。大致合适:一个客户有多个业务机会,一个业务机会有多个审批,每个审批都有审批人和日期。过度规范化:业务机会被拆成六张相互关联的表,从审批请求、审批步骤,到步骤审批人、审批人角色和审批决定。 过于扁平:一张杂乱的表 大致合适 过度规范化 有 有 业务机会 金额 阶段 审批人 1 审批日期 1 审批人 2 审批日期 2 审批人 3 审批日期 3 客户 业务机会 审批 审批人 审批日期 业务机会 审批请求 审批步骤 步骤审批人 审批人角色 审批决定 没有公式。在脑子里装着最优模型的样子,并在偏离它时理解其中的权衡。 © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

系统一旦运行起来,我对数据模型的根本性改动就会非常谨慎。

假设一个文本字段已经存在多年,有人说:“我们现在其实不那么用它了,把它改成数字吧。”这听起来只是改个字段。但有什么依赖这个字段?Flow、Apex、报表、集成、数据管道、外部应用、AI 智能体。历史数据又会怎样?只要还有代码或 Flow 引用某个字段,平台本身就不允许你修改它的类型,这就说明了这个改动波及得有多远。

有时正确的做法是不去修改已有的东西。视改动的严重程度而定,我宁愿新建一个,刻意地迁移,再弃用旧结构:

宁可添加,不要修改。宁可弃用,不要突袭。

Salesforce 甚至让你可以在元数据里把这句话说出来:字段的 Field Usage 可以设为 DeprecateCandidate,即“计划弃用,不再使用”。这会给每个阅读该对象的人标出这个字段;它不会隐藏字段,所以让它退役仍然是你要去执行的一个决定。

因为一旦架构的其他部分依赖于某样东西,改变它的含义可能比改变它的名字危险得多。最糟糕的情况是字段名不变而内容变了:下游的一切仍然信任这个名字。

弃用,而不是修改:替换一个字段 同一个配送出现三次。之前:一个以文本存储的货件字段。过程中:货件(文本)被划掉并标为已弃用,旁边是一个标为新增的货件数(数字)字段,同时每个 Flow、报表和集成都迁移过去。之后:只剩下货件数(数字)。宁可添加,不要修改;宁可弃用,不要突袭。 之前 过程中 之后 添加新字段 迁移每个使用方 配送 配送日期 状态 货件(文本) 配送 配送日期 状态 货件(文本) 已弃用 货件数(数字) 新增 配送 配送日期 状态 货件数(数字) 宁可添加,不要修改。宁可弃用,不要突袭。 © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

即使是勾选字段上的必填复选框这样简单的事,也可能变成一颗定时炸弹。如果你已经收集了数据,有些记录就不会填写这个字段。然后几天、几周或几个月后,有人更新其中一条记录,保存却因为必填字段而失败,而且谁都没有那个值。把字段设为必填这样简单的改动,可能带来意想不到的、延迟出现的后果。我们会在第 3 章再谈必填,以及一个值什么时候才真正为人所知。

考试之外:AI 也建在骨架之上。让 AI 工具构建一个应用,它会在几分钟内生成对象、字段、Flow、Apex、组件和测试。如果最初的数据模型是错的,我们并没有避免坏决定的后果,而是加速了它们,因为生成的每一层都多了一样依赖那个结构的东西。这就是为什么我希望由人类架构师来评审 AI 生成的数据模型,理解它并为它负责。模块 7 会进一步讨论这一点。

在这门课里,我们会谈到很多技术:对象和关系、大数据量、查询、集成、迁移、事务、安全、Data 360 和 AI。在这一切之下,是数据模型。

如果模型能支撑业务,能随业务成长,并且在我们使用数据的各种方式下性能过关,我们就打下了坚实的基础。如果基础错了,之后的一切都会更难。

**数据模型是骨架。**架构师在设计骨架时应当非常小心。改动现有结构,可能引发连锁反应。

  • 模型是否能支撑业务、随业务成长,并在数据的各种使用方式下性能过关。
  • 一个概念是适合某个标准对象,还是一枚方钉。
  • 模型要做得多扁平或多规范化,以及为什么。
  • 对骨架的改动应该是一次添加、一次迁移还是一次弃用,而不是原地修改。