本篇参考:
https://trailhead.salesforce.com/content/learn/modules/big_objects
我们在salesforce学习工作中,接触到很多的 标准的 object ,自定义 object 以及外部object。我们使用SOQL / SOSL 进行搜索,熟知他们的各种limitation,查询50000,DML 10000等等。
当数据量很多时,salesforce推荐我们where查询时要适当使用索引字段增快查询效率。我们做自定义开发开始效率都很好,随着数据越来越多,performance问题可能慢慢的出来。所以设计表的时候,表潜在的数据量可能会达到多少也是一个很重要的思考。
salesforce有一个 Big Object的概念,针对特别庞大的数据,可以使用 Big Object进行存储。所以问题来了?多少数据量算是庞大?
十万? 百万? 千万? 再往上好像很难在想象。不过在实际的一些特殊的业务场景这些数据量可能是远远不够的。举个例子,金融 / 保险等对钱敏感企业,可能会关心每一步的履历操作,针对每一步都需要记录,后期便于审计和追踪。这种数据通常会达到数以亿计。在salesforce中,Big Object 为十亿或更多记录提供一样的性能,并且可以通过一组标准api访问org或外部系统。也就是说如果潜在数据量可能达到10亿及以上,推荐使用 Big Object。
一. 应用场景与Big Object创建
在Salesforce中通常会有以下几种场景可能用到Big Object:
Customer 360:您有很多想要存储的客户信息。从忠诚度计划到交易、订单和账单信息,使用一个Big Object来跟踪每一个细节。
审计和追踪:salesforce提供了 field tracking的功能,每个表最多可以20个字段进行tracking,保留最多18个月,如果标准的满足不了审计和追踪的需要,可以考虑使用 big object实现。
历史归档:需要保持对历史数据的访问,以便进行大数据分析等目的情况下,可以考虑使用Big Object。
一. Big Object创建
1. Setup 搜索 big objects 以后选择Big Objects既可以查看当前的所有的 Big Objects,我们点击 new就可以新建一个 Big Object.
下图中是我们创建的一个 big object。可以看到目前的状态是 In Development,只有存在自定义索引字段才可以变成 development。
接下来我们按照要求创建一些自定义的字段,因为需要索引字段,索引字段前提是自定义字段要求勾选 required,所以真实的项目需要设计好哪些字段必填,哪些字段需要成为索引字段,一旦设计完索引字段便无法进行修改,想要修改只能重新创建 big object. 当我们创建完自定义字段以后创建自定义索引,索引最多只允许5个自定义的字段,最少也需要1个。
创建完字段接下来我们就需要编辑当前的 big object,将 object的 deployment status修改成 Deployed,则 一个Big Object创建完成。
这里创建和普通的 object创建还是有一些区别的:
1. 后缀不同,普通的是 __c, big object是 __b.
2. 可选择的字段类型不同。 big object所能选择的类型更少,只可以选择 Lookup, Date/time, Email, Number, Phone, Text, TextArea(Long),URL.
二. 数据创建删除和查询
在聊如何创建和查询数据以前,先聊一下上面提到的序列 index。 我们以前学习SQL server等关系型数据库时,也接触过序列的概念。一言以蔽之:索引是对数据库表中一个或多个列的值进行排序的结构。索引是经过某种算法优化的,所以在针对某个索引字段查询时,查询次数会少很多,查询性能自然得到提升,我们可以将数据库索引好比是一本书前面的目录,能加快数据库的查询速度。salesforce object很多标准字段带了索引,可以查看上面的链接进行详细查看。
数据库索引有三种类型: 唯一索引 / 主键索引 / 聚集索引。 salesforce big object 应该是基于唯一索引来实现的。唯一索引是不允许其中任何两行具有相同索引值的索引。根据上面的表结构,索引使用 Rider_Account__c 以及 Start_Time__c 两个值共同作用,所以当有两条记录的这两个值均相同情况下,数据库只会创建一条数据。
big object可以通过 bulk api以及apex来创建, bulk api也是一个很大的章节,这里不做讲解,后期争取单独讲一下,这里的创建使用apex方式来进行。
apex通过 insertImmediate方法去插入数据,如果索引对应的字段值都是相同的,则只会生成一条数据,后面的会覆盖前面的值。
Datetime now = System.now(); List<Rider_History__b> riderHistoryList = new List<Rider_History__b>(); Rider_History__b riderHistory1 = new Rider_History__b(); riderHistory1.Start_Time__c = now; riderHistory1.Rider_Account__c = 'test'; riderHistory1.Rider_Rating__c = 12.1; riderHistory1.Service_Type__c = 'test'; riderHistory1.Start_Location_Latitude__c = 12.123; riderHistory1.Start_Location_Longitude__c = 123.12; riderHistoryList.add(riderHistory1); Rider_History__b riderHistory2 = new Rider_History__b(); riderHistory2.Start_Time__c = now; riderHistory2.Rider_Account__c = 'test'; riderHistory2.Rider_Rating__c = 13.2; riderHistory2.Service_Type__c = 'test'; riderHistory2.Start_Location_Latitude__c = 12.123; riderHistory2.Start_Location_Longitude__c = 123.12; riderHistoryList.add(riderHistory2); Database.insertImmediate(riderHistoryList);
可以查看到数据库的内容如下
删除时使用 deleteImmediate方法。
List<Rider_History__b> historyList = [SELECT Id,Rider_Account__c,Start_Time__c from Rider_History__b WHERE Rider_Account__c = 'test' ]; Database.deleteImmediate(historyList);
展示结果:
说完创建和删除接下来说查询。big object支持两种查询,同步 SOQL以及异步的SOQL。
如果 可以确定查询出来的数据量少想要在 apex中使用,我们可以使用SOQL进行查询,但是不是所有的SOQL语法可以使用。如果想要使用这种同步的SOQL,有以下的限制:
- 当构建 序列的query时, query的第一个字段和最后一个字段间不要有空隙;
- !=, LIKE, NOT IN, EXCLUDES, and INCLUDES 不支持;
- 聚合函数不支持;
- 不要使用Id字段进行查询;
- 查询时必须包括索引字段,非索引字段不能作为where后查询的条件。
部分截图
异步SOQL以及在report / dashboard使用自行查看上方文档。
三. Big Object 限制
由于大对象的运行规模很大,它们不能完全像非大对象那样工作。使用大对象时,请记住以下几点。
大对象仅支持对象和字段权限。
部署大对象后,您将无法编辑或删除索引。要更改索引,请从一个新的大对象开始。
SOQL关系查询基于从选择字段列表中的大对象到标准或自定义对象的查找字段(不在过滤器或子查询中)。
大对象支持自定义Salesforce Lightning和Visualforce组件,而不支持标准UI元素(主页,详细信息页面,列表视图等)。
每个组织最多可以创建100个大对象。大对象字段的限制类似于自定义对象的限制,并取决于您单位的许可类型。
大对象不支持包含大对象,标准对象和自定义对象的交易。
为了支持大对象中的数据规模,您不能使用触发器,流程,流程和Salesforce应用。
总结:篇中简单描述 big object的使用,详情自行查看官方文档。篇中有错误欢迎指出,有不懂欢迎留言。