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)

A canal lock in the morning mist, its wooden gates holding back the higher water while a narrowboat waits in the basin below.
图片由 AI 生成

第 5 个模块,共 6 个,属于 Data Architect 课程第 6 章主数据与身份。每个模块都可以单独阅读。 上一篇:地图不是决定 · 下一篇:检查点 1:Steve Trucking

**本模块回答的问题:**如何管理由不止一个系统维护的数据?

简单的架构是:ERP 拥有客户,Salesforce 拿到一份副本,完事。真实的企业没有那么干净。ERP 拥有法定客户,Salesforce 拥有销售关系;一个事业部在 SAP 里,一个被收购的事业部在另一个 ERP 里;潜在客户只存在于 Salesforce 中。然后有人希望 Salesforce 用户去更新一个由 ERP 控制的字段,于是箭头开始指向两个方向。正如我讲这一部分时说的:“最难的是双向同步。”不是因为双向发送数据在技术上很难,而是因为一旦两个系统都参与变更,你就必须对权威极其精确。

ERP 拥有账单地址,并把它复制到 Salesforce。一位销售代表从客户那里得知地址变了,业务方希望他们无需离开 Salesforce 就能更新它。很合理。现在数据流向是 ERP → Salesforce 和 Salesforce → ERP。Salesforce 现在共同拥有账单地址了吗?没有。**集成的方向并不决定权威。销售代表并不是在修改 Salesforce 的副本。在架构上,他们是在请求修改权威的值。**你不是在修改 ERP 的字段,而是在请求修改它。Salesforce 是界面;ERP 仍然是主控方。

这改变了设计。如果 Salesforce 拥有这个字段,保存就完事了。如果 ERP 拥有它,“保存”就意味着 Salesforce 发送提议的地址,ERP 验证并接受它,更新自己的主数据,再把权威的值发回来。只有到那时,受治理的值才改变了:请求 → 验证 → 接受 → 发布,而不是“更新两个系统,然后祈祷它们保持同步”。

双向数据,一个权威来源 修改一个 ERP 拥有的地址,分三条泳道:销售代表,作为互动系统的 Salesforce,以及作为记录系统的 ERP。一,销售代表的客户已经搬迁,他在 Salesforce 中提议新的账单地址。二,Salesforce 把它标记为待处理,仍显示旧地址。三,Salesforce 向 ERP 发送一个变更请求。四,ERP 验证、接受并主控它。五,ERP 把权威的地址发送回来。六,Salesforce 显示新地址。下方写着:Salesforce 是互动系统;数据双向流动,只有 ERP 主控这个地址。 修改一个 ERP 拥有的地址 销售代表 客户已经搬迁 Salesforce ERP 记录系统 提议新的账单地址 1 标记为待处理;仍显示旧地址 2 一个变更请求 3 验证、接受并主控它 4 权威的地址 5 显示新地址 6 Salesforce 是互动系统。数据双向流动;只有 ERP 主控这个地址。 © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

双向集成并不会产生双向的权威。

ERP 拒绝了这次修改:客户不活跃,地址违反了某条 ERP 规则,这个用户不能修改法定地址,ERP 宕机了,或者在此期间有别人修改了这个客户。如果 Salesforce 已经显示了新地址,我们现在就有了两个真相,而模块 1 已经告诉了我们哪个胜出:ERP 的。所以架构需要一个已请求、尚未接受的状态:一个单独的提议值,一个“待处理变更”标志,或者等到确认之后再显示它。机制取决于具体用例。规则不变:永远不要让一个被拒绝的请求变成相互竞争的真相。

这是一个经典问题。ERP 更新了 Salesforce;Salesforce 的集成看到了一个变更,把它发给 ERP;ERP 看到一次更新,又把它发回来。你建出了一个非常昂贵的循环。好的双向设计知道一个变更从哪里开始,主控方是否已经接受了它,以及这是一个新的业务变更,还是一个已经处理过的变更的回声:源标识符、时间戳、集成元数据、幂等处理。集成那一章会深入讨论。主数据的原则很简单:要知道你是在发起一个变更,还是在反映一个变更。

然后是冲突。你在第 5 章见过一个:一位销售代表要求用 Steve’s Plumbing LLC,而 ERP 里有人输入了 Steve’s Plumbing L.L.C.(保护受治理的记录)。这里再举一个。Salesforce 提议改成 125 Main Street;几乎同时,一位 ERP 用户把它改成了 130。哪个胜出?没有通用的技术答案。也许 ERP 总是胜出,因为它拥有这个字段;也许 Salesforce 的请求进入一个审核队列;也许较晚被接受的变更胜出;也许 ERP 会拒绝任何起始值已经改变的更新。这是并发问题,但在它之下是一个权威决定,而如果没人决定谁可以做出权威的修改,任何集成模式都救不了你。

而单个字段还是简单的情况。一个地址由街道、城市、邮政编码组成。Salesforce 发送了一个新的街道,而 ERP 刚刚修改了城市。你会让街道单独通过吗?还是把地址当作一个事务,让这些字段要么一起通过,要么都不通过,并拒绝整个修改?在第一次冲突之前,而不是之后,就决定哪些字段要作为一组一起传递。

每当我看到一个双向集成,我都会问:**当两边都修改同一份数据时会怎样?**如果答案是“那多半不会发生”,我们就还没做完。哪个胜出,我们是拒绝、排队、比较版本,还是审核?这个字段到底应该在两边都可以编辑吗?有时最好的双向设计,是对某个属性去掉一个方向:Salesforce 可以发起请求;只有 ERP 发布被接受的值。数据仍然双向流动,但只有一个系统主控这个字段。这个区别就是一切。

关系也可以是主数据。一个全球母公司,下面有北美和欧洲区域,每个区域下面有各国的子公司:层级本身就承载着含义。谁是母公司?哪个子公司属于哪个法人实体?哪些客户汇总到全球客户?这会驱动报表、区域、定价、合同、信用风险敞口、服务、数据访问和分析。一个层级可能和其中的记录一样重要,它需要同样的治理。(考试明确提到了层级管理;它很容易被忘记。)

在 Salesforce 上,客户层级是用上级客户字段构建的。Lightning 的层级视图最多显示 2,000 个客户,而且只显示用户有权看到的那些;层级中不支持个人客户;而客户地点用来区分一家公司的不同地点(Considerations for Using Account Hierarchy (opens in a new tab),英文)。但上级客户字段并不能回答那个架构问题:谁拥有这个层级?

考点。掌握客户层级的基础知识:它是用上级客户构建的;Lightning 视图最多显示 2,000 个客户,而且只显示用户能看到的客户;不支持个人客户;客户地点用来区分一家公司的不同地点。

根据我的经验,**层级是分头主控的。**北美的实体来自 SAP,欧洲的来自另一个 ERP,新的潜在客户在 Salesforce 中构建,而一个被收购的子公司还没有迁移过来。谁拥有这个层级?**这取决于是哪个分支。**每个 ERP 控制自己的分支;Salesforce 控制潜在客户的关系,直到它们转换。这是一种合理的架构,只要每个人都知道边界在哪里。逐个分支地决定。

一个层级,多个主控方 Steve's Plumbing 的一个客户层级,顶端是全球母公司,下面有三个分支,每个分支都向上指向它,作为自己的上级。Steve's Plumbing 北美,在 ERP A 中主控。Steve's Plumbing 欧洲,在 ERP B 中主控。一家新子公司,在转化之前在 Salesforce 中主控。下方写着:逐个分支决定由谁拥有层级,并让边界清晰可见。 上级 上级 上级 Steve's Plumbing 全球母公司 Steve's Plumbing 北美 在 ERP A 中主控 Steve's Plumbing 欧洲 在 ERP B 中主控 一家新子公司 转化之前在 Salesforce 中主控 逐个分支决定由谁拥有层级,并让边界清晰可见。 © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

层级的权威可以逐个分支地分配。

所以不要让上级客户字段掩盖了权威。一个用户在 Salesforce 中给一个子公司重新指定了上级。技术上很简单。在架构上,他们是不是刚刚改变了公司的法律结构?如果 ERP 主控着那个分支,多半不是,所以 Salesforce 应该阻止它,或者把它变成一个变更请求。又或者 Salesforce 合理地保留着一个商业层级,而 ERP 保留着法律层级。那么也许它们根本就不应该是同一个关系。

一家公司可以有好几个合理的层级:法律层级、计费层级、销售层级、服务层级、地理层级。全球母公司签合同,各区域各自获得服务,计费通过一个共享的财务实体进行,销售按区域管理。哪个是真正的层级?全都是;它们回答的是不同的问题。错误在于假设必须只有一个。对每一种关系,都应该有清晰的权威:这是把模块 1 的属性原则运用到关系上。

而且并不是每一个父子关系都是主数据。把今天的配送归到一条路线上是一种关系,但它是交易性的,是一个运营事件。客户层级描述的是一种持久的业务关系。两者在模型中看起来都像父子关系;它们的生命周期却不同。要问这个关系意味着什么,以及这种含义会持续多久。

讲到这里时,我会问在场的人:谁合作过只有一个 Salesforce、却有不止一套 ERP 的客户?每次都有人举手。问为什么,就会发现这些 ERP 是按区域划分的(一套用于北美,一套用于欧洲),按职能划分的(一家水管公司收购了一家电气公司,双方各自保留自己的 ERP),或者只是历史原因:这项业务是收购来的,还没有人把它迁移过来。

以 Steve’s Plumbing 作为客户。它在北美开展业务,所以北美的 ERP 中有它的一条客户记录。后来它在慕尼黑开设了办事处,欧洲的 ERP 又为它创建了自己的一条客户记录,带着自己的客户编号。同一家公司,两条记录,两个 ID。我该如何在一个 Salesforce org 中表示它?我见过三种方式。

**客户层级。**Steve’s Plumbing 是上级,Steve’s Plumbing North America 和 Steve’s Plumbing Europe 是子客户,每个子客户代表一套 ERP 中的记录。问题在于:这些子客户其实已经不再是 Steve’s Plumbing 了。它们是在某个区域开展业务的 Steve’s Plumbing,而正如我们刚才看到的,层级是承载含义的。

**平级客户。**两个客户并排,各自带一个字段,说明它属于哪套 ERP:公司代码、区域。没有任何东西被隐藏。代价体现在报表上:要在全球范围内看到 Steve’s Plumbing,你需要某种东西来说明这两个客户是同一家公司。

**一个客户,每套 ERP 一个子记录。**一个 Steve’s Plumbing,再加一个子对象,每套 ERP 一条记录,保存该 ERP 的客户 ID。两套 ERP 也好,十套也好。销售人员看到的是一个客户,下的是一张订单;在幕后,由流程决定每个订单行发往哪套 ERP:电气工作发往电气 ERP,水管工作发往水管 ERP。但现在你必须决定,对于名称和地址这样的共享值,哪套 ERP 是主要的,以及当客户存在于一套 ERP 中而不在另一套中时会怎样。

一个客户,两套 ERP 表示两套 ERP 中同一个客户的三种方式。A,客户层级,每套 ERP 一个子客户:一个父客户汇总这个客户,每个子客户对应一条 ERP 记录,但每个子客户实际上是这家公司在一个区域开展的业务;适用于各套 ERP 不保持同步、且你需要汇总的情况。B,平级客户,每套 ERP 一个:它展示销售已经熟悉的结构,没有隐藏任何东西,但全球报表需要一个关联平级客户的字段;适用于各套 ERP 不保持同步的情况。C,一个客户,每套 ERP 一个子记录:销售看到一个客户,订单在后台进入正确的 ERP,两套 ERP 或十套都行,但你必须决定名称和地址以哪套 ERP 为主,以及某套 ERP 中没有这个客户时怎么办;适用于客户方让其各套 ERP 保持同步的情况。下方写着:我们控制不了那些 ERP;我们控制的是在 Salesforce 中如何表示它们。 A:客户层级 每套 ERP 一个子客户 支持 一个父客户汇总这个客户 每个子客户对应一条 ERP 记录 反对 每个子客户都是这家公司在一个区域的业务 适用于 各套 ERP 不保持同步,且你需要汇总 B:平级客户 每套 ERP 一个客户 支持 展示销售已经熟悉的结构 没有隐藏任何东西 反对 全球报表需要一个关联平级客户的字段 适用于 各套 ERP 不保持同步 C:一个客户 每套 ERP 一个子记录 支持 销售看到一个客户 订单在后台进入正确的 ERP 两套 ERP 或十套都行 反对 名称和地址以哪套 ERP 为主? 如果某套 ERP 中没有这个客户怎么办? 适用于 客户方让其各套 ERP 保持同步 我们控制不了那些 ERP。我们控制的是在 Salesforce 中如何表示它们。 © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

一个客户,两套 ERP:在 Salesforce 中表示它的三种方式。

问他们如何让各套 ERP 保持同步

Section titled “问他们如何让各套 ERP 保持同步 ”

那么选哪一种?首先:**销售人员应该看到多少 ERP 结构?**如果他们一直都知道北美和欧洲是两项独立的业务,因为他们登录的是其中一套 ERP 或另一套,那就不要对他们隐藏这一点。把这种结构以平级客户的形式带进 Salesforce。如果业务方希望在销售面前只有一个 Steve’s Plumbing,那你考虑的就是一个客户、每套 ERP 一个子记录。

然后是真正起决定作用的问题,而它不是在 Salesforce 中决定的。我会问客户:**你们如何在各套 ERP 之间让这两条记录保持同步?**不是每套 ERP 本地的东西,比如余额;那是交易数据。我指的是主数据:法定名称、地址。如果他们有一个团队负责让两套 ERP 保持同步,我们就可以把它们合并成一个客户。如果他们在自己的 ERP 中都无法让它们保持同步,又怎么能指望我们在 Salesforce 中让它们保持同步?那就用平级客户,或者层级。

记住 ERP 是什么。这些是庞大的系统,需要数年才能落地,而且它们有自己管理主数据的方式。Salesforce 不会去驱动它们。我们控制不了 ERP。我们能控制的是如何在 Salesforce 中表示它们。

有些客户在我们到来之前就已经解决了这个问题。一家大公司,经营多年,有好几套 ERP:他们早在 Salesforce 之前就遇到了这个问题,并在中间放了一个专门的 MDM 产品,在各套 ERP 之间居中协调。这就是模块 2 中的共存式或集中式 MDM。现在 Salesforce 不再和每一套 ERP 分别对接。它指向一个地方,即 MDM 中心,并获得客户的单一表示。不过,别指望经常遇到这种情况。这些本身就是大型实施项目;这么多年来,我只参与过两三次。而且即使有了 MDM 中心,你可能仍然需要那个子对象,让每张订单知道它要发往哪套 ERP。

位于中间的 MDM 位于中间的 MDM。左边,Salesforce 的客户(每个客户一个)把数据发送到 MDM 中心里的黄金客户,即主控记录,MDM 中心再把受治理的值送回来。北美和欧洲两套 ERP 中的客户记录也一样:数据进入 MDM 中心,值送回。Salesforce 还为每套 ERP 保留一条 ERP 客户 ID 记录,这样订单仍然会进入正确的那一套。下方写着:Salesforce 只指向一个地方,即 MDM 中心,而不是指向每一套 ERP。 SALESFORCE MDM 中心 ERP 数据进入 值送回 数据进入 值送回 数据进入 值送回 持有 客户 每个客户一个 ERP 客户 ID 每套 ERP 一个,用于订单 黄金客户 主控记录 客户 ERP 北美 客户 ERP 欧洲 Salesforce 只指向一个地方,即 MDM 中心,而不是指向每一套 ERP。 © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

位于中间的 MDM:Salesforce 指向一个地方。

一个零售合作伙伴有它自己的结构:公司总部、区域事业部、配送中心、门店。Steve Trucking 拥有这个层级吗?不;合作伙伴是它自己组织结构的权威。但 Steve Trucking 可能需要它自己对这些地点的商业视图,用于合同、客户管理、服务和报表,也许是在合作伙伴下面为每个配送中心建一个子客户。两个合理的层级,两个权威。给它们起名字,不要假装一棵树就能代表所有的关系。

每当权威被拆分时,我都希望边界是可见的:字段命名、记录元数据、源系统标识符、权限、集成行为、文档。我不希望的是,一个开发人员要读完五个集成,才发现“这些上级客户的值来自 SAP,潜在客户除外,欧洲除外”。那不是一个可维护的权威模型。如果层级是分头主控的,就把这种拆分写下来。如果权威在转换时发生变化,就把这个变化写下来。如果 Salesforce 只能请求修改而不能直接修改,就让这一点在体验中一目了然。

在 Salesforce 中,这从一个字段开始。需要有一个字段明确说明这是主数据:ERP 的键,或者一个“是否为主数据”标志。用这个字段而不是记录类型来驱动字段的可编辑性;有了 Dynamic Forms,你不再需要记录类型来把 ERP 的字段显示为只读(第 5 章,每个数据流一个记录类型)。你可以允许在主控系统之外创建记录,但要盯住编辑。

考试之外:AI 改变了什么。一位客户告诉智能体:“把我们的账单地址改成 125 Main Street。”这个字段就在 Salesforce 里。智能体应该更新它吗?如果 ERP 拥有它,就不应该。智能体需要的是写入权威,而不只是字段访问权限:它的操作应该编码经批准的路径,即提交一个变更请求,并说“我已经提交了这项修改,正在处理中”,而不是谎称“我已经更新了您的账单地址”。

  • 在 Salesforce 中的一次编辑,是修改了权威数据,还是向拥有它的系统请求修改。
  • 双向数据流如何区分发起的变更和回声,并处理拒绝、冲突、延迟和故障。
  • 谁拥有每一个层级,必要时逐个分支地决定。
  • 对于存在于好几套 ERP 中的同一个客户:用层级、平级客户,还是一个客户、每套 ERP 一个子记录,取决于客户让其各套 ERP 保持同步的能力。
  • 相互竞争的层级是否其实是不同的合理关系:法律、计费、销售、服务。
  • 如何让用户、集成、开发人员和智能体看到权威边界和经批准的写入路径。

共享的权威不是问题。模糊的权威才是。好几个 ERP 可以主控不同的分支,Salesforce 可以主控某些属性、请求修改另一些属性,好几个层级可以描述同一个企业。这一切都行得通,只要对每一个重要的属性和关系,你都能说出谁拥有它,谁可以修改它,权威的修改在哪里进行,以及系统之间不一致时会怎样。如果你说不出来,在图上再加一个双向箭头也解决不了问题。