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 desk in the foreground, a filing cabinet in the next room through an open door, and through the window a shed with archive boxes at the back of the yard.
图片由 AI 生成

第 4 个模块,共 10 个,属于 Data Architect 课程第 3 章Salesforce 数据架构。每个模块都可以单独阅读。 上一篇:自己动手:自定义对象 · 下一篇:选择合适的对象

**本模块回答的问题:**在创建对象之前,这些数据实际上应该放在哪里:放在 Salesforce 的核心之上,在它原本所在的地方引用,还是归档?

我问你一个问题。一项新需求落到你桌上。你做的第一件事是什么?

如果你和我们大多数人一样,你会打开设置,创建一个自定义对象。我理解。十分钟后,你就有了一个选项卡、一个页面布局和一个列表视图。而我会告诉每个班的是:从你创建那个新对象的那一刻起,不管你是否有意,你已经在像架构师一样思考了。因为你创建的每一个对象都是一份承诺。它占用存储。它会碰上限制。它会有一个共享模型,不管你有没有设计过。每一个接触它的人都需要一个许可。而一旦人和集成依赖上它,想拿掉它就难了。

所以第一个架构决定不是哪个对象,而是*这些数据应该放在哪里?*把这个做对,对象类型几乎会自己选出来。

先说一个我会经常用到的词:核心(core)。核心就是你的 org 所运行的 Salesforce 平台:模块 1 讲的那个元数据驱动的多租户平台,模块 2 里的 Sales 和 Service 对象就放在这里,你在模块 3 中构建的每一个自定义对象也在这里。当我说数据在核心之上(on core)时,我的意思是它存储在你的 org 里,存储在 org 的对象中。

并不是所有数据都放在那里。Data 360 把它的数据保存在自己的存储中,在你的 org 的对象之外(它是近核心(near-core)的:在核心之上管理,数据托管在核心之外;详见第 4 章)。此外,还有你公司运行的、根本不是 Salesforce 的一切:ERP、仓库、订单系统、合作伙伴的平台。所有这些都在核心之外(off core)。Salesforce 可以访问它、显示它、使用它,但你的 org 并不存储它。

在核心之上,真正保存你的记录的对象有两种:sObject,包括标准对象和自定义对象(__c),以及大对象(__b)。在核心之外,你通过外部对象(__x)和其他集成工具来访问数据。记住模块 3 里的这些后缀;光看名字,它们就能告诉你一份数据放在哪里。

我把它想象成一间办公室。有些东西属于你的办公桌,你每天都在用。有些东西你只需要去别人的文件柜里查一下。还有些东西装进箱子,放到后院的棚子里。这给了我三个答案。

1. 核心之上:它放在你的办公桌上

Section titled “1. 核心之上:它放在你的办公桌上 ”

数据每天都在 Salesforce 中被创建、修改和使用:客户、个案、业务机会、工作订单。把它放在 sObject 里,就像把它放在办公室的最前面。这正是标准对象和自定义对象的用途,你能得到一切:页面布局、共享、自动化、报表、搜索,还有现在构建在数据模型之上的 AI 功能。

不过,你的办公桌并不是免费的。核心之上的数据要占用存储,而且是按 Salesforce 的方式来计算:按记录计算,而不是按列计算;文档则单独计入文件存储。这两点我们都在模块 2里讲过。大量的照片和扫描件往往应该放在核心之外,Salesforce 只保留一个链接。

2. 引用:它放在别人的文件柜里

Section titled “2. 引用:它放在别人的文件柜里 ”

数据属于另一个系统(ERP、数据仓库、订单平台),而那个系统仍然是真相的来源。用户需要在 Salesforce 中看到它,也许还要把它与某条记录关联,但 Salesforce 不需要拥有自己的副本。你还会听到有人把它叫作虚拟数据:它以虚拟的方式出现在 Salesforce 中,却从未存储在那里。

这就是通过 Salesforce Connect 使用的外部对象。我常说,它看起来像鸭子,走起来像鸭子,但它不是鸭子。它表现得像一个 sObject:你可以把它放到页面布局和相关列表上,并通过外部查找和间接查找把它与你自己的记录关联起来。但数据并不存储在核心之上。**每次你访问它,它都会发起一次外部调用。**打开一条记录、加载一个相关列表、运行一份报表,Salesforce 都要去问另一个系统。这意味着延迟,而且你的页面的可用性取决于它背后的那个系统。

人们会对许可费用有异议,所以像我在课上那样算一笔账。Connect 按端点授权,一个端点可以接入很多个对象。再问一问构建和维护替代方案要花多少钱:一个自定义组件,它背后的外部调用代码,以及出问题时随叫随到的开发人员。许可往往更便宜,而且你的管理员不用写一行代码就能配置它。它不适合的地方:用户整天都在编辑的数据,或者需要大量做报表的数据。

文档也可以被引用。如果一份合同已经放在 SharePoint Online、OneDrive、Google Drive 或 Box 里,Files Connect 能让用户在 Salesforce 中访问它,而无需把它复制进来。

Salesforce Connect 并不是引用数据的唯一方式。有时用的是自定义逻辑:用代码实时调用另一个系统,并把它的数据呈现在页面上,不保留任何副本。这给了你完全的控制权,也让你对外部调用、错误和日常维护负全部责任。而 Data 360 也能在不复制的情况下做联邦访问。这个选择有专门的一章来讲(Virtualization, Federation, and Zero-Copy)。在这里,重点是这个决定本身:引用,而不是复制。

历史、审计轨迹、旧的交易。你必须保留它们,有时要保留好几年,但几乎没人会打开。而这正是团队一拖再拖的事。当有学员告诉我他们有一个 5,000 万条记录的对象,问为什么要归档时,我会反问:**如果你今天不归档,你还会有归档的那一天吗?**今天 5,000 万,你正在奔向 1 亿、1.5 亿、2 亿。

棚子有两个。一个在核心之上:大对象。可以把它们想象成把数据存放在车库里。你可以存放海量的记录,但不能把它们放到页面布局上,没有标准的界面或报表,而且要通过大对象的索引来查询,按精确匹配或范围查询(Big Objects Best Practices (opens in a new tab),英文)。安全只有对象和字段权限,没有记录共享,自动化也不会在它们上面运行。我用过几十次 Salesforce Connect,大对象却只用过一两次。它们能用,但很别扭,为了拿到数据,我也写过不少变通方案。所以我的建议是:**在建议使用之前先做个原型,**并在选择它之前就规划好人们如何找到这些数据。

另一个棚子在核心之外:放在别处的一个数据仓库或数据库(Designing for Scale)。这往往是更好的棚子,而且它不一定要藏起来看不见。放在核心之外的归档数据仍然可以通过 Tableau 这样的工具出现在报表里;当有人需要回头查看时,也仍然可以通过 Salesforce Connect 或其他虚拟化方式从 Salesforce 访问到它。

讲一个我们从一开始就做对了的项目。一个零售客户有 1,200 多家门店。他们告诉我:“我们每家门店每天只有一百个预约。没什么大不了的。”然后我算了一下:每天一百个,每周六天(一年大约 305 天),1,200 家门店,一年就是 3,600 多万个预约。接着他们提到,每次到店会产生两个预约,一个在前台,一个在后面的店里:一年 7,300 多万条记录。然后他们还想要五年的历史:还没算任何增长,就已经超过 3.6 亿条记录。我们还没上线,我就已经看到这列火车正直奔大数据量那一站而去。所以在收集第一个预约之前,归档就已经建好了:较早的预约移到大对象里,搜索界面显示当前的预约,归档的预约就列在下方。多年以后,它仍然运行良好。

这些数据放在哪里? 三个面板。核心之上,你的办公桌:每天都在用的数据,放在以 __c 结尾的标准和自定义 sObject 中,带有布局、共享、自动化和报表,占用数据和文件存储。引用,别人的文件柜:另一个系统是事实来源,通过虚拟方式访问,即 Salesforce Connect 中以 __x 结尾的外部对象,或自定义的实时调用;每次访问都是一次外部调用,可用性取决于来源。归档,后院的棚子:保留多年、很少打开,在核心之上放在以 __b 结尾的大对象中,或在核心之外放在数据仓库或数据库中,仍能通过 Tableau 或 Salesforce Connect 找到。底部:核心之上指存储在你的 org 里;核心之外指 Data 360 自己的存储,以及每一个不是 Salesforce 的系统。 核心之上 你的办公桌 每天都在用 标准和自定义 sObject,__c 布局、共享、自动化、报表 占用数据和文件存储 引用 别人的文件柜 另一个系统是事实来源 虚拟:Connect __x,或自定义调用 每次访问都是一次外部调用 可用性取决于来源 归档 后院的棚子 保留多年,很少打开 核心之上:大对象,__b 核心之外:数据仓库或数据库 仍能找到:Tableau、Connect 核心之上:存储在你的 org 里。核心之外:Data 360 自己的存储,以及每一个不是 Salesforce 的系统。 © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Steve Trucking 是我们贯穿始终的情景:一家家族经营的最后一公里配送公司,它从大型零售商的配送中心提取家电和电子产品,然后送到客户家里并安装。它的四类数据,三个答案:

数据放在哪里原因
今天的配送、配送小组和预约核心之上调度员和配送小组整天都在用它
零售商的订单详情引用(或在核心之上保留一份精简副本)零售商的系统是真相的来源
三年前的配送历史归档为索赔和趋势分析而保留;几乎没人打开
配送照片核心之外,保留链接每天成千上万张;存储在 Salesforce 之外,在配送上保留一个链接

下面把同样的内容画成数据模型。配送(Delivery)放在核心之上,人们整天都在用它。三年之后,它会移到配送历史(Delivery History)中,这是一个大对象:仍在核心之上,但已经放进了棚子。合作伙伴的订单以外部对象 __x 的形式出现:Salesforce 把配送与它关联起来,但数据仍留在零售商的系统里。而照片完全放在核心之外,由配送上的一个链接指向它们。一个模型,三个归宿。

Steve Trucking 的核心之上与核心之外 Steve Trucking 的数据分在两个区域。核心之上:零售合作伙伴发送配送,三年后,每次配送移入配送历史,这是一个以 __b 结尾的大对象,仍在核心之上,但已归档。核心之外:每次配送履行一个合作伙伴订单,这是一个以 __x 结尾的外部对象,它的数据保留在零售商的系统中;配送还链接到存放在 Salesforce 之外照片存储中的配送照片。 核心之上 核心之外 发送 履行 链接到 移入 零售合作伙伴 核心之上:客户 配送 核心之上:整天都在处理 配送历史(__b) 核心之上,已归档:大对象 合作伙伴订单(__x) 核心之外:零售商的系统 配送照片 核心之外:照片存储 恰好一个 零个或一个 一个或多个 零个或多个 © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

每个真实的 org 都有这三类。陷入麻烦的那些,都是把所有东西都放在了核心之上,因为创建对象是默认的那个按钮。

  • **每类数据的归宿,**在设计任何对象之前:核心之上、引用还是归档。
  • **真相的来源。**如果另一个系统拥有这些数据,Salesforce 就不应该悄悄地成为第二个主控方。
  • **任何核心之外数据的访问路径。**引用的数据需要一个可用的来源和可接受的延迟;归档的数据需要一种让人找到它的方法。
  • **存储增长。**现在就把账算清楚(每天的记录数,乘以增长,乘以保留期限),而不是等到存储警告来了再算。

**考试之外:AI 抬高了“核心之上”的筹码。**AI 功能和智能体在平台能理解的数据上效果最好:放在标准对象和自定义对象中、命名良好、描述清楚的数据。这是一股促使你把更多数据放到核心之上的拉力。对不合适的数据,要抵制它。一个基于 ERP 数据过时副本来落地的智能体,会给出自信而错误的答案。更好的做法往往是引用实时来源,或者只在核心之上保留一小块描述清楚的数据。AI 在哪里读取数据,现在也成了决定数据放在哪里的一部分。