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