天天看点

学习Salesforce:元数据和多租户驱动的PaaS数据模型设计

Salesforce Platform 是成功的云计算平台和应用程序生态系统的杰出范例。每天,数十万家企业和数百万用户使用由 Salesforce Platform 提供支持的应用程序在云中开展业务。

据统计,基于Salesforce Platform构建应用程序,IT成本可以降低 25%。

学习Salesforce:元数据和多租户驱动的PaaS数据模型设计

其良好的架构架解决方案具备这些特性:

  • 可信的(Trusted)
  • 简单的(Easy)
  • 适应性的(Adaptable)
学习Salesforce:元数据和多租户驱动的PaaS数据模型设计

使用 Salesforce Platform创建解决方案:

● 支撑了Salesforce预制的通用解决方案如销售云、营销云、服务云等。

● 支撑垂直行业解决方案例如金融和医疗保健等。

● 可以扩展 Salesforce 提供的预建解决方案如销售云、服务云、行业云等)。

● 根据企业特定需求,完全自定义新的应用程序。

为什么Salesforce平台如此成功?它为企业提供了哪些独特优势?这些都依赖于 Salesforce Platform独特的云计算软件架构和强大的底层数据模型。

一、Salesforce的数据模型

Salesforce Platform 具有独特的软件架构,支持易于构建、使用、定制和扩展的应用程序,具有卓越的性能和可靠性。其软件架构的核心是其多租户、元数据驱动的设计:

1、多租户支持

同时支持多个不同租户(组织、业务部门等)的不同需求,并实现租户间数据的隔离。

为了支持这种高度可定制和可扩展的架构,Salesforce Platform 的单个实例使用:

● 一个共享的多租户数据库,具有存储特定于租户的元数据和数据的单一架构。

● 一个多租户内核(应用程序运行时),它读取元数据和数据以在运行时为每个租户的用户动态提供特定于租户的应用程序、业务逻辑和 API。

Salesforce 管理的内核与租户管理的元数据的这种明确分离使得 Salesforce、租户和 ISV 可以独立地发展他们的系统部分而不受干扰。

2、元数据驱动

允许每个租户使用元数据、描述用户界面 (UI) 和业务逻辑等元素的数据,轻松快速地定制租户自己的应用程序和用户体验。

当使用 Salesforce Platform 创建新的应用程序对象或编写一些代码时,Salesforce平台不会在数据库中创建实际表或编译任何代码。Salesforce平台只是存储一些元数据,然后它可以在运行时使用这些元数据来动态具体化虚拟应用程序组件。

Salesforce平台确保每个租户的元数据都是私有的,并且无需任何锁定或停机即可轻松更新,因此每个租户都可以单独构建和自定义应用程序。

Salesforce Platform 使用相同的元数据来提供自定义 API、RESTful 和 Web 服务(基于 SOAP)接口,可以使用这些接口将应用程序与其他应用程序和自动化流程集成。

二、多租户数据模型

1、 多租户共享数据库表和数据隔离

学习Salesforce:元数据和多租户驱动的PaaS数据模型设计

Salesforce Platform 的应用程序运行时(runtime)和创新的数据层共同完成了每个租户的数据、schema自定义和业务逻辑的安全隔离。

在架构层,schema设计支持多租户的场景:

● 创建或定制应用程序时,平台会将相关元数据存储在共享数据库表中,这些表维护所有租户的元数据。

● 应用程序读写数据时,平台会将数据存储在共享数据库表中,这此表存储了所有租户的数据。

● 此外,平台还维护许多其它内部元数据,用来优化运行时的请求延迟。

但是,单个共享数据库和数据模型如何保证每个租户的数据隔离呢?

平台上的每个租户都被称为一个组织(Organization),简称org 。共享数据库表中的每个组织特定记录都有一个OrgID。当程序访问数据库时,它使用这个唯一标识符来确保每个组织的活动都是私有的。

学习Salesforce:元数据和多租户驱动的PaaS数据模型设计

2、 按租户进行数据分区

数据分区是数据库系统提供的一种经过验证的技术,可将大型逻辑数据结构物理地划分为更小、更易于管理的部分。

Salesforce平台的数据、元数据和数据透视表结构,包括底层数据库索引,都使用原生数据库分区机制按 OrgID 进行物理分区。

分区还有助于提高大型数据库系统(例如多租户环境)的性能、可伸缩性和可用性。

在多租户场景下,每次查询都针对特定组织的信息,因此查询优化器只需要考虑访问包含组织数据的数据分区,而不是整个表或索引。

3、 多租户的数据隔离和保护

为防止共享的多租户系统资源遭到恶意或无意的垄断或独占,Salesforce平台具有大量与平台代码执行相关的调控器和资源限制。例如,平台密切监控代码脚本的执行并限制它可以使用多少 CPU 时间、可以消耗多少内存、可以执行多少查询和 DML 语句、可以执行多少数学计算、可以执行多少它可以发出的出站 Web 服务调用等等。

对于执行成本太高而无法执行的个别查询,平台优化器会向调用方抛出运行时异常,这有助于保护所有相关应用程序的共享数据库系统的整体可伸缩性和性能。

三、基于元数据的数据模型

元数据允许用户创建独特的信息结构,以扩展或自定义 Salesforce应用。元数据还可以引用页面布局和安全设置。

当用户查看 Salesforce 页面时,系统会从元数据缓存中提取信息以创建页面,并在每次加载页面时重新编译超文本标记语言 (HTML)。

1、 元数据(Metadata)

特定组织(租户)的对象(认为是传统关系数据库用语中的表)、字段、存储过程、数据库触发器等,都是由元数据描述的虚拟结构,存储在通用数据字典 (UDD) 的数据库表中。

(1)MT_Objects

用于存储有关应用程序定义的对象的元数据的表,包括

○ 对象的唯一标识符 (ObjID)

○ 组织 (OrgID)

○ 对象指定的名称 (ObjName)

(2)MT_Fields

用于存储为每个对象声明的字段(列)的元数据的表,包括

○ 字段的唯一标识符(FieldID)

○ 组织(OrgID)

○ 包含该字段的对象(ObjID)

○ 字段 (FieldName)

○ 字段的数据类型(DataType)

○ 指示字段是否需要索引的布尔值 (IsIndexed)

○ 字段在对象中相对于其他字段的位置 (FieldNum)

由于元数据是关键要素,平台必须优化对元数据的访问;否则,频繁的元数据访问会阻止服务扩展。考虑到这一潜在的瓶颈,Salesforce平台使用大量复杂的元数据缓存来维护内存中最近使用的元数据,避免降低性能的磁盘 I/O 和代码重新编译,并缩短应用程序响应时间。

学习Salesforce:元数据和多租户驱动的PaaS数据模型设计

2、 数据(Data)

MT_Data系统表存储映射到所有组织特定表及其字段的应用程序可访问数据,如 MT_Objects 和 MT_Fields 中的元数据所定义。

MT_Data表的每行包括:

(1) 标识字段,全局唯一标识符 (GUID)

(2) 拥有该行的组织 (OrgID)

(3) 包含的对象标识符 (ObjID)

(4) 每一行还有一个 Name 字段,用于存储相应记录的“自然名称”;例如,客户记录可能使用“客户名称”,案例记录可能使用“案例编号”,等等。

(5) Value0 ... ValueN弹性(flex)列,也称为槽,存储应用程序数据,这些数据分别映射到 MT_Objects 和 MT_Fields 中声明的表和字段。所有弹性列都使用可变长度字符串数据类型,以便它们可以存储任何结构化类型的应用程序数据(字符串、数字、日期等)。

如下图所示,

● 同一对象的两个字段不能映射到MT_Data中的同一个slot进行存储;

● 单个槽可以管理多个字段的信息,只要每个字段源自不同的对象即可。

学习Salesforce:元数据和多租户驱动的PaaS数据模型设计

MT_Fields 可以使用多种标准结构化数据类型中的任何一种,例如文本、数字、日期和日期/时间,以及特殊用途的丰富结构化数据类型,例如选择列表(枚举字段)、自动编号(自动递增、系统生成的序列号)、公式(只读派生值)、主从关系(外键)、复选框(布尔值)、电子邮件、URL 等。

MT_Fields 可以设置是否允许不为空,并设置自定义验证规则(例如,一个字段必须大于另一个字段)。

当声明或修改一个对象时,平台会在 MT_Objects 中管理一行定义该对象的元数据。同样,对于每个字段,平台在 MT_Fields 中管理一行,包括将字段映射到 MT_Data 中特定弹性列的元数据,用于存储相应的字段数据。

因为Salesforce平台将对象和字段定义作为元数据而不是实际的数据库结构来管理,所以系统可以容忍在线多租户应用程序模式维护活动,而不会阻止其他组织和用户的并发活动。相比之下,传统关系数据库系统的在线表重新定义通常需要临时锁,并且通常需要费力、复杂的过程和计划的应用程序停机时间。

如上图 MT_Data 的简化表示所示,flex 列是一种通用数据类型(可变长度字符串),这使得平台可以在使用各种结构化数据类型(字符串、数字)的多个字段之间共享单个 flex 列、日期等)。

Salesforce平台使用规范格式存储所有弹性列数据,并在应用程序从弹性列读取数据和向弹性列写入数据时,根据需要使用底层数据库系统数据类型转换函数(例如,TO_NUMBER、TO_DATE、TO_CHAR)。

MT_Data 还包含有四列来管理审计数据,包括

● 哪位用户创建了一行以及该行的创建时间

● 哪位用户最后修改了一行

● 最后修改了该行的时间

● IsDeleted列,平台使用该列来指示行何时被删除。

Salesforce平台支持将字段声明为字符大对象 (CLOB),以允许存储最多 32,000 个字符的长文本字段。对于 MT_Data 中具有 CLOB 的每一行,平台将 CLOB 存储在名为MT_Clob 的表中,系统可以根据需要将其与 MT_Data 中的相应行连接。

注意:Salesforce平台还在数据库之外以索引形式存储 CLOB,以便进行快速文本搜索。

3、 索引(Indexes)

Salesforce平台自动索引各种类型的字段以提供可扩展的性能。

传统的数据库系统依靠原生数据库索引来快速定位数据库表中具有与特定条件匹配的字段的特定行。

但是,为 MT_Data 的 flex 列创建原生数据库索引是不切实际的,因为Salesforce平台使用单个 flex 列来存储具有不同结构数据类型的许多字段的数据。相反,Salesforce平台通过将标记为索引的字段数据同步复制到MT_Indexes数据透视表中的适当列来管理 MT_Data 的索引。

MT_Indexes 包含强类型索引列,例如 StringValue、NumValue 和 DateValue,平台使用这些列来定位相应数据类型的字段数据。例如,平台会将 MT_Data 弹性列中的字符串值复制到 MT_Indexes 中的 StringValue 字段,将日期值复制到 DateValue 字段,等等。

MT_Indexes 的底层索引是标准的、非唯一的数据库索引。当内部系统查询包含引用对象中结构化字段的搜索参数时,平台的自定义查询优化器使用 MT_Indexes 来帮助优化关联的数据访问操作。

学习Salesforce:元数据和多租户驱动的PaaS数据模型设计

注意:Salesforce平台可以处理跨多种语言的搜索,因为系统使用大小写折叠算法将字符串值转换为通用的、不区分大小写的格式。MT_Indexes 表的 StringValue 列以这种格式存储字符串值。在运行时,查询优化器自动构建数据访问操作,以便优化的 SQL 语句过滤相应的 case-folded StringValue,这又对应于搜索请求中提供的文字。

Salesforce平台允许设置对象中的字段何时必须包含唯一值(区分大小写或不区分大小写)。考虑到 MT_Data 的排列和字段数据的值列的共享使用,为对象创建唯一的数据库索引是不切实际的。(这种情况类似于上一节中针对非唯一索引讨论的情况。)

为了支持自定义字段的唯一性,Salesforce平台使用 MT_Unique_Indexes 数据透视表。该表与 MT_Indexes 表非常相似,除了 MT_Unique_Indexes 的底层原生数据库索引强制唯一性。当应用程序试图将重复值插入到需要唯一性的字段中,或者管理员试图对包含重复值的现有字段强制执行唯一性时,平台会向应用程序返回适当的错误消息。

在极少数情况下,平台的外部搜索引擎可能会过载或不可用,并且可能无法及时响应搜索请求。Salesforce平台不会向最终用户返回令人失望的错误,而是回退到二级搜索机制以提供合理的搜索结果。回退搜索作为直接数据库查询实现,搜索条件引用目标记录的名称字段。

为了优化全局对象搜索(跨表搜索)而不必执行可能昂贵的联合查询,Salesforce平台维护了一个MT_Fallback_Indexes数据透视表,该表记录了所有记录的名称。

MT_Fallback_Indexes 的更新在事务修改记录时同步发生,因此回退搜索始终可以访问最新的数据库信息。

MT_Name_Denorm表是一张精益数据表,存储了MT_Data中每条记录的ObjID和Name。当应用程序需要提供涉及父/子关系的记录列表时,平台使用 MT_Name_Denorm 表执行一个相对简单的查询,检索每个引用记录的名称以显示在应用程序中,例如作为超链接。

4、 关系(Relations)

Salesforce平台支持关系数据类型,组织可以使用这些类型来声明表之间的关系(参照数据完整性)。

当你声明一个对象的字段为关系类型时,平台将该字段映射到MT_Data中的一个Value字段,然后使用该字段存储相关对象的ObjID。

为了优化连接操作,Salesforce平台维护了一个MT_Relationships数据透视表。该系统表有两个底层数据库唯一复合索引,可根据需要在任一方向上进行高效的对象遍历。

学习Salesforce:元数据和多租户驱动的PaaS数据模型设计

四、内部数据处理

Salesforce平台Salesforce提供了非常好的性能和扩展性,因为 Salesforce 在构建它时考虑了两个重要原则:

● 提供高效、大规模的基础平台能力。

● 帮助开发人员尽可能高效地完成所有工作。

Salesforce平台将这些原则融入到平台独特的处理架构中,包括:

1、 查询(Queries)

大多数现代数据库系统通过采用查询优化器来确定最佳查询执行计划,该优化器考虑有关目标表和索引数据的相关统计信息。

然而,传统的、基于成本的优化器统计信息是为单租户应用程序设计的,无法考虑在多租户环境中执行查询的任何给定用户的数据访问特征。例如,对于以具有大量数据的对象为目标的给定查询,对于具有高可见性的用户(可以查看所有行的经理)和具有低可见性的用户(销售人员可以看到只看到与自己相关的行)。

为了提供足够的统计数据来确定多租户系统中的最佳查询执行计划,Salesforce平台为每个组织的对象维护了一套完整的优化器统计数据(租户、组和用户级别)。

统计信息反映了特定查询可能访问的行数,仔细考虑了整体特定于组织的对象统计信息(例如,整个组织拥有的总行数),以及更精细的统计信息(例如,特定权限组或最终用户可能访问的行数)。

Salesforce平台还维护其他类型的统计数据,证明对特定查询有帮助。例如,Salesforce平台维护所有自定义索引的统计信息以显示相应字段中非空值和唯一值的总数,以及显示每个列表值基数的选择列表字段的直方图。

当现有统计信息不存在或被认为没有帮助时,平台的优化器会使用一些不同的策略来帮助构建合理优化的查询。例如,当查询过滤对象的名称字段时,优化器可以使用 MT_Fallback_Indexes 表有效地查找请求的行。在其他情况下,优化器将在运行时动态生成缺失的统计信息。

Salesforce平台的优化器与优化器统计数据一起使用,还依赖于内部安全相关表(Groups、Members、GroupBlowout 和 CustomShare),这些表维护有关组织用户安全域的信息,包括给定用户的组成员身份和自定义访问权限对于对象和行。此类信息对于确定基于每个用户的查询过滤器的选择性非常宝贵。

下图中的流程图说明了当平台处理超大数据(例如 MT_Data中的数据)的请求时会发生什么。请求可能来自任意数量的来源,例如 API 调用或存储过程。

● 首先,Salesforce平台执行考虑多租户感知统计数据的“预查询”。

● 然后,根据预查询返回的结果,该服务构建一个最优的底层数据库查询以在特定设置中执行。

学习Salesforce:元数据和多租户驱动的PaaS数据模型设计

如下表所示,平台可以根据提交查询的用户和查询过滤条件的选择性,以四种不同的方式执行同一个查询。

学习Salesforce:元数据和多租户驱动的PaaS数据模型设计

2、 搜索(Searches)

用户期望交互式搜索功能能够扫描应用程序数据库的全部或选定范围,并以亚秒级响应时间返回排名结果。

为此,Salesforce平台使用了与其事务引擎分离的搜索引擎。当用户更新记录时,事务引擎会更新核心数据库,并将相关数据转发给搜索引擎进行索引。当用户搜索记录时,搜索引擎使用其索引快速处理查询并返回带有相关数据库记录链接的排名结果。

当应用程序更新文本字段(CLOB、名称等)中的数据时,称为索引服务器的后台进程池负责异步更新相应的索引,搜索引擎在核心事务引擎之外维护这些索引。

为了优化索引过程,平台在事务提交时将修改后的文本数据块同步复制到内部“待索引”表,从而提供相对较小的数据源,最大限度地减少索引服务器必须从磁盘读取的数据量. 搜索引擎自动为每个组织维护单独的索引。

根据索引服务器的当前负载和利用率,文本索引更新可能滞后于实际事务。为避免源自陈旧索引的意外搜索结果,Salesforce平台还维护一个 MRU 缓存,其中包含系统在具体化全文搜索结果时考虑的最近更新的行。Salesforce平台在每个用户和每个组织的基础上维护 MRU 缓存,以有效支持可能的搜索范围。

Salesforce平台的搜索引擎使用多种方法优化搜索结果中记录的排名。例如,系统会考虑执行搜索的用户的安全域,并将更多权重放在当前用户可以访问的行中。系统还可以考虑特定行的修改历史,并将更活跃更新的行排在相对静态的行之前。用户可以根据需要选择对搜索结果进行加权,例如,更加强调最近修改的行。

3、 批量操作(Bulk Operations)

批量执行重复操作时性能更好。例如,对比应用程序可能加载许多新行的两种方式。一种低效的方法是使用带有插入单独行的循环的例程,为插入的每一行进行一次又一次的 API 调用。一种更有效的方法是创建一个行数组,并让例程通过单个 API 调用插入所有行。

使用Salesforce平台进行高效的批量处理对于开发人员来说很简单,因为它被嵌入到 API 调用中。在内部,Salesforce平台还批量处理与显式批量操作相关的所有内部步骤。

Salesforce平台的批量处理引擎会自动解决在此过程中任何步骤中遇到的孤立故障。当批量操作以部分保存模式启动时,引擎会识别一个已知的开始状态,然后尝试执行流程中的每个步骤(批量验证字段数据、批量触发预触发、批量保存记录等)。如果引擎在任何步骤中检测到错误,引擎将回滚违规操作和所有副作用,删除导致错误的行,然后继续,尝试批量处理剩余的行子集。此过程遍历每个连续的阶段,直到引擎可以提交行的子集而没有任何错误。

注意:用户可以使用全有或全无模式进行批量操作。批量操作期间触发器的执行受制于限制工作量的内部调控器。

4、 Schema修改

对对象定义的某些类型的修改需要的不仅仅是简单的 UDD 元数据更新。在这种情况下,Salesforce平台使用有效的机制来帮助减少对整个云数据库服务的整体性能影响。

● 示例1,将列数据类型从选项列表修改为文本。Salesforce平台首先为列的数据分配一个新槽,批量复制与当前值关联的选择列表标签,然后更新列的元数据,使其指向新槽。虽然所有这些都发生了,但对数据的访问是正常的,应用程序继续运行而没有任何明显的影响。

● 示例2,将汇总字段添加到对象。平台使用高效的批量操作在后台异步计算初始汇总。当后台计算正在进行时,查看新字段的用户会收到指示:平台当前正在计算字段值。

五、基于平台的应用开发

开发人员如何创建架构的基础元数据,然后构建管理数据的应用程序。该元数据和数据存储在上一节中描述的平台数据层中。

1、 无代码和低代码

Salesforce平台提供了可视化界面,用于支持应用程序构建过程的所有方面,包括创建应用程序的数据模型(包括对象及其字段以及关系)、安全和共享模型(包括用户、档案和角色层级)、用户界面(包括页面布局、数据输入表单和报表)、创建工作流和编程逻辑(存储过程和触发器)。

例如,Salesforce Flow 可以轻松实现各种用例的自动化,Flow Builder UI(如下所示)能够以图形方式设计和实施与用户互动的工作流,通过按计划时间或事件触发自动启动工作流。

学习Salesforce:元数据和多租户驱动的PaaS数据模型设计

低代码平台可以使用户轻松开发和自定义应用程序,而无需(或很少)代码。例如:

● 无需任何代码即可轻松构建平台原生 UI。

● 为包含敏感数据的对象定义文本字段时,支持加密机制。

● 支持声明字段验证规则,比如以确保 LineItem 对象的 Quantity 字段始终大于零。

● 支持计算公式字段,并可以轻松地将计算字段添加到对象。例如,用户可以向 LineItem 对象添加一个字段来计算 LineTotal 值。

● 支持汇总字段,其是一个跨对象字段,可以轻松聚合父对象中的子字段信息。例如,用户可以根据 LineItem 对象的 LineTotal 字段在 SalesOrder 对象中创建一个 OrderTotal 汇总字段。

注意:在实现上,平台使用原生数据库功能实现公式和汇总汇总字段,并在运行时重新计算值。

2、 APIs

Salesforce平台提供了开放的、基于标准的 API,开发人员可以使用它们来构建应用程序,包括RESTful 和 Web 服务(基于 SOAP)API 。使用这些不同的 API,应用程序可以:

● 操纵描述应用程序模式的元数据

● 创建、读取、更新和删除 (CRUD) 业务数据

● 批量加载或异步查询大量记录

● 以安全且可扩展的方式公开近乎实时的数据流

3、 查询语言

(1)Salesforce 对象查询语言 (SOQL)

应用程序可以使用Salesforce 对象查询语言 (SOQL)构建简单但功能强大的数据库查询。类似于结构化查询语言 (SQL) 中的 SELECT 命令,SOQL 使用户能够指定源对象、要检索的字段列表以及在源对象中选择行的条件。例如,以下 SOQL 查询返回名称等于字符串“Acme”的所有客户记录的 ID 和名称字段的值。

SELECT Id, Name FROM Account WHERE Name = 'Acme'

(2)Salesforce 对象搜索语言 (SOSL)

平台还包括一个全文、多语言搜索引擎,可以自动索引所有与文本相关的字段。应用程序可以通过使用Salesforce 对象搜索语言 (SOSL)来执行文本搜索,从而利用这个预集成的搜索引擎。

与一次只能查询一个对象的 SOQL 不同,SOSL 使用户能够同时搜索多个对象的文本、电子邮件和电话字段。例如,以下 SOSL 语句在 Lead 和 Contact 对象中搜索姓名字段中包含字符串“Joe Smith”的记录,并从找到的每条记录中返回姓名和电话号码字段。

FIND {"Joe Smith"} IN Name Fields RETURNING lead(name, phone), contact(name, phone)

4、 Apex 和 Pro-Code 应用程序开发

Apex在许多方面与 Java 相似,是一种功能强大的开发语言,开发人员可以使用它来将过程逻辑集中在他们的应用程序模式中。Apex代码可以声明程序变量和常量,执行传统的流程 控制语句(if-else、循环等),执行数据操作操作(insert、update、upsert、delete),执行事务控制操作(setSavepoint、rollback)。

可以使用两种不同的形式将 Apex 程序存储在平台中:

● 作为应用程序在必要时执行的带有方法(类似于传统数据库用语中的存储过程)的命名 Apex 类;

● 作为在特定数据库之前或之后自动执行的数据库触发器操纵事件发生。

无论采用哪种形式,平台都会编译 Apex 代码并将其作为元数据存储在 UDD 中。组织第一次执行 Apex 程序时,平台的运行时解释器将程序的编译版本加载到该组织的 MRU(最近使用的)缓存中。此后,当来自同一组织的任何用户需要使用相同的例程时,平台可以通过共享已在内存中的准备运行程序来节省内存并避免再次重新编译程序的开销。

通过在各处添加一个简单的关键字,开发人员可以使用 Apex 来支持许多独特的应用程序需求。例如,开发人员可以将方法公开为自定义 RESTful 或基于 SOAP 的 API 调用,使其可异步调度,或将其配置为批量处理大型操作。

Apex 不仅仅是“另一种程序语言”。它是一个不可或缺的平台组件,可帮助系统提供可靠的多租户。例如,Salesforce平台会自动验证类中所有嵌入的 SOQL 和 SOSL 语句,以防止代码在运行时失败。然后,Salesforce平台为有效类维护相应的对象依赖信息,并使用它来防止元数据发生更改,进而会破坏相关代码。

许多标准 Apex 类和系统静态方法为底层系统功能提供简单的接口。例如,插入、更新和删除等系统静态 DML 方法有一个简单的布尔参数,开发人员可以使用它来指示所需的批量处理选项(全部或全部,或部分保存);这些方法还返回一个结果对象,调用例程可以读取该对象以确定哪些记录未成功处理以及原因。Apex 和平台功能之间直接联系的其他示例包括内置电子邮件类和 XmlStream 类。

·

六、小结

作为 Sales Cloud 和 Service Cloud 等应用程序的基础,Salesforce 是一个经过验证的应用程序开发平台,来自全球的企业和服务提供商已经构建了数百万个业务应用程序,包括供应链管理、计费、会计、商务、合规性跟踪、人力资源管理等等。

Salesforce平台独特的多租户、元数据驱动的架构专为云设计,可靠、安全地支持关键任务、互联网规模的应用程序。

使用基于标准的 API 和原生开发工具,平台开发人员可以轻松构建现代 Web 或移动应用程序,包括应用程序的数据模型(包括对象和关系)、业务逻辑(包括工作流和验证)等等。

Salesforce 通过托管方式部署生产应用程序,可确保依赖Salesforce平台的所有应用程序具有出色的性能、可扩展性和可靠性。同时,Salesforce 持续监控和收集来自平台应用程序的操作信息,以帮助改进现有应用程序和指导创建新的应用程序。

(资料来源于Salesforce.com)

关注公众号领取大礼包

继续阅读