Big Objectを試してみた

# 調べた背景

実務で扱うデータが多くなって来てカスタムオブジェクトの限界にぶち当たり困っていた
Salesforce Connectの外部オブジェクトでデータ外出し以外に何か方法が無いかと思い、
バズワード的に**Bigデータ？**みたいな安易な発想で調査したらSalesforceにもあったので調査した。

# 結論
- **EEやUE、DEライセンスは100万件のデータをSalesforce上で管理可能。追加で数十億件まで対応可能。**
- 通常のSOQLで取得する際はガバナ制限で50000件までになる。
- 追加ライセンスで使用可能な非同期SOQLだと大量データの扱いOK。

**顧客の周辺の大量のトランザクションデータを参照前提でSalesforceに格納したい場合に
利用するのが良いのでしょうね。**

# これまでのSalesforceの課題と活用動機
　　活用進んでデータが貯まってきた！
⇒　容量も不足してきたし、外部ストレージに保存するか？
⇒　やっぱり顧客に関連付けて、顧客に関連するデータを保存したい！
⇒　Salesforceで一元的に顧客データを管理したい
⇒　でも容量が・・・（今ここ）

でAWSやHerokuに逃すのもあるけど、Salesforce内で完結させたい場合は手法としては難しい。
また、Einstein（Analytics Plus）はデータ保存件数が多いので
そちらに逃すというのもあるけど、そもそも目的が違う・・・

~~そもそも、容量追加すればいいじゃんという話は無しで~~

#やってみる
以前はメタデータAPIでしか作成出来なかったようですが、
Spring19からUIで作成可能となりました！

## 1.設定からの検索方法
-「Big」で検索
- 管理　⇒　データ　⇒　BigObject
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577032/e2d9b1bb-3b73-d8a1-28dc-41fcf1fffc64.png)

## 2.BigObject作成
- [New]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577032/2d25f516-6fb3-f02c-d776-23554fd8b9f2.png)
まだこれからの機能か英語だ・・・
リリースは後程設定するインデックス項目が1つ以上ないとダメなので開発中になる。

## 3.データ項目設定
-　カスタム項目＆リレーションの[新規]をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577032/cb4ebb69-cef1-2d10-2f28-8a77f1ad8365.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577032/807642ef-41b8-e877-2386-1b9104f42d9a.png)

大量データの取り扱いになるので設定可能なデータ項目も非常に少ない。
参照関係、URL、テキスト、メール、ロングテキスト、数値、電話、日付／時間型のみ。
**数式、主従、積み上げ集計、選択リストなどはデータ型としてサポート外なので注意。**

## 4.インデックス設定
- [Index]の[新規]をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577032/50ae17ed-549a-636e-bca0-6fad1e4e1e4a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577032/3e84e73f-fba6-8c94-01c7-0ef2f3444ddd.png)

データ項目を必須にしないとインデックス項目として設定出来ない。
**インデックスの全ての長さが100文字を超えてはダメ。**最初に適当にサイズをきるとあとで修正出来ない。

# 5.リリース
リリース状況を開発中からリリースに変更

# 6.APEXによるデータ登録
- INSERTはinsertImmediate、DELETEはdeleteImmediate。

```java
// BigObjectは__bとなる
Rider_History__b rh = new Rider_History__b();

rh.Rider_Account__c = 'TEST';
rh.Start_Time__c =  Datetime.now();

// INSERTはinsertImmediate、DELETEはdeleteImmediate
database.insertImmediate(rh);
```
# 7.データ取得
- WHERE句はインデックスの位置順通りに指定する必要がある。
- WHERE句の最後以外は＝とする必要がある。（インデックス走査の為？）。ただし**!=、LIKE、NOT IN、EXCLUDES、INCLUDES はサポート外**。
- SOQLと非同期SOQLがある。非同期SOQLは処理時間に制限なく、大量データの集計に活用可能。

```sql
SELECT Rider_Account__c, Start_Time__c
FROM Rider_History__b
WHERE Rider_Account__c='TEST' AND Start_Time__c >= TODAY
```

#各種制限
自由を得るには制約を伴うという言葉通り、BigObjectには制限がたくさんある。
だからデータの大容量、検索向上などの要件を実現出来る。

-　インデックスの再作成をしたい場合、別のBigObjectで再定義する必要がある。
-　フロー、承認フロー、プロセスビルダーなどの**自動化プロセスはBigObjectに作成できない**。
-　**データセキュリティはオブジェクト権限（編集除く）、項目レベルセキュリティのみ可能**。
　 共有設定は表示がいないので不可。
-　INSERT、DELETEをサポート。UPDATE、UPSERTはサポート外。
　 インデックス値が同一である場合は、DELETE-INSERTか？

　プロファイルのオブジェクト権限（編集がない）。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577032/14522ce3-3ec6-1e42-24b0-fc4498d46560.png)


# Help及び参考ページ
[公式Help](https://help.salesforce.com/articleView?id=custom_index.htm&language=ja&r=https%3A%2F%2Fwww.google.com%2F&type=5)
[開発者ドキュメント 英語・・・](https://developer.salesforce.com/docs/atlas.en-us.bigobjects.meta/bigobjects/big_object.htm)
[Trailhead](https://trailhead.salesforce.com/ja/content/learn/modules/big_objects)
[DeveloperForceJanpanさんのslideshare 2018/5/6版](https://www.slideshare.net/DeveloperForceJapan/salesforce-big-object)
[DeveloperForceJanpanさんのslideshare 2019/7/4版](https://www.slideshare.net/DeveloperForceJapan/salesforce-big-object-153516470)