0

我希望创建一个通用组件,它可以将对象名称和字段名称与旧值和新值一起保存在 BigObject 中。蛮力算法说,在每个对象的每次更新时,使用描述获取字段 API 名称并检查这些字段的旧值和新值。如果它被修改,则将其插入新的 BigObject。但它会消耗大量的 CPU 时间,我正在寻找一个最佳解决方案来处理这个问题。任何建议表示赞赏。

4

1 回答 1

2

好吧,您已经编写了任何代码吗?也许对它进行基准测试,然后看看你可以优化什么,而不是从一开始就过度设计它......保持简单,编写测试工具,然后尝试优化(不破坏单元测试)。

几个随机的想法:

  • 你会在触发器中这样做吗?所以你的“描述”只能发生一次。您不需要描述每个字段,您只需要在触发器的主循环之外进行一次操作。

    Set<String> fieldNames = Account.sObjectType.getDescribe().fields.getMap().keyset(); System.debug(fieldNames);

    这将为您提供“唯一”字段名称,但这已经足够了。您不在乎它们是选择列表还是日期或什么。将它与泛型一起使用,sObject.get('fieldNameHere')这是一个好的开始。

  • 或者可能根本没有描述。sObjectgetPopulatedFieldsAsMap()会给你很酷的地图,你可以轻松地迭代和比较。

  • JSON.serialize对象的旧版本和新版本,如果它们不相同 - 你知道该怎么做。不知道它们是否总是以相同的字段顺序序列化,所以检查地图是否相同可能会更好

  • 你真的需要像那样手工制作这个现场历史跟踪吗?您有 100 万条记录的免费存储空间,但它在繁忙的 SF 组织中很容易爆炸。特别是如果您有工作流、流程、其他触发器,这些触发器将在同一事务中转换为多个更新(= 多个触发器运行)。也许正常的字段历史跟踪 + 喋喋不休的提要跟踪 + 甚至 salesforce shield(我认为它带有 60 个跟踪的字段)会更适合您的业务需求。

于 2018-12-19T08:26:54.107 回答