我希望创建一个通用组件,它可以将对象名称和字段名称与旧值和新值一起保存在 BigObject 中。蛮力算法说,在每个对象的每次更新时,使用描述获取字段 API 名称并检查这些字段的旧值和新值。如果它被修改,则将其插入新的 BigObject。但它会消耗大量的 CPU 时间,我正在寻找一个最佳解决方案来处理这个问题。任何建议表示赞赏。
1 回答
好吧,您已经编写了任何代码吗?也许对它进行基准测试,然后看看你可以优化什么,而不是从一开始就过度设计它......保持简单,编写测试工具,然后尝试优化(不破坏单元测试)。
几个随机的想法:
你会在触发器中这样做吗?所以你的“描述”只能发生一次。您不需要描述每个字段,您只需要在触发器的主循环之外进行一次操作。
Set<String> fieldNames = Account.sObjectType.getDescribe().fields.getMap().keyset(); System.debug(fieldNames);
这将为您提供“唯一”字段名称,但这已经足够了。您不在乎它们是选择列表还是日期或什么。将它与泛型一起使用,
sObject.get('fieldNameHere')
这是一个好的开始。或者可能根本没有描述。sObject
getPopulatedFieldsAsMap()
会给你很酷的地图,你可以轻松地迭代和比较。或
JSON.serialize
对象的旧版本和新版本,如果它们不相同 - 你知道该怎么做。不知道它们是否总是以相同的字段顺序序列化,所以检查地图是否相同可能会更好你真的需要像那样手工制作这个现场历史跟踪吗?您有 100 万条记录的免费存储空间,但它在繁忙的 SF 组织中很容易爆炸。特别是如果您有工作流、流程、其他触发器,这些触发器将在同一事务中转换为多个更新(= 多个触发器运行)。也许正常的字段历史跟踪 + 喋喋不休的提要跟踪 + 甚至 salesforce shield(我认为它带有 60 个跟踪的字段)会更适合您的业务需求。