Skip to content

把模型落到 Salesforce 中

另有 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)

A white card model rising from the plan it was drawn on, built from repeated standard window pieces with one curved wooden wall, the rest of the plan still bare.
图片由 AI 生成

第 6 个模块,共 6 个,属于 Data Architect 课程第 2 章为含义建模数据。每个模块都可以单独阅读。 上一篇:设计到第三范式,然后适度回退 · 下一篇:本章学习指南,然后是下一章:Salesforce 数据架构

**本模块回答的问题:**一个逻辑数据模型如何变成一个物理的 Salesforce 数据模型?

我们终于要谈 Salesforce 了。如果你一直在忍着不把每个方框都变成对象,现在可以了。但请注意我们是按什么顺序走过来的:我们理解了业务,描述了数据,把每个事实放在该放的地方,并决定了在哪里有意变通。直到现在,我才问 **Salesforce 应该如何实现它。**这就是我希望你记住的推进过程:**概念 → 逻辑 → 物理。**概念模型描述业务。逻辑模型描述数据。物理模型描述我们实际上要如何构建它。

物理建模这一步,在小东西上最容易看清,所以先从宠物开始。

谁是企业,谁是人?繁育者是一家企业,所以它成为一个客户(Account),记录类型为 Breeder。主人也是一个客户,或者是个人客户,记录类型为 Owner。同一个标准对象的两种类型,并排位于图的顶部,正是它们从模块 1 起一直所在的位置。

什么没有标准的归宿?宠物、品种、技能、宠物技能(Pet Trick)和技能评估成为自定义对象。还记得我们在模块 5 复制到宠物上的物种吗?它在这里有了用处:它成为宠物的记录类型,Dog 或 Cat。一个对象带两个记录类型,各有自己的页面布局和选项列表值,而不是一个狗对象加一个猫对象。

哪些关系是主从关系?我只在子记录永远不会更换父记录时才用主从关系。一条宠物技能终生属于它的宠物,而每条技能评估属于它的宠物技能,所以两者都是主从关系。这马上就有回报:正是主从关系让宠物能对它的宠物技能做汇总,这样模块 5 的已会技能数就能自动保持同步。不过宠物是会换主人的,所以主人用的是查找关系。

哪些是查找关系?Salesforce 不建议单个父记录下有超过 10,000 条子记录。像坐下这样热门的技能、一个常见品种或一家大型繁育者,很容易就超过这个数,所以宠物技能用查找关系指向它的技能,宠物也用同样的方式指向它的品种和繁育者。还有,尽可能避免多态关系,也就是一个字段可以指向多种对象类型的那种。它们在第一天很方便,但对之后所有需要读取它们的东西都更难:报表、集成,现在还有 agent。

**什么留在平台之外?**如果宠物戴着一个会报告位置的 GPS 项圈,这个位置根本不需要复制进来。它可以是一个外部对象,从项圈的追踪系统实时读取。

Salesforce 中的宠物模型 作为 Salesforce 对象的宠物模型。上方是两个客户:一个带有 Owner 记录类型,一个带有 Breeder 记录类型。它们下方的 Pet__c 带有 Dog 和 Cat 记录类型,以芯片号作为外部 ID,有指向主人、繁育者和 Breed__c 的查找关系,并以 Tricks_Known__c 作为汇总字段。Pet_Trick__c 与 Pet__c 处于主从关系中,并有一个指向 Trick__c 的查找关系,带有熟练程度和学会日期。Trick_Assessment__c 与 Pet_Trick__c 处于主从关系中。Breed__c 有它的物种、名称和体型;Trick__c 有它的名称和难度。 查找 查找 查找 主从 查找 主从 客户(Owner) Id 记录 ID 记录类型:Owner 名称 电话 客户(Breeder) Id 记录 ID 记录类型:Breeder 名称 Pet__c Id 记录 ID 记录类型:Dog、Cat Microchip_Number__c 外部 ID Owner__c 查找 Breeder__c 查找 Breed__c 查找 名称 Birth_Date__c Tricks_Known__c 汇总 Breed__c Id 记录 ID Species__c 名称 Size__c Pet_Trick__c Id 记录 ID Pet__c 主从 Trick__c 查找 Skill_Level__c Date_Learned__c Trick__c Id 记录 ID 名称 Difficulty__c Trick_Assessment__c Id 记录 ID Pet_Trick__c 主从 Date__c Skill_Level__c Assessed_By__c 恰好一个 零个或一个 一个或多个 零个或多个 © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

那张图上的每一个决定,都能追溯到我们之前做过的某个决定,这正是重点所在。现在对 Steve Trucking 做同样的一步。

我们的 Steve Trucking 逻辑模型现在包含零售合作伙伴、配送中心、装货清单、配送、配送项目、收货人、路线、停靠点、配送小组、卡车和配送小组分配。这些是业务概念,现在我可以开始把它们映射到 Salesforce 了。

零售合作伙伴可能是一个客户(Account)。配送可能映射到 Salesforce 中已有的、用于现场排期工作的某样东西,也可能成为一个自定义对象。装货清单没有合适的标准对象,所以很可能成为自定义对象。而收货人是一个真正的难题:个人客户、联系人,还是干脆只是配送上的信息?我们会在下一章好好回答这个问题。

重要的词仍然是可能。不要因为一个业务概念听起来像某个 Salesforce 对象,就认定它的实现。这就是我们先构建逻辑模型的原因:它给了我们一个用来检验 Salesforce 设计的参照。

一个业务实体并不自动意味着一个自定义对象

Section titled “一个业务实体并不自动意味着一个自定义对象 ”

有一个陷阱我希望管理员避开:“我们识别出了十一个实体,所以需要十一个自定义对象。”不对。一个逻辑实体告诉我们这个业务概念很重要。它并不规定 Salesforce 必须如何存储它。一个概念可能成为一个标准对象、一个自定义对象、对象之间的一个关系、一个或几个字段、一个在配置中管理的值,或者完全存在于 Salesforce 之外的数据(Steve Trucking 的配送照片就是这方面的好候选)。这些选择是在物理模型中做出的,这也正是我们没有在第一次通话时就做这些选择的原因。

属性也会经历同样的转变。我们逻辑上的卡车有车辆编号、VIN、品牌、型号、年款、车牌和状态。现在我们来决定它们在物理上如何存在:哪个对象拥有它们,用什么字段类型,哪些必填,哪些必须唯一,哪些是外部标识符,哪些需要验证,哪些是推导出来而不是存储的,哪些是敏感的。在逻辑层面,我们问的是**卡车意味着什么。**在物理层面,我们问的是 **Salesforce 将如何表示卡车。**不同的问题。

卡车:从逻辑实体到 Salesforce 对象 两张逐行对照的卡片。逻辑,卡车,卡车意味着什么:卡车 ID、车辆编号、VIN、品牌、型号、年款、车牌、状态。物理,Truck__c,Salesforce 将如何表示它:Id,即 Salesforce 记录 ID;Name,文本,存放车辆编号;VIN__c,17 个字符的文本,唯一,并且是外部 ID;Make__c,一个选项列表;Model__c,40 个字符的文本;Model_Year__c,一个四位数字;License_Plate__c,10 个字符的文本;Status__c,一个选项列表,必填。下方的说明:逻辑模型问卡车意味着什么;物理模型问 Salesforce 将如何表示它。 逻辑:卡车 卡车意味着什么 卡车 ID 车辆编号 VIN 品牌 型号 年款 车牌 状态 物理:Truck__c Salesforce 将如何表示它 Id:Salesforce 记录 ID Name:文本,车辆编号 VIN__c:文本(17),唯一,外部 ID Make__c:选项列表 Model__c:文本(40) Model_Year__c:数字(4) License_Plate__c:文本(10) Status__c:选项列表,必填 逻辑模型问卡车意味着什么。物理模型问 Salesforce 将如何表示它。 © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

我们在关系上花的所有时间,在这里都有了回报。我们已经知道每个关系是一对一、一对多还是多对多,是必需还是可选,以及它的历史是否重要。现在我们决定 Salesforce 如何实现它:查找关系、主从关系,还是 Salesforce 联接对象(Junction Object),也许是一个带有自己属性的联接对象,因为正如我们发现的,关系本身可以有业务含义。

回想一下配送小组分配。我们本可以在本章一开始就说:“我们在配送小组和卡车之间建一个 Salesforce 联接对象吧。”看看我们会跳过什么:这个关系为什么存在,它是否需要一个日期和一条路线,它是否有状态,几周后的一起货损索赔是否需要它的历史。这些业务问题告诉我们配送小组分配是什么。只有在那之后,我们才应该决定 Salesforce 如何构建它,以及 Salesforce 是否已经有能胜任这项工作的东西。

图又变了。概念模型展示的是业务概念和简单的连线。逻辑模型加上了属性、键、基数,以及藏在关系里的实体。现在,物理模型开始看起来像 Salesforce 了:标准对象、自定义对象、字段、关系类型,以及放在平台之外的东西。

同一项业务的三个层次 三个面板,同一个切面在三个层次上。概念,存在什么:一个零售合作伙伴(我们为其配送的零售商)发送配送,每次配送(一笔订单送一位收货人)包含若干配送项目(配送中的一件产品)。逻辑,数据如何组织:同样的三个实体,带有记录 ID 和几个字段;配送又以合作伙伴的订单号来标识;配送项目带有产品 ID 和数量。物理,Salesforce 如何构建:零售合作伙伴是一个标准客户对象,带有 Retail Partner 记录类型;配送是一个自定义对象 Delivery__c,以合作伙伴订单号作为外部 ID,并有一个指向客户的查找关系;配送项目是一个自定义对象 Delivery_Item__c,与它的配送处于主从关系中,带有数量。下方的说明:业务、概念、逻辑、物理;指着右边的任何东西,都能追溯回左边。 概念:存在什么? 逻辑:数据如何组织? 物理:SALESFORCE 如何构建? 发送 包含 发送 包含 查找 主从 零售合作伙伴 我们为其配送的零售商 配送 一笔订单送一位收货人 配送项目 配送中的一件产品 零售合作伙伴 零售合作伙伴 ID 记录 ID 名称 状态 配送 配送 ID 记录 ID 合作伙伴订单号 又称 配送日期 状态 配送项目 配送项目 ID 记录 ID 产品 ID 数量 客户(标准) Id 记录 ID 记录类型:Retail Partner 名称 Delivery__c Id 记录 ID Partner_Order_Number__c 外部 ID Retail_Partner__c 查找 Delivery_Item__c Id 记录 ID Delivery__c 主从 Quantity__c 业务 → 概念 → 逻辑 → 物理:指着右边的任何东西,都能追溯回左边。 © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

我希望你能把这三张图并排放在一起,看到其中的推进:不是三张互不相关的图,而是同一个业务在三个层次上的样子。

说一下我是怎么画这些图的,因为布局本身就是信息的一部分。我把主对象放在中间偏下的位置。如果它有父对象,我就把它们放在略高一点的地方,这样你读模型的顺序就是从上到下、从左到右,和业务思考它的方式一致。参考数据放在一边。颜色也有含义:我总是把 Salesforce 画成蓝色,再为公司自己的系统选一种颜色,通常是绿色,因为绿色是一种友好的颜色。我不用红色,黄色也有点刺眼。当一个模型这样布局时,它在我眼里就会唱起歌来。你能找到的很多图其实都是在做空间管理:我怎么把所有车停进我拥挤的车库里?我宁愿画一幅头脑能把握的、有逻辑的图景。

Salesforce 不是一个通用的关系数据库。它在关系、所有权、安全和报表方面有自己的主张。它有限制、查询行为和自动化,还有一套会影响模型在规模下如何表现的架构。所以一个在白板上看起来完美的逻辑模型,在变成物理模型时可能需要改变。这不是 Salesforce 在碍事,而是说明平台有它自己的形状,好的架构师理解这个形状。下一章讲的正是这个。

有时,物理模型也会因为我们在模块 5 中做出的反规范化决定,而有意不同于干净的逻辑模型。这没问题,只要我们能解释原因。

有一个习惯,如果你有,我希望你改掉:从设置 → 对象管理器 → 新建自定义对象开始你的数据架构,边做边摸索模型。Salesforce 让创建东西变得极其容易;这是它的优势之一,也是薄弱的数据模型出现得如此之快的原因之一。点几下就有了一个对象,再点几下就有了字段和一个关系。然后数据进来了,Flow 建起来了,报表做出来了,集成依赖上它了,而你五分钟创建的对象改起来就非常昂贵了。这就是第 1 章的可逆性测试。所以在点击新建自定义对象之前,先把模型画出来。

我把三个模型分开还有另一个原因:技术会变。今天,Steve Trucking 的一部分数据在 Salesforce 核心平台上。明天,其中一部分可能在 Data 360、某个数据仓库,或者一个我们还没选定的系统里,而 AI 助手需要它自己的表示。物理架构可以变,而业务概念却出奇地稳定:零售合作伙伴、配送和收货人仍然存在。这正是逻辑模型的价值所在。它是对业务的一份持久的描述,不与今天的实现绑定。

在把逻辑模型变成物理的 Salesforce 模型时,我要决定的是:

  • 哪些业务实体映射到 Salesforce 的标准能力,哪些需要自定义对象或其他表示方式。
  • 逻辑属性如何变成物理字段,关系如何在平台上实现。
  • 有意的反规范化在物理设计中放在哪里。
  • 哪些数据属于 Salesforce,哪些属于别处。
  • 平台的哪些特性要求物理模型不同于逻辑模型。

最重要的是,我希望能把每个决定往回追溯。如果你指着我物理模型里的某样东西问**“为什么它在那里?”**,我应该能带你沿着逻辑模型和概念模型一路回溯,找到业务真正需要的某样东西:业务 → 概念 → 逻辑 → 物理。

**考试之外:AI 改变了什么。**AI 现在可以一步就把一份需求文档变成 Salesforce 的对象和字段。这让这个顺序变得更重要,而不是更不重要:如果它从需求直接跳到了配置,就让它展示中间发生了什么:它把什么认定为实体,选了哪些键,假定了哪些关系,在哪里做了反规范化。这些都是架构决定,架构师仍然需要看到它们。

本章我们从第一次通话、聆听名词开始,以一个能追溯回业务的物理模型结束。既然我们已经选择在 Salesforce 上构建,下一个问题会更深入:我们实际上是在一个什么样的数据平台上构建?