本篇參考:
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的使用,詳情自行查看官方文檔。篇中有錯誤歡迎指出,有不懂歡迎留言。