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 的客戶(Account),每位客戶一個,把資料送入 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 可以主控某些屬性、請求修改另一些屬性,好幾個層級可以描述同一個企業。這一切都行得通,只要對每一個重要的屬性和關係,你都能說出誰擁有它,誰可以修改它,權威的修改在哪裡進行,以及系統之間不一致時會怎樣。如果你說不出來,在圖上再加一個雙向箭頭也解決不了問題。