データモデルの設計
学習の目的
この単元を完了すると、次のことができるようになります。
- 大量のデータに対応するデータモデルを設計する。
- 3 種類のデータスキューとその回避方法について説明する。
- データモデルを拡張して外部オブジェクトを含める。
データモデルの計画
どのアプリケーションにとってもデータは主要な要素に挙げられます。ユーザーは恒常的にデータを作成します。一日中、毎日、非常に。多くの。データを。気が付いたら組織に何百万件ものレコード、何千人ものユーザー、数ギガバイトものデータストレージがため込まれています。
こうした大量データ (LDV) のために、クエリ、検索やリストビューの表示、Sandbox の更新に時間がかかるなど、パフォーマンスが停滞するおそれがあります。あらかじめ LDV に対応するプランを立て、拡張性を備えたデータモデルを当初から設計しておけば、こうした危機的状況は回避できます。
データスキューに関する情報
最適なパフォーマンスの実現に向けた大量データの管理の鍵は、レコード所有権を慎重に設計して、データスキューを回避することです。データスキューが生じるのは、組織内で単一の親レコードに 1 万件超の子レコードが関連付けられている場合です。
親あたりの子レコード数がこのしきい値を下回るように、十分な取引先のあるデータモデルを計画し、新規作成された子レコードが取引先に分散されるようにします。こうした手法を用いなければ、取引先データスキュー、所有者スキュー、参照スキューという 3 種類のデータスキューが発生し、パフォーマンスに悪影響を及ぼすおそれがあります。
取引先データスキュー
取引先や商談など特定の Salesforce オブジェクトには、非公開の共有モデルに従って親子間のレコードアクセスを維持する特別なデータリレーションが存在します。このようなリレーションで単一の親オブジェクトに関連付けられている子レコードが多すぎる場合は、取引先データスキューが生じます。たとえば、未割り当ての取引先責任者が多数あるため、「未割り当て」という名前の 1 つの取引先にまとめるとします。そうすると、レコードのロックや共有パフォーマンスに関して問題が生じる可能性があります。
レコードのロック
もう 1 つのシナリオとして、同じ取引先に属する多数の取引先責任者を複数のスレッドで更新しているとします。システムは、データベースの整合性を維持するために、更新ごとに、更新対象の取引先責任者とその親取引先の両方をロックします。ロックはいずれもごく短時間ですが、すべての更新で同じ取引先をロックしようとするため、前の更新によって取引先がロック状態のままになれば次の更新に失敗するおそれがあります。
共有の問題
共有についても同様のことが発生します。共有の設定方法によっては、取引先の所有者変更といった一見些細なことを行う場合に、取引先の子レコードを逐一検証し、その共有も調整しなければならないことがあります。その場合に、ロール階層や共有ルールの再適用が行われる可能性もあります。子レコードが何万件にも及べば、膨大な時間を要することになります。
所有者スキュー
1 人のユーザーが同じオブジェクト種別のレコードを大量に所有している場合、このアンバランスによって所有者スキューが生じます。どのレコードにも所有者が必要なため、これらのレコードを前述の「未割り当て」といった汎用所有者にスキューすることが自然な解決策のように思われます。ただし、これらのレコードの表示を管理するには共有の適用が必要なため、パフォーマンスの問題が生じることがあります。
偏った所有者がロール階層に存在する場合には、削除や所有者更新などの操作時に、ロール階層内の古い所有者やすべての親ユーザーから、また、共有ルールによってアクセスが付与されているすべてのユーザーから共有を削除する必要があります。システムによるトランザクションの変更の中でも特に所有者の変更にコストがかかることが多いのはこのためです。
場合によっては、所有者スキューが不可避なこともあります。その場合の最善策は、偏った所有者にロールを設定しないことです。そうすれば、ユーザーおよびそのレコードが、ロール階層や関連付けられている共有ルールから切り離されます。
参照スキュー
参照スキューが生じるのは、参照オブジェクト (検索対象のオブジェクト) の単一のレコードに膨大な数のレコードが関連付けられている場合です。Salesforce ではどのオブジェクトにも参照項目を配置できるため、参照スキューによって組織内のどのオブジェクトでも問題が生じる可能性があります。
極めて複雑なカスタム実装を行っている場合に参照スキューが発生すると、気が付かないうちに問題が生じていることがあります。参照スキューの管理オプションを慎重に検討すれば、参照項目のロックの問題を回避し、組織の成長に合わせてアーキテクチャを拡大することができます。
参照スキューはなぜ大きな問題なのでしょうか。Salesforce の参照項目は本質的にオブジェクト間の外部キーリレーションです。レコードが挿入または更新される場合、Salesforce では必ず各参照項目に選択されているターゲットレコードをロックする必要があります。これによって、データがデータベースにコミットされたときにその整合性が維持されます。
通常の状況では、保存操作がすばやく実行されるため、ロックに気付くことはありません。ただし、自動化プロセスでカスタムコードと LDV を同時に追加すると、ロックの例外が発生し、レコードを挿入または更新しようとしたときに失敗することがあります。
参照スキューを特定するために設計されたツールというものが存在しないため、こうしたアーキテクチャ上の問題を見つけることは至難の業と思われます。ここで留意すべき重要な点は、特定の使用パターンにおいて、参照スキューが問題とは無関係である可能性があることです。そのため、問題を引き起こすパターンに基づいて検証することをお勧めします。つまり、多数のレコードがあり、同時挿入および更新アクティビティの負荷が高いオブジェクトを調査します。
外部オブジェクトの使用
LDV に対処するもう 1 つの手法は、外部オブジェクトを使用することです。そうすれば、Salesforce にデータを取り込む必要がなくなります。データを複数のオブジェクトに分散し、別のオブジェクトや外部ストアからオンデマンドで取り込むデータ階層化方法を用いれば、組織に大量のデータが保存される問題と、LDV に関連するパフォーマンスの問題の両方が回避されます。
外部オブジェクトはカスタムオブジェクトに似ていますが、Salesforce 組織外に保存されているデータに対応付けられる点が異なります。これによって、ユーザーや Force.com プラットフォームが外部データを検索および操作できます。
外部オブジェクトは、レコードデータにオンデマンドでアクセスするため、常に外部データの現在の状態が反映されます。そして、そのデータのコピーを Salesforce で管理する必要がないため、データを同期しておくためのストレージやリソースを浪費することがありません。外部オブジェクトが特に役立つのは、大量のデータがあるが、Salesforce 組織内に保存できない、または保存したくない場合で、一度に使用する必要のあるデータが少量のみであるケースです。
外部システムへのアクセス方法は外部データソースごとに異なります。Salesforce Connect の場合は、外部データソースを使用して、Salesforce 組織外に保存されているデータにアクセスします。Files Connect の場合は、外部データソースを使用して、サードパーティのコンテンツシステムにアクセスします。外部データソースは、ユーザーおよび Force.com プラットフォームが外部のデータやコンテンツを操作するために使用する外部オブジェクトに関連付けられます。
外部オブジェクトの参照
外部オブジェクトは、18 文字の Salesforce レコード ID を使用して関連レコードを相互に関連付ける標準参照関係をサポートしています。ただし多くの場合、Salesforce 組織外に保存されているデータには、こうしたレコード ID がありません。そのため、外部オブジェクトでは、外部参照と間接参照という 2 種類の特殊な参照関係を使用できます。
外部参照と間接参照は、親オブジェクトの特定の項目の値を、子オブジェクトの関係項目の値と比較します。値が一致した場合は、レコードが相互に関連付けられます。
外部参照関係は、親が外部オブジェクトの場合に使用します。外部参照関係は、子の標準、カスタム、外部オブジェクトを親の外部オブジェクトに結び付けます。親外部オブジェクトの [External ID (外部 ID)] 標準項目の値が、外部参照関係項目の値と照合されます。子外部オブジェクトについては、外部参照関係項目の値が、指定した [External Column Name (外部列の名前)] から取得されます。
間接参照関係は、外部データに Salesforce レコード ID がない場合に使用します。間接参照関係は、子の外部オブジェクトを親の標準またはカスタムオブジェクトに結び付けます。外部オブジェクトに間接参照関係項目を作成するときは、親オブジェクト項目と子オブジェクト項目が相互に照合するよう指定します。つまり、親オブジェクトに一意のカスタム外部 ID 項目を選択し、指定した [External Column Name (外部列の名前)] によって値が決まる子の間接参照関係項目と照合されるようにします。
以下は、外部オブジェクトに使用できる関係の種類を示しています。
関係 | 許可される子オブジェクト | 許可される親オブジェクト | レコードを照合する親項目 |
---|---|---|---|
参照 | 標準 カスタム 外部 | 標準 カスタム | 18 文字の Salesforce レコード ID |
外部参照 | 標準 カスタム 外部 | 外部 | 外部 ID 標準項目 |
間接参照 | 外部 | 標準 カスタム | 外部 ID や一意の属性を使用して、カスタム項目を選択します |
大量データに対処する組織を設計するときに、留意 (および回避) すべき主な事項について説明しました。Salesforce 戦略サービスの助けを借りて、初期設定および将来的な拡大を管理する最適な方法を考案することもできます。次の単元では、LDV のクエリおよび検索を取り上げます。
リソース
- Salesforce 開発者: Avoid Account Data Skew for Peak Performance (最適なパフォーマンスの実現に向けた取引先データスキューの回避)
- Salesforce 開発者: Managing Lookup Skew in Salesforce to Avoid Record Lock Exceptions (レコードロックの例外回避を目的とする Salesforce の参照スキューの管理)
- Salesforce ヘルプ: 外部オブジェクトリストの定義
- PDF: 企業の規模に応じたレコードアクセス権の作成
- Salesforce 開発者: Salesforce オブジェクトおよび項目の概要/外部オブジェクト