Administrator 練習問題 Q190
Universal Containers のプラットフォーム管理者は、既存の 2 つのカスタムオブジェクト間に多対多の関係を作成するように依頼されました。多対多の関係を有効にする際に、管理者が実行する必要がある 2 つの手順はどれですか。
左の□で回答を選択。本文を押すと横線で除外でき、もう一度押すと戻せます。
2つ選択してください(0/2)
正答:A. ジャンクションとなるカスタムオブジェクトを作成します。 / B. 新しいオブジェクトに 2 つの主従関係を作成します。
解説
前提知識
リレーション(オブジェクト間の関係)の基本
Salesforce でオブジェクト同士をつなぐ方法は、主に2つしかありません。
| 参照関係(Lookup) | 主従関係 | |
|---|---|---|
| 結びつきの強さ | 緩い。関連先を必須にせず、削除時の動作を選べる場合がある | 強い。親を削除すると子も削除される |
| 必須か | 任意にも必須にも設定できる | 必須。子は必ず親を持つ |
| アクセス権 | それぞれ独立 | 子は親の共有設定を継承する |
| 上限 | 1オブジェクトに多数作れる | 1オブジェクトに最大2つまで |
| 集計項目 | 使えない | 親側に集計項目サマリーを置ける |
多対多の関係とは
「Aの1件に対してBが複数、かつBの1件に対してもAが複数」という関係です。例:1つの求人案件には複数の候補者が応募し、一人の候補者も複数の案件に応募する。 Salesforce には「多対多関係」という項目型は存在しません。 2つのオブジェクトを直接つないで実現することはできません。必ず、中間にオブジェクトを1つ挿して実現します。
ジャンクションオブジェクトとは
公式の定義は明快です。「2つの主従関係を持つカスタムオブジェクト」です。このオブジェクトのレコード1件が、「AのこのレコードとBのこのレコードがつながっている」という結びつき1つ分を表します。 標準機能にも、商談と商品の組み合わせを表す商談商品など、中間レコードが「組み合わせ固有の情報」を保持する例があります。ただし、本問が問うカスタムオブジェクト間の標準的な多対多モデルは、カスタムジャンクションオブジェクトに2つの主従関係を作る方式です。
設問の状況を分解する
- 既存の2つのカスタムオブジェクトがある。
- その間に多対多の関係を作りたい。
- 問われているのは必要な2つの手順。 答えの骨組みは常に同じです。
- 中間に入る新しいカスタムオブジェクト(ジャンクションオブジェクト)を作る。
- その新しいオブジェクト上に、既存の2つのオブジェクトを親とする主従関係を2つ作る。 初学者が迷うのは、主従関係をどこに作るのかです。作るのは必ず新しいジャンクションオブジェクト側です。ジャンクションオブジェクトが**子(詳細)で、既存の2つが親(マスター)**になります。オブジェクトに作れる主従関係の上限が「最大2つ」であるのは、まさにこのジャンクションオブジェクトのパターンのために用意された余地です。
選択肢の検討
A. ジャンクションとなるカスタムオブジェクトを作成します。 → ⭕ 正解(1つ目)
必須の第一手です。多対多は、2つのオブジェクトだけでは表現できません。結びつき1件をレコードとして保存する器として、中間のカスタムオブジェクトを新規作成します。
B. 新しいオブジェクトに2つの主従関係を作成します。 → ⭕ 正解(2つ目)
作ったジャンクションオブジェクトに、既存の2つのオブジェクトをそれぞれ親とする主従関係を作ります。これで両方の親レコードに関連リストが現れ、互いに相手を複数辿れる状態になります。公式のジャンクションオブジェクトの定義そのものです。
C. カスタムオブジェクトに URL 項目を作成します。 → ✕
URL 項目はリンク文字列を保存するだけの項目です。見た目上はレコードへ飛べても、データモデル上の関連ではありません。関連リストにも出ず、レポートで結合することもできません。
D. 新しいオブジェクトに2つの参照関係を作成します。 → △(惜しいが不正解)
参照関係2つでも、形の上では多対多を表せます。実務ではこの形を採ることもあります。だから完全な誤りではありません。しかし、公式における「ジャンクションオブジェクトによる多対多」の定義は主従関係2つです。参照関係だと、結びつきレコードが親なしで存在できてしまい(片方のリンク先が空のゴミデータが残る)、親を削除しても結びつきが残る、親側で集計項目サマリーが使えない、という問題が生じます。判別基準は、**「試験で多対多を問われたら主従関係2つ」**と覚えてください。
管理者としての対処手順
- [設定]→[オブジェクトマネージャ]→[作成]→[カスタムオブジェクト]で、中間になるオブジェクトを作成する。
- レコード名は、自動番号にするのが定石。ジャンクションのレコードに人間が名前を付ける意味は薄いため。
- 作ったオブジェクトの[項目とリレーション]で[新規]→データ型に[主従関係]を選び、関連先に1つ目の既存オブジェクトを指定する。
- 同じ手順を繰り返し、2つ目の既存オブジェクトへの主従関係を作成する。
- 両方の親オブジェクトのページレイアウトに、ジャンクションオブジェクトの関連リストを追加し、表示項目を調整する。 注意点:最初に作った主従関係が主リレーションになります。主リレーションは、ジャンクションレコード画面の色・アイコン、内部的に継承される所有者値、ディビジョンに影響します。削除連鎖は主リレーションだけで決まるのではなく、どちらか一方の親レコードを削除すると、その組み合わせのジャンクションレコードも削除されます。また、共有アクセスは両方の親レコードへのアクセスと、各主従関係項目の共有設定から決まります。
あわせて覚えておきたいポイント
- 主従関係は1オブジェクトに最大2つまで。 この上限の存在理由がジャンクションオブジェクトです。
- ジャンクションレコードのアクセスは両方の親で決まります。 ユーザーが両方の親レコードに持つ共有アクセスと、2つの主従関係項目に設定した共有設定を組み合わせて判定されます。
- 集計項目サマリーが使えます。 例:求人案件側に「応募者数」を自動集計させる。これは参照関係ではできません。
- ジャンクションレコードに情報を持たせられます。 応募日、選考ステータス、割引率など、「この組み合わせに固有の情報」の置き場になります。これがジャンクションオブジェクトの真の価値です。
- どちらか一方の親を削除すると、対応するジャンクションレコードも削除されます。 両方の親が削除された場合、ジャンクションレコードを復元できない場合があります。
出典(Salesforce公式)
- Create a Junction Object(Trailhead) — ジャンクションオブジェクトは、2つの主従関係を持つカスタムオブジェクトとして作成する。
- Create a Many-to-Many Object Relationship — カスタムジャンクションオブジェクトを作り、その上に既存の2オブジェクトへの主従関係を作成する。最初の関係が主リレーションになる。
- Considerations for Object Relationships — どちらかの親を削除するとジャンクションレコードも削除され、共有アクセスは両親へのアクセスと各関係の共有設定で決まる。主リレーションが影響するのは画面の外観、所有者値、ディビジョンである。
- Object Relationships Overview — 主従関係では親が子の削除・所有・セキュリティを制御し、参照関係はより緩い関連として設定する。
- Custom Field Types — URL項目はURL文字列を格納する項目であり、オブジェクト間リレーションではない。