跨 Object 引用关系在 Objec 级别上的限制

在 Salesforce 中创建 formula field, validation rule, workflow rule, approval process 都是比较常见的,而跨对象引用也经常会在其中用到。但是随着项目的扩大,对象间的关联关系越来越多,跨对象关系的引用也将受到限制。

每个对象上默认最多只能有 10 个跨对象的引用关系。当你在某个对象上创建 formula(in a formula field, field update or validation rule) 引用的时候,恰好该对象上的引用关系已经达到了 10 个,你就会收到一个类似这样的错误信息:

“You have reached the maximum number of 10 object references on [Object name] You must remove at least 1 relationship(s) in order to save this [Workflow Rule/formula field/..].”

10 个跨对象引用关系的限制实际是一种警告信息,当达到这个限制的时候就意味着在该对象上的引用逻辑已经太复杂、太庞大了。

什么是跨对象引用关系?

对象之间可以通过创建关系字段(Lookup/Master-Detail)关联起来。当对象之间互相关联以后,就可以通过创建 formula 引用来获取其他对象上的字段。

比如,现在有两个对象 Object1 和 Object2,在 Object1 上有一个 Lookup 到 Object2 的字段,我们可以在 Object1 上创建一个 formula 字段来存 Object2 上的字段信息,比如存 Object2 的 Owner,这样的 formula 字段就是使用跨对象引用关系的一种典型例子。

值得注意的是,自我引用的 lookup 关系也被当作一种跨对象引用关系,比如,Contact 上有一个 lookup 到它自己的字段,通过这个 lookup 关系创建的 formula 字段也会算作一个跨对象引用关系。

哪些地方会用到跨对象引用关系

  1. formula fields
  2. validation rules
  3. workflow rules and field update actions
  4. approval processes
  5. assignment rules
  6. escalation rules
  7. auto-response rules

怎样区分引用关系与非引用关系,怎样计算引用关系的个数

假如我们在 Case 上创建 formula 字段的时候,用到了下面某一种情况的引用:

  1. AccountId -- 0 relationship;
  2. Account.Id -- 1 relationship;
  3. Account.Owner.LastName -- 2 relationships (这两个关系分别是 Case - Account 和 Account - Owner)
  4. Parent.CaseNumber -- 1 relationship (Case-Case)
  5. CreatedBy.Profile.LastModifiedBy.Profile.Name -- 4 relationships (User-Profile-User-Profile)
  6. $User.ProfileId -- 0 relationship (引用全局变量不算在 Case 对象的引用关系中)

比如,在下面的 formula 定义中用到了 3 个引用关系,分别是 LastModifiedBy, CreatedByCreatedBy.Profile, 虽然CreatedByLastModifiedBy 分别出现了两次,但都只记做了一次引用,说明这里跟引用次数无关。

LastModifiedBy.LastName + LastModifiedBy.FirstName + CreatedBy.Profile.Name + CreatedBy.CompanyName  

什么情况下会达到此限制

类似以下情况都会达到此限制:

  1. 在某个对象上有 10 个 formula 字段,并且每个字段都分别引用了不同的对象。
  2. 在某个对象上有 5 个 formula 字段,并且每个字段都分别引用了不同的对象;同时在这个对象上创建了 5 个分别引用了另外 5 个不同对象的 workflow field update。
  3. 在某个对象上有一个 formula 字段,一个 validation rule,一个 workflow rule,一个 approval process 和一个 assignment rule,它们分别引用了 2 个不同的对象。

减少跨对象引用关系的方法

  1. 创建 formula 字段是不是必要的?

    创建 formula 字段的时候要谨慎,如果只是想在数据的 detail 页面显示这个字段,不需要在 report 里用,就可以建议用户通过 hover 相应的 lookup 字段来查看相关信息。
  2. 某个跨对象引用只在 validation rule 中用到了?

    比如 Object2__r.Name 只出现在了 validation rule 里面,没有在其他地方(workflow rule/formula field)用到,这种情况就可以用trigger来代替 validation rule。
  3. 某个跨对象引用只在 workflow rule 中用到了?

    类似于第二种情况,可以用 trigger 来代替 workflow rule.

增加每个对象上跨对象引用关系的限制数量

系统管理员可以通过 Salesforce Support 功能在 Help&Training 页面提交一个 Case 把此限制从 10 个增加到 15 个.