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