参照関係と主従関係の違いとは?
Salesforceでオブジェクトを作っていると、「このオブジェクト、他のデータと繋げたいな…」と思う場面、ありますよね。
そんなときに使うのが 参照関係 と 主従関係 です。
最初はちょっとややこしく感じるかもしれませんが、この2つの違いを知っておくとSalesforceのデータ設計がグッと楽になります。
参照関係:ゆるやかなつながり
参照関係(Lookup Relationship)は、オブジェクト同士を関連づけるけど、親が削除されても子は残るという、わりと自由な関係です。
たとえば、「注文」オブジェクトが「顧客」オブジェクトを参照しているとします。
顧客データを削除しても、注文データ自体は消えません。
もちろん、顧客が不明になるのであとで見直しは必要ですが、「注文」自体は生きているのです。
この関係は、データ同士の繋がりは必要だけど、依存関係はそこまで強くしたくないときに便利です。
主従関係:親子で運命共同体
一方で、主従関係(Master-Detail Relationship)は、親オブジェクトが消えると、子も一緒に削除されるという強い依存関係を持っています。
イメージとしては、「納品書(親)」と「納品明細(子)」のようなもの。
納品書を削除したら、その明細も意味をなさないので、一緒に消えるというわけです。
また、主従関係では親の所有者(オーナー)情報や共有設定が子にも引き継がれるなど、細かいルールが決まっています。
完全に親に従う子オブジェクト、という感じですね。
📏 オブジェクト数と制限
- 主従関係:1オブジェクトにつき最大2件まで。標準オブジェクトは子不可。
- 参照関係:標準オブジェクトは最大25件、カスタムオブジェクトは最大40件まで可能。
⚠ パフォーマンス注意:インデックススキュー
参照関係(Lookup)では、1つの親レコードに対して多数の子レコードが紐付くと、インデックススキューと呼ばれる状態が発生することがあります。
この状態では、クエリ性能の低下や、DML操作時のレコードロック競合(Lock Timeout)の原因となる可能性があります。
そのためSalesforceでは、1つの親レコードに紐づく子レコードは 10,000 件未満に抑えることを推奨しています。
🔧 ロールアップサマリーフィールド対応
主従関係では、親レコードに対して子レコードの合計や件数を集計する「ロールアップサマリーフィールド」が標準で利用できます。
一方、参照関係(Lookup)ではこの機能は標準で使えず、代替手段として「Declarative Rollup Summary Tool(DLRS)」などの無料ツールや、Apexトリガーによるカスタム集計が必要になります。
🔐 セキュリティの継承
- 主従関係:子レコードは親の共有設定を自動的に引き継ぐ
- 参照関係:各レコードの共有設定は独立して制御される
どちらを選べばいいの?
私は普段、「この2つ、どっちにしよう?」と迷ったときは、こんなふうに考えています。
- 親が消えても子を残したい → 参照関係
- 親と子はセットで管理したい → 主従関係
たとえば、プロジェクトとタスクを関連付けるなら、主従関係にしておいた方が「プロジェクトが終わったら関連タスクも削除」でスッキリ管理できることが多いですね。
まとめ
Salesforceの設計を始めるとき、データの「繋がり方」をどうするかはすごく重要です。
参照関係と主従関係は、どちらも便利な機能ですが、役割がはっきり違います。
どれくらい強い結びつきが必要なのかを考えて選ぶと、あとからのトラブルも防げますよ。
この記事が、あなたのSalesforce設計のヒントになれば嬉しいです。
コメント