概要とビジネスシーン
Salesforce Custom Objects(カスタムオブジェクト)は、Salesforceプラットフォームの柔軟性と拡張性の核となる機能です。標準オブジェクト(Account, Contact, Opportunityなど)では表現しきれない、企業固有のビジネスプロセスやデータを柔軟にモデル化し、ビジネス要件に完全に合致したソリューションを構築するための基盤となります。
実際のビジネスシーン
シーンA - 製造業:
- ビジネス課題:ある製造業の企業では、製品ライフサイクル管理(PLM)において、個々の製品部品、製造工程、品質検査の詳細データを管理する必要がありました。既存のSalesforce標準オブジェクトでは、これらの情報を詳細かつ構造的に追跡することが困難でした。
- ソリューション:「部品(Part__c)」、「製造工程(Manufacturing_Process__c)」、「品質検査(Quality_Inspection__c)」といったCustom Objectsを設計しました。これらは標準の「案件(Case)」や「商談(Opportunity)」と連携し、製品の設計から出荷、アフターサービスまでの一貫したデータ管理を実現しました。
- 定量的効果:生産プロセスの透明性が向上し、生産効率が15%向上、不良品発生率を5%削減しました。
シーンB - 医療・ヘルスケア業界:
- ビジネス課題:医療機関では、患者の治療履歴、検査結果、投薬情報といった機密性の高い医療データを統合的に管理し、かつ厳格なアクセス制御を必要としていました。標準オブジェクトでは医療特有の複雑なデータ構造を十分に表現できませんでした。
- ソリューション:「患者カルテ(Patient_Chart__c)」、「治療計画(Treatment_Plan__c)」、「検査結果(Lab_Result__c)」などのCustom Objectsを構築し、各オブジェクトに対してフィールドレベルセキュリティ(FLS)や共有設定(Sharing Settings)を細かく設定することで、データセキュリティとプライバシーを確保しました。
- 定量的効果:医療従事者のデータ入力時間が20%短縮され、患者ケアの質と安全性が向上しました。
シーンC - 不動産業界:
- ビジネス課題:不動産仲介業者が、物件情報、賃貸契約の詳細、内覧スケジュールなど、不動産特有の複雑なデータ構造を効率的に管理し、営業活動と連携させる必要がありました。
- ソリューション:「物件(Property__c)」、「賃貸契約(Lease_Agreement__c)」、「内覧スケジュール(Showing_Schedule__c)」などのCustom Objectsを設計し、それぞれを標準の「リード(Lead)」や「アカウント(Account)」と連携させました。これにより、顧客との接点から契約までのプロセスを一元管理できるようになりました。
- 定量的効果:契約処理のリードタイムが30%削減され、営業担当者の生産性が大幅に向上しました。
技術原理とアーキテクチャ
Custom Objects は、Salesforceのメタデータ駆動型アーキテクチャ(Metadata-Driven Architecture)の中核をなす要素です。これは、データベース内の物理的なテーブルとして機能し、Salesforceのユーザーインターフェース(UI)やAPIを通じてプログラム的にアクセス可能です。
基礎的な動作メカニズム
Custom Objectを作成すると、Salesforceは内部的にデータベーステーブルと、そのテーブルにアクセスするためのメタデータ(フィールド、リレーション、ページレイアウトなど)を生成します。ユーザーやアプリケーションがデータを作成、読み取り、更新、削除(CRUD)する際には、このメタデータ定義に基づいてデータの整合性チェックやアクセス権限の検証が行われます。
主要コンポーネントと依存関係
- Object Manager:Custom Objects の作成、編集、削除を行うUIベースのツール。
- Schema Builder:オブジェクトとそれらのリレーションシップを視覚的に設計・確認できるツール。
- Field & Relationship:データ型(テキスト、数値、日付など)とオブジェクト間のリレーションシップ(Lookup, Master-Detailなど)を定義。
- Page Layouts:レコード詳細ページのUI表示をカスタマイズ。
- Record Types:ビジネスプロセスや表示するフィールドセットに応じて、同じオブジェクトの異なるビューやピックリスト値を定義。
- Validation Rules:データの入力時に指定した条件に基づいてエラーメッセージを表示し、データ品質を保証。
- Apex Triggers:特定のDML操作(Insert, Update, Delete)の前後でカスタムロジックを実行。
- Flows / Workflow Rules:条件に基づいたレコードの自動更新、タスクの割り当て、メール送信などの自動化。
これらのコンポーネントは密接に連携し、Custom Objectを中心にSalesforceアプリケーションを構築します。標準オブジェクトとのリレーションシップも容易に構築でき、既存のSalesforce機能(レポート、ダッシュボード、Chatterなど)とシームレスに統合されます。
データフローの例(レコード作成時)
| ステップ | 説明 | 関連コンポーネント |
|---|---|---|
| 1. データ入力 | ユーザーがUIからデータを入力、またはAPI経由でデータが送信される | Page Layouts, API |
| 2. 入力規則の検証 | 定義されたValidation Rulesに基づき、データが正しいかチェックされる | Validation Rules |
| 3. Before Triggers実行 | DML操作(挿入)前にApex Triggersが実行され、データを変更または追加検証 | Apex Triggers (before insert) |
| 4. データベースへ保存 | データがSalesforceデータベースに物理的に保存される | Custom Object |
| 5. After Triggers実行 | DML操作(挿入)後にApex Triggersが実行され、関連レコードの更新などを実行 | Apex Triggers (after insert) |
| 6. 自動化プロセスの実行 | FlowsやWorkflow Rulesが定義された条件に基づいて実行される | Flows, Workflow Rules |
| 7. UI/APIへ反映 | 保存されたデータがUIに表示され、APIからも取得可能になる | Page Layouts, Reports, Dashboards, API |
ソリューション比較と選定
Custom Objects は非常に強力ですが、Salesforceには同様にデータを扱うための他の選択肢も存在します。適切なソリューション選定は、パフォーマンス、ガバナ制限、将来的な拡張性を考慮する上で不可欠です。
| ソリューション | 適用シーン | パフォーマンス | Governor Limits | 複雑度 |
|---|---|---|---|---|
| Custom Objects |
|
小~中規模データセットでは良好。大規模データではSOQL最適化とインデックスが必須。 | 組織あたりのオブジェクト数 (最大2,000)、フィールド数 (最大800/オブジェクト) など。DML/SOQLの制限も適用。 | 設定ベースで比較的容易。複雑なビジネスロジックはApex/Flowで追加。 |
| カスタム設定 (Custom Settings) / カスタムメタデータ型 (Custom Metadata Types) |
|
Salesforceキャッシュにロードされるため、非常に高速。SOQLクエリを消費しない。 | 特定のクエリ制限を受けない。カスタムメタデータ型は組織のメタデータ制限に含まれる。カスタム設定はデータサイズ制限あり。 | 設定ベースで非常に容易。 |
| 外部オブジェクト (External Objects) |
|
外部システムへのリアルタイムクエリのため、ネットワークレイテンシや外部システムのパフォーマンスに依存。 | 外部オブジェクトのクエリ呼び出し回数(Salesforce Connectの制限)に注意。 | Salesforce ConnectやODataプロトコルの知識、外部システム連携の設定が必要。 |
Custom Objects を使用すべき場合:
- ✅ Salesforce内で新しいエンティティとしてデータを永続的に管理し、そのライフサイクル全体をSalesforce上で完結させたい場合。
- ✅ 標準オブジェクトとの間に複雑なMaster-DetailまたはLookupリレーションシップを構築し、関連するデータを統合的に扱いたい場合。
- ✅ Salesforceのレポート、ダッシュボード、フロー、Apex、およびユーザーインターフェースを通じて、そのデータを完全に活用し、ビジネスプロセスに組み込みたい場合。
不適用シーン:
- ❌ アプリケーションの静的な設定情報や、ガバナ制限の影響を受けずに頻繁に参照されるマスタデータの場合(→ カスタム設定/カスタムメタデータ型を検討)。
- ❌ データが既に外部システムに存在し、Salesforceにデータをコピーすることなくリアルタイムで参照したい場合(→ 外部オブジェクトを検討)。
実装例
ここでは、Custom Object である Project__c のレコードをApexコードで作成、取得、更新する基本的なDML操作の例を示します。これにより、Custom Object がプログラム的にどのように扱われるかを理解できます。
// Project__c カスタムオブジェクトのインスタンスを作成します。
// これは新しいプロジェクトレコードを表現します。
Project__c newProject = new Project__c();
// Nameフィールド (標準フィールド) にプロジェクト名を設定します。
// Custom Objects には必ずNameフィールドが存在します。
newProject.Name = '新規Webサイト開発プロジェクト';
// カスタムフィールド 'Status__c' に値を設定します。
// このフィールドはCustom Object定義時に作成されている必要があります。
newProject.Status__c = 'Planning';
// カスタムフィールド 'Budget__c' に値を設定します。
newProject.Budget__c = 150000.00;
// DML操作(Insert)でデータベースに新しいレコードを挿入します。
// try-catchブロックを使用し、エラーハンドリングを推奨します。
try {
insert newProject;
System.debug('新しいプロジェクトレコードが作成されました。ID: ' + newProject.Id);
// 作成したレコードをSOQL (Salesforce Object Query Language) で取得します。
// Id、Name、カスタムフィールドの値を指定して取得します。
Project__c retrievedProject = [SELECT Id, Name, Status__c, Budget__c FROM Project__c WHERE Id = :newProject.Id LIMIT 1];
System.debug('取得したプロジェクト名: ' + retrievedProject.Name);
System.debug('取得したステータス: ' + retrievedProject.Status__c);
System.debug('取得した予算: ' + retrievedProject.Budget__c);
// 取得したレコードのカスタムフィールド 'Status__c' を更新します。
retrievedProject.Status__c = 'In Progress';
retrievedProject.Budget__c = 160000.00; // 予算も更新
// DML操作(Update)でレコードを更新します。
update retrievedProject;
System.debug('プロジェクトレコードが更新されました。新しいステータス: ' + retrievedProject.Status__c);
} catch (DMLException e) {
// DML操作中にエラーが発生した場合、デバッグログにメッセージを出力します。
System.debug('Custom Object レコードの作成/更新中にエラーが発生しました: ' + e.getMessage());
}
実装ロジック解析:
new Project__c(): まず、対象のCustom Object (Project__c) の新しいインスタンスを作成します。これは、データベースに保存されるレコードのメモリ上の表現です。newProject.Name = '...': Custom Object には、通常「名前」を表す標準のNameフィールドがあります。これに値を設定します。newProject.Status__c = '...',newProject.Budget__c = ...: 作成したカスタムフィールドに値を設定します。カスタムフィールドの名前は常に__cで終わります。insert newProject;: DML操作のinsertステートメントを使用して、作成したインスタンスをSalesforceデータベースに新しいレコードとして保存します。これにより、レコードに一意のIDが割り当てられます。[SELECT ... FROM Project__c WHERE Id = :newProject.Id LIMIT 1]: 保存されたレコードをSOQLクエリで取得します。:newProject.Idはバインド変数であり、Apex変数newProject.Idの値をクエリに渡します。retrievedProject.Status__c = '...',retrievedProject.Budget__c = ...: 取得したレコードのフィールド値を変更します。update retrievedProject;: DML操作のupdateステートメントを使用して、変更をデータベースに反映させます。try-catch (DMLException e): DML操作はガバナ制限や検証ルール、データベースエラーなどにより失敗する可能性があるため、常にtry-catchブロックで囲み、適切なエラーハンドリングを行うことが重要です。
注意事項とベストプラクティス
権限要件
Custom Objects を安全かつ効率的に使用するためには、適切な権限管理が不可欠です。
- オブジェクト権限(Object Permissions):ユーザーがCustom Objectに対してCRUD(作成、読み取り、更新、削除)のどの操作を行えるかを、プロファイル(Profile)または権限セット(Permission Set)で定義します。
- フィールドレベルセキュリティ(Field-Level Security, FLS):特定のフィールドを表示または編集できるかをプロファイルや権限セットで制御します。機密性の高いデータには厳格なFLSを設定します。
- 共有設定(Sharing Settings):組織の共有設定、共有ルール、ロール階層、手動共有、Apex共有などを用いて、レコード単位でのアクセス権限を制御します。
Governor Limits
SalesforceのGovernor Limitsは、マルチテナント環境の安定性を保つための重要な制限です。Custom Objects の利用においても注意が必要です。
- 組織あたりの Custom Objects 数:Enterprise Edition 以上では最大 2,000 個(一部エディションではこれより少ない場合があるため、自身の組織のエディションを確認することが重要です)。
- Custom Fields 数:1つのCustom Object につき最大 800 個のカスタムフィールドを設定できます。
- Master-Detail リレーションシップ数:1つのオブジェクトにつき最大 2 個の Master-Detail リレーションシップを設定できます。
- Lookup リレーションシップ数:1つのオブジェクトにつき最大 40 個の Lookup リレーションシップを設定できます。
- SOQL クエリあたりの結合数 (JOIN):SOQL クエリでは、最大 10 個の異なるオブジェクトに対して結合(リレーションクエリ)を行うことができます。
- 1つのトランザクションあたりのDML操作数:最大 150 回のDMLステートメント。
これらの制限を超えないよう、データモデル設計時から将来の拡張性を見据えた計画が必要です。
エラー処理
DML操作や自動化プロセスにおけるエラーを適切に処理することは、データの整合性とユーザーエクスペリエンスを保証するために重要です。
- DML例外(DMLException):ApexコードでDML操作を行う際は、必ず
try-catch (DMLException e)ブロックで囲み、エラーメッセージを適切にログに出力するか、ユーザーに通知します。 - Validation Rules:入力エラーを未然に防ぐため、Custom Objects に適切なValidation Rulesを設定します。これにより、無効なデータの保存を防ぎ、ユーザーにフィードバックを提供できます。
- デバッグログ:エラー発生時には、デバッグログを有効にして詳細な情報を取得し、問題の原因を特定します。
パフォーマンス最適化
- 適切なインデックスの利用:SOQLクエリで頻繁にフィルター条件として使用されるカスタムフィールド(特に外部IDやユニークフィールド)には、カスタムインデックスを設定することを検討してください。
- リレーションシップの最適化:不要なMaster-Detailリレーションシップを避け、必要に応じてLookupリレーションシップを使用します。Master-Detailは親レコードの削除時に子レコードも削除されるため、データ構造を慎重に設計してください。
- SOQLクエリの最適化:
- 選択的なSOQLクエリを使用し、必要なフィールドのみを取得します。
- ループ内でSOQLクエリやDMLステートメントを実行しない(Bulkified コードの記述)。
- 大量データを扱う際は、Batch Apex や Queueable Apex を活用します。
- レコードタイプとページレイアウト:ユーザーが関連性のないフィールドやセクションを見ないように、レコードタイプとページレイアウトを効果的に使用し、UIの複雑さを軽減します。
よくある質問 FAQ
Q1:Custom Objects の代わりに標準オブジェクトを拡張するべきですか?
A1:ビジネス要件がSales CloudやService Cloudなどのコア機能と密接に関連している場合、および既存のプロセスに適合する場合は、標準オブジェクトにカスタムフィールドを追加して拡張することを推奨します。標準オブジェクトは多くの標準機能(レポート、ダッシュボード、プロセス)と自動的に統合されているためです。しかし、要件が標準オブジェクトのデータモデルと大きく乖離している場合や、独立したライフサイクルを持つまったく新しいエンティティを管理する必要がある場合は、Custom Objects が最適な選択肢となります。
Q2:Custom Object のレコードが作成できない、または更新できない場合、どこを確認すべきですか?
A2:まず、ログインしているユーザーのプロファイルまたは権限セットで、当該 Custom Object に対する「作成 (Create)」または「編集 (Edit)」権限が許可されているかを確認してください。また、レコードに必須フィールドがあり、そのフィールドにデータが入力されているか、およびそのフィールドへの「編集 (Edit)」アクセスが許可されているかも確認が必要です。次に、オブジェクトに設定されている入力規則(Validation Rules)、Apexトリガー、またはFlowによってDML操作がブロックされていないかを確認します。最後に、Apexデバッグログを有効にして、詳細なエラーメッセージを確認することで、具体的な原因を特定できます。
Q3:Custom Object のデータ量が増加した場合、パフォーマンスへの影響はありますか?
A3:はい、Custom Object に保存されるデータ量が増加すると、SOQLクエリのパフォーマンスに影響を与える可能性があります。特に、レポートやリストビューでの読み込み速度が低下することがあります。この問題に対処するためには、SOQLクエリの選択性を高めるためのカスタムインデックスの作成、適切なレポートフィルターの適用、およびデータアーカイブ戦略の検討が重要です。また、大量のデータ処理が必要な場合は、非同期Apex(Batch ApexやQueueable Apex)を利用してGovernor Limitsを回避しつつ効率的に処理を行うことを推奨します。
まとめと参考資料
Custom Objects は、Salesforceプラットフォームの真髄とも言える機能であり、あらゆるビジネス要件に対応できる柔軟なデータモデルを提供します。コンサルタントの視点からは、単なるオブジェクト作成に留まらず、ビジネス課題の正確な理解、データモデル設計のベストプラクティス、Governor Limitsの考慮、そして継続的なパフォーマンス最適化を通じて、真のビジネス変革を推進する強力なツールとなります。適切な設計と実装により、Salesforceは単なるCRMシステムを超え、企業の基幹業務システムへと進化します。
公式リソース:
- 📖 公式ドキュメント:カスタムオブジェクトの概要
- 📖 公式ドキュメント:Apex DML ステートメント
- 🎓 Trailhead モジュール:Salesforce のデータモデリング
- 🎓 Trailhead モジュール:Platform の基本
コメント
コメントを投稿