salesforce零基础学习(九十七)Big Object
本篇参考:
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的使用,详情自行查看官方文档。篇中有错误欢迎指出,有不懂欢迎留言。
salesforce零基础学习(九十七)Big Object的更多相关文章
- 【转】【Salesforce】salesforce 零基础学习(十七)Trigger用法
看本篇之前可以相应阅读以下Trigger相关文章: 1.https://developer.salesforce.com/page/Trigger_Frameworks_and_Apex_Trigge ...
- salesforce 零基础学习(十七)Trigger用法
看本篇之前可以相应阅读以下Trigger相关文章: 1.https://developer.salesforce.com/page/Trigger_Frameworks_and_Apex_Trigge ...
- salesforce 零基础学习(五十二)Trigger使用篇(二)
第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...
- salesforce零基础学习(八十七)Apex 中Picklist类型通过Control 字段值获取Dependent List 值
注:本篇解决方案内容实现转自:http://mysalesforceescapade.blogspot.com/2015/03/getting-dependent-picklist-values-fr ...
- salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件
在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取.salesforce 零基础学习(二十四)解析csv格式内容中有类似的 ...
- salesforce零基础学习(八十)使用autoComplete 输入内容自动联想结果以及去重实现
项目中,我们有时候会需要实现自动联想功能,比如我们想输入用户或者联系人名称,去联想出系统中有的相关的用户和联系人,当点击以后获取相关的邮箱或者其他信息等等.这种情况下可以使用jquery ui中的au ...
- salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见
项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...
- salesforce零基础学习(一百零五)Change Data Capture
本篇参考: https://developer.salesforce.com/docs/atlas.en-us.232.0.api_streaming.meta/api_streaming/using ...
- salesforce零基础学习(一百一十一)custom metadata type数据获取方式更新
本篇参考: https://developer.salesforce.com/docs/atlas.en-us.234.0.apexref.meta/apexref/apex_methods_syst ...
- salesforce 零基础学习(六十八)http callout test class写法
此篇可以参考: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restfu ...
随机推荐
- vue 中后台 列表的增删改查同一解决方案
查看 & 查询 常⻅业务列表⻚都是由 搜索栏 和 数据列表 组成. 其中: 搜索栏包含 搜索条件 . 新增 . 批量xx . 导出 等对 数据列表 全局操作功能项. 数据列表包含 分⻚ 和每条 ...
- RXJAVA之变换操作
RXJAVA提供了以下变换操作,对Observable的消息进行变换操作: 1.window 定期将来自Observable的数据分拆成一些Observable窗口,然后发射这些窗口,而不是每次发射一 ...
- JVM学习(四)JVM调优
一.调优命令 Sun JDK监控和故障处理命令有jps.jstat.jmap.jhat.jstack.jinfo jps,JVM Process Status Tool,显示指定系统内所有的HotSp ...
- python中不需要函数重载的原因
函数重载主要是为了解决两个问题: 1.可变参数类型 2.可变参数个数 并且函数重载一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函 ...
- 划重点!AWS的湖仓一体使用哪种数据湖格式进行衔接?
此前Apache Hudi社区一直有小伙伴询问能否使用Amazon Redshift查询Hudi表,现在它终于来了. 现在您可以使用Amazon Redshift查询Amazon S3 数据湖中Apa ...
- Python-字符编码-Unicode UTF-8
什么是字符编码? --世界上有很多国家,每个国家都有自己独特的语言,所以在计算机普及的当今世界, 每个国家都有自己的字符编码,本国的软件运行在其他国家的机器上,会出现乱码, 有utf-8,gbk等各种 ...
- 【网络协议】TCP/IP:数据链路层
物理层负责把计算机中的0.1数字信号转换为具体传输媒介的物理信号(电压的高低.电波的强弱.光的闪灭) 数据链路层协议定义了(通过通信介质互连的设备间的)数据传输规范 (常见的通信介质有同轴电缆.双绞线 ...
- python双向链表的实现
python双向链表和单链表类似,只不过是增加了一个指向前面一个元素的指针,下面的代码实例了python双向链表的方法 示意图: python双向链表实现代码: # -*- coding: utf-8 ...
- 【漏洞复现】Office远程代码执行漏洞(CVE-2017-11882)
昨晚看到的有复现的文章,一直到今天才去自己复现了一遍,还是例行记录一下. POC: https://github.com/Ridter/CVE-2017-11882/ 一.简单的生成弹计算器的doc文 ...
- 《C++primerplus》第12章练习题
做一下倒数两题,都是在队列模拟的程序基础上做点修改测试. 5.找出平均等候时间为1分钟时,每小时到达的客户数为多少(试验时间不少于100小时). 指定队伍最大长度10人,模拟100小时.粗略估计答案在 ...