概要とビジネスシーン
Salesforce カスタムオブジェクト(Custom Objects)は、標準オブジェクトでは表現できない独自のビジネスデータやプロセスをSalesforceプラットフォーム上で管理するための強力な基盤です。これにより、企業はCRM(顧客関係管理)を単なる顧客管理ツールとしてだけでなく、自社のコアビジネスプロセスを駆動する包括的な業務システムとして拡張できます。
実際のビジネスシーン
シーンA - 製造業:ある部品メーカーでは、製造する製品の部品構成が非常に複雑で、各部品のサプライヤー、仕様、在庫ステータスを詳細に管理する必要がありました。標準のProductオブジェクトだけではこの要件を満たせず、多くの情報がスプレッドシートで管理され、データの不整合や検索性の問題が発生していました。
- ビジネス課題:膨大な部品情報とサプライヤー情報の一元管理、構成部品と完成品のリレーションシップの可視化。
- ソリューション:
Part__c(部品)、Supplier__c(サプライヤー)、ProductPart__c(製品と部品の関連)などのカスタムオブジェクトを作成。ルックアップリレーションやマスター詳細リレーションを活用してデータモデルを構築しました。 - 定量的効果:在庫管理の効率が25%向上し、リードタイムが平均15%短縮。データの検索とレポーティング機能により、意思決定プロセスが加速しました。
シーンB - 医療・ヘルスケア:クリニックでは、患者ごとに異なる複雑な治療計画があり、各治療ステップの進捗、担当医、使用薬剤、次回予約日などを細かく追跡する必要がありました。標準のCaseオブジェクトでは、一般的な問合せや問題解決のプロセスには対応できても、医療固有の複雑な治療計画には適していませんでした。
- ビジネス課題:患者の個別治療計画の管理、各ステップの進捗追跡、コンプライアンス要件への対応。
- ソリューション:
TreatmentPlan__c(治療計画)、TreatmentStep__c(治療ステップ)、Medication__c(薬剤)などのカスタムオブジェクトを作成。FlowやApexを活用して、治療計画の自動生成やステップ完了時の通知を設定しました。 - 定量的効果:患者ケアの質が向上し、治療計画の管理にかかる事務作業が30%削減。コンプライアンス監査対応の準備時間も大幅に短縮されました。
シーンC - 教育機関:大学では、学生の学籍情報、履修コース、成績、出席状況を学部横断的に一元管理し、多角的な分析に活用したいというニーズがありました。既存の学務システムは柔軟性に欠け、Salesforce上のCRMデータとの連携も困難でした。
- ビジネス課題:学生の包括的な学籍情報管理、成績評価と出席状況のリアルタイム追跡、各学生の学習進捗の可視化。
- ソリューション:
Student__c(学生)、Course__c(コース)、Enrollment__c(履修)、Grade__c(成績)などのカスタムオブジェクトを設計。これらを関連付け、レポート&ダッシュボードで学生の学習状況を分析できるようにしました。 - 定量的効果:学生サービスの質が向上し、学籍管理の効率が20%向上。学生の学習傾向を分析することで、カリキュラム改善への示唆を得られるようになりました。
技術原理とアーキテクチャ
カスタムオブジェクトは、Salesforceのメタデータ駆動型アーキテクチャ(Metadata-driven Architecture)の核心をなす機能の一つです。ユーザーまたは管理者が新しいカスタムオブジェクトを作成すると、Salesforceプラットフォームはその定義(メタデータ)を記録し、物理的なデータベース層に新しいテーブルスキーマを動的に生成・管理します。これにより、開発者は複雑なデータベース設計を直接行うことなく、宣言的(Declarative)またはプログラム的(Programmatic)にデータ構造を拡張できます。
主要コンポーネントと依存関係
カスタムオブジェクトは、以下の主要コンポーネントと密接に連携します。
- オブジェクト定義:カスタムオブジェクト自体の基本情報(API名、表示ラベル、レコード名など)を定義します。
- カスタムフィールド:オブジェクトに格納する具体的なデータ項目(テキスト、数値、日付、リレーションなど)を定義します。
- ページレイアウト(Page Layouts):ユーザーインターフェース(UI)でレコードの詳細ページや編集ページに表示されるフィールドの配置や表示方法を制御します。
- レコードタイプ(Record Types):同じカスタムオブジェクト内で異なるビジネスプロセスやページレイアウトを適用したい場合に利用します。
- タブ(Tabs):カスタムオブジェクトのデータをSalesforceのナビゲーションバーから直接アクセスできるようにします。
- リレーションシップ(Relationships):標準オブジェクトや他のカスタムオブジェクトとの関連付け(ルックアップ、マスター詳細)を定義し、データモデルの完全性を保ちます。
これらのコンポーネントは相互に依存し、レポート、ダッシュボード、Apex、Flow、APIなど、Salesforceプラットフォームのあらゆる機能から利用されます。
データフロー
カスタムオブジェクトのレコードが作成・更新される際の一般的なデータフローを以下に示します。
| ステップ | クライアント側 (UI/API) | Salesforceプラットフォーム (アプリケーション層) | データベース層 (ストレージ) |
|---|---|---|---|
| 1. データ入力 | ユーザーがUIで新しいレコード情報を入力し、保存ボタンをクリックするか、外部システムがAPI経由でデータを送信。 | ||
| 2. メタデータ検証 | Salesforceがカスタムオブジェクトの定義、フィールド定義、入力規則(Validation Rules)、必須項目などを確認し、データの整合性を検証。 | ||
| 3. ビジネスロジック実行 | 検証後、Apexトリガ、Flow、ワークフロールール、プロセスビルダーなどの自動化ツールが、定義されたビジネスロジックに従って実行される。 | ||
| 4. データ保存 | 検証とビジネスロジックの実行が完了した後、データが永続ストレージに書き込まれるためのSQLコマンドが生成される。 | 物理データベースに新しいレコードが挿入され、関連するインデックスが更新される。 | |
| 5. レスポンス | UIに成功メッセージが表示されるか、API呼び出し元に成功レスポンスが返される。 |
ソリューション比較と選定
カスタムオブジェクトの導入を検討する際、既存のSalesforce機能や外部システム連携など、他のソリューションと比較検討することが重要です。
| ソリューション | 適用シーン | パフォーマンス | Governor Limits | 複雑度 |
|---|---|---|---|---|
| Custom Objects | Salesforce内で新しいビジネスエンティティを管理し、レポート、Flow、Apexとの深い連携が必要な場合。既存の標準オブジェクトでは対応できない独自のデータモデルを構築する。 | 高速(Salesforceプラットフォームネイティブで最適化) | ストレージ容量、オブジェクト数(最大2000)、フィールド数(オブジェクトあたり最大800-900)、APIコール数などの標準プラットフォーム制限。 | 低~中(宣言的設定が主だが、リレーション設計や自動化で複雑化する可能性あり) |
| Standard Objects | 既存の標準オブジェクト(例:Account、Contact、Opportunity)で要件が満たせる場合、または若干のカスタムフィールド追加やレコードタイプで対応可能な場合。 | 最も高速(Salesforceによって高度に最適化済み) | Custom Objectsと同等だが、標準オブジェクト固有の制限(例:フィールド制限、API名の変更不可)がある。 | 低(設定のみ) |
| External Objects (Salesforce Connect) | 外部システム(例:ERP、データウェアハウス)にマスターデータがあり、Salesforceにデータを複製することなくリアルタイムで参照・更新が必要な場合。 | 外部システムのパフォーマンスとネットワーク遅延に依存 | 外部コールアウトの制限、SOQLオフロードの制限(外部データソースへのクエリ数)、レコード同期の制限。 | 中~高(外部システムの知識、Salesforce Connectの設定、外部データソースとの認証・接続設定が必要) |
custom objects を使用すべき場合:
- ✅ 標準オブジェクトでは表現できない、特定のビジネス要件に合致する独自のデータモデルが必要な場合。
- ✅ Salesforceプラットフォーム上でデータを一元管理し、レポート、ダッシュボード、Flow、Apexなどの標準機能やカスタム開発と深く連携させたい場合。
- ✅ 将来的にデータモデルの拡張や、オブジェクトに関連する複雑なビジネスロジック(入力規則、自動化)の実装が見込まれる場合。
- ✅ データがSalesforceのガバナ制限(Governor Limits)の範囲内で処理可能であり、プラットフォームのストレージに格納することが望ましい場合。
custom objects が不適用なシーン:
- ❌ 外部システムにマスターデータが存在し、Salesforceにデータを複製することなく、リアルタイムで参照・更新したい場合。この場合はExternal Objects(Salesforce Connect)の検討が適切です。
- ❌ 既存の標準オブジェクトにカスタムフィールドを追加するだけで要件が完全に満たされる場合。この場合は標準オブジェクトの拡張を優先すべきです。
- ❌ Salesforceのデータストレージ容量を大幅に超えるような、極めて大規模なデータセットを扱う場合。外部データベースの利用やSalesforce Big Objectsの検討が必要です。
実装例
ここでは、SalesforceのUI(User Interface)を通じてカスタムオブジェクト「プロジェクト」を作成し、関連するカスタムフィールドを追加する基本的な「実装例」を示します。管理者が宣言的にSalesforceを拡張する典型的な手順です。
ステップバイステップの実装ロジック
1. カスタムオブジェクトの作成
- Salesforceの「設定(Setup)」に移動し、クイック検索ボックスで「オブジェクトマネージャ(Object Manager)」と入力し、選択します。
- オブジェクトマネージャの右上にある「作成(Create)」ボタンをクリックし、「カスタムオブジェクト(Custom Object)」を選択します。
- 以下の情報を入力します。
- 表示ラベル(Label):
プロジェクト - 複数形表示ラベル(Plural Label):
プロジェクト - オブジェクト名(Object Name):
Project(自動的にProject__cがAPI参照名となります) - レコード名(Record Name):
プロジェクト名 - データ型(Data Type):
テキスト - 許可オプション(Optional Features):
- レポートを許可(Allow Reports)
- 活動を許可(Allow Activities)
- 項目履歴の追跡(Track Field History)
- Chatterグループで許可(Allow in Chatter Groups)
- オブジェクト分類(Object Classification):必要に応じて設定します。
- 展開状況(Deployment Status):
展開済み(Deployed) - 検索状況(Search Status):
検索を許可(Allow Search) - カスタムオブジェクトタブ(Custom Object Tab):チェックを入れ、「新規カスタムタブウィザードを起動(Launch New Custom Tab Wizard)」にチェックし、オブジェクト作成後にタブを設定します。
- 表示ラベル(Label):
- 「保存(Save)」をクリックします。
2. カスタムフィールドの追加
作成したProject__cカスタムオブジェクトに、例えば「開始日」「終了日」「ステータス」などのカスタムフィールドを追加します。
- オブジェクトマネージャで、先ほど作成した
Project__cオブジェクトを選択します。 - 左側のサイドバーから「項目とリレーション(Fields & Relationships)」を選択し、「新規(New)」ボタンをクリックします。
- フィールド1:開始日
- データ型:
日付(Date)を選択し、「次へ(Next)」 - 項目表示ラベル:
開始日 - 項目名(Field Name):
Start_Date(API参照名はStart_Date__cとなります) - 必須、デフォルト値などのオプションを設定し、「次へ(Next)」
- プロファイルに対する項目レベルセキュリティ(Field-Level Security)を設定し、「次へ(Next)」
- ページレイアウトへの追加を確認し、「保存(Save)」
- データ型:
- フィールド2:終了日(上記と同様のステップで、項目表示ラベルを
終了日、項目名をEnd_Dateとして追加します。) - フィールド3:ステータス
- データ型:
選択リスト(Picklist)を選択し、「次へ(Next)」 - 項目表示ラベル:
ステータス - 項目名(Field Name):
Status(API参照名はStatus__cとなります) - 値の入力:各行に
計画中,進行中,完了,中断などの選択肢を入力します。 - 「次へ(Next)」をクリックし、項目レベルセキュリティとページレイアウトを設定し、「保存(Save)」
- データ型:
3. メタデータAPI XMLでの定義例(コード形式)
上記でUIから設定した内容は、Salesforceの裏側でメタデータとしてXML形式で管理されます。以下は、Project__cカスタムオブジェクトの基本的なXML定義の一部です。これはUI操作をコードとして表現したものであり、開発者がMetadata APIやSalesforce DXでカスタムオブジェクトをデプロイする際に使用する形式です。
<?xml version="1.0" encoding="UTF-8"?>
<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
<fullName>Project__c</fullName> <!-- オブジェクトのAPI参照名 -->
<actionOverrides> <!-- 標準アクションの動作をオーバーライドするかどうか -->
<actionName>View</actionName>
<type>Default</type>
</actionOverrides>
<allowInChatterGroups>true</allowInChatterGroups> <!-- Chatterグループでの利用を許可するか -->
<compactLayoutAssignment>SYSTEM</compactLayoutAssignment> <!-- モバイル用コンパクトレイアウト -->
<deploymentStatus>Deployed</deploymentStatus> <!-- オブジェクトの展開状況 -->
<enableActivities>true</enableActivities> <!-- 活動(タスク、行動)を許可するか -->
<enableBulkApi>true</enableBulkApi> <!-- Bulk APIでのアクセスを許可するか -->
<enableFeeds>false</enableFeeds> <!-- フィード追跡を許可するか -->
<enableHistory>true</enableHistory> <!-- 項目履歴の追跡を許可するか -->
<enableReports>true</enableReports> <!-- レポートでの利用を許可するか -->
<enableSearch>true</enableSearch> <!-- 検索を許可するか -->
<enableSharing>true</enableSharing> <!-- レコード共有を許可するか -->
<enableStreamingApi>true</enableStreamingApi> <!-- Streaming APIでの利用を許可するか -->
<externalSharingModel>Private</externalSharingModel> <!-- 組織の共有設定(デフォルト) -->
<label>プロジェクト</label> <!-- オブジェクトの表示ラベル -->
<nameField> <!-- レコード名フィールドの定義 -->
<displayFormat>P-{0000}</displayFormat> <!-- レコード名の表示形式 -->
<label>プロジェクト名</label>
<type>AutoNumber</type> <!-- データ型を自動採番に設定 -->
</nameField>
<pluralLabel>プロジェクト</pluralLabel> <!-- オブジェクトの複数形表示ラベル -->
<sharingModel>ReadWrite</sharingModel> <!-- 共有モデル -->
<visibility>Public</visibility> <!-- 可視性 -->
</CustomObject>
これは、手動でUIから設定した内容をXMLとしてエクスポートしたもの、あるいはSFDX CLIなどを用いてコードとして作成・デプロイする際の形式です。この例では、レコード名が自動採番(AutoNumber)になるように設定されています。
注意事項とベストプラクティス
カスタムオブジェクトを設計・実装する際には、Salesforceプラットフォームの特性を理解し、ベストプラクティスに従うことが重要です。
権限要件
- オブジェクト権限(Object Permissions):プロファイル(Profiles)または権限セット(Permission Sets)を通じて、ユーザーがカスタムオブジェクトに対して作成(Create)、参照(Read)、更新(Update)、削除(Delete)のどの操作を許可するかを設定します。
- 項目レベルセキュリティ(Field-Level Security, FLS):特定のプロファイルや権限セットに対して、カスタムオブジェクトの個々のフィールドを表示、編集可能にするかを設定します。これにより、機密性の高いデータを保護します。
- タブの可視性(Tab Visibility):カスタムタブを特定のアプリケーションやプロファイルで表示するかどうかを設定します。
- レコードタイプとページレイアウトの割り当て:複数のレコードタイプを使用する場合、プロファイルに対してどのレコードタイプとそれに対応するページレイアウトを割り当てるかを設定します。
Governor Limits(2025年最新版の一般的な制限)
カスタムオブジェクトとそのデータモデルには、Salesforceのガバナ制限が適用されます。これらの制限は、プラットフォームの安定性とマルチテナント環境の公平性を保つために設けられています。
- カスタムオブジェクト数:組織ごとに最大2,000個のカスタムオブジェクトを作成できます(エディションによりソフト制限は異なる場合があります。多くの場合、本番組織では数百個が実用的な上限とされています)。
- カスタムフィールド数:1つのカスタムオブジェクトにつき、最大800~900個のカスタムフィールドを作成できます(エディションやデータ型により変動)。特にMaster-Detailリレーションは制限が厳しい場合があります(最大10個)。
- データストレージ:組織全体のデータストレージ容量は、ライセンスとユーザー数に基づいて決定されます。各カスタムオブジェクトのレコードは約2KBのストレージを消費します。
- APIコール数:外部システムからのAPIアクセスも組織全体で日次制限があります。大量のデータ操作を行う場合は注意が必要です。
エラー処理
- 入力規則(Validation Rules):データがデータベースに保存される前に、特定の条件に基づいてデータの整合性をチェックし、エラーメッセージを表示することで不適切な入力を防ぎます。
- Apexトリガ(Apex Triggers)/Flow:より複雑なビジネスロジックによるデータ検証や、外部システムとの連携エラーをハンドリングするために使用します。カスタムエラーメッセージをユーザーに提示できます。
- カスタムエラーログオブジェクト:重要な統合や非同期処理の実行時に発生したエラーを記録するための専用のカスタムオブジェクトを作成し、エラー監視とデバッグを効率化します。
パフォーマンス最適化
- 不必要なフィールドの作成を避ける:使用しないカスタムフィールドは作成せず、データモデルをシンプルに保ちます。多くのフィールドは、クエリパフォーマンスやページロード時間に影響を与える可能性があります。
- インデックスの活用:頻繁にフィルタリングやソートに使用されるカスタムフィールド(特に外部IDとしてマークされたテキストフィールドやルックアップフィールド)には、Salesforceによって自動的にインデックスが付与されます。しかし、特定のカスタムインデックスが必要な場合は、Salesforceサポートに相談することも可能です。
- リレーション設計の最適化:ルックアップリレーションとマスター詳細リレーションの使い分けを適切に行います。マスター詳細リレーションはより強いデータ整合性を提供しますが、親子レコード間のロック競合が発生するリスクがあります。
- リストビューとレポートのフィルタリング:大規模なデータセットに対しては、効果的なフィルタリング条件を設定し、結果セットのサイズを小さく保つことで、ロード時間を短縮します。
- 数式フィールドとサマリー項目の考慮:数式フィールドや積み上げ集計(Roll-Up Summary)項目は便利ですが、複雑な計算や多数のレコードにわたる集計は、パフォーマンスに影響を与える可能性があります。リアルタイム性が不要な場合は、ApexバッチやFlowで値を計算し、通常のフィールドに保存することも検討します。
よくある質問 FAQ
Q1:カスタムオブジェクトと標準オブジェクトの主な違いは何ですか?
A1:標準オブジェクトはSalesforceが提供するデフォルトのビジネスエンティティ(例:Account, Contact, Opportunity)で、削除やAPI参照名の変更ができません。一方、カスタムオブジェクトはユーザーが独自の要件に合わせて作成し、完全にカスタマイズ(削除、API参照名の変更、フィールド追加など)できます。カスタムオブジェクトはAPI参照名に必ず「__c」が付きます。
Q2:カスタムオブジェクトを作成したのに、UIからデータ入力ができない、または表示されない場合、何をチェックすべきですか?
A2:まず、カスタムオブジェクトの「展開状況(Deployment Status)」が「展開済み(Deployed)」になっているかを確認します。次に、そのカスタムオブジェクトの「カスタムオブジェクトタブ」が作成されているか、そしてそのタブが、利用するプロファイル(または権限セット)に「デフォルトで表示(Default On)」または「タブの表示(Tab Hidden)」以外で割り当てられているかを確認します。さらに、プロファイル/権限セットでオブジェクトの「作成」「参照」権限と、関連するページレイアウトの割り当てが適切に行われているかを確認してください。
Q3:カスタムオブジェクトに大量のデータをインポートする際の推奨されるツールと考慮事項は何ですか?
A3:データ量や複雑度に応じて、Salesforceの「データインポートウィザード(Data Import Wizard)」または「Data Loader」を使用します。Data Loaderは最大500万件のレコードを処理でき、より高度なマッピングやエラー処理が可能です。考慮事項としては、リレーションフィールドはSalesforce IDまたは外部ID(External ID)で正確にマッピングすること、トリガやワークフローがパフォーマンスに影響を与える場合は一時的に無効化を検討すること、バッチサイズを最適化することが挙げられます。
まとめと参考資料
Salesforce カスタムオブジェクトは、Salesforceプラットフォームの柔軟性と拡張性の根幹をなす機能です。これを活用することで、企業は標準のCRM機能を超えて、あらゆるビジネスニーズに対応する独自のデータモデルとプロセスを構築できます。適切なデータモデリング、ガバナ制限への理解、そしてベストプラクティスの適用が、堅牢でスケーラブルなSalesforceソリューションを実現するための鍵となります。
本記事では、カスタムオブジェクトのコア価値、ビジネスシーンでの活用例、技術的背景、他ソリューションとの比較、実装例、そして重要な注意事項とベストプラクティスについて詳細に解説しました。これらの知識が、Salesforce管理者および開発者の皆様がプラットフォームを最大限に活用するための一助となれば幸いです。
公式リソース
- 📖 公式ドキュメント:Custom Object Considerations - Salesforce ヘルプ
https://help.salesforce.com/s/articleView?id=sf.custom_object_considerations.htm&type=5 - 📖 公式ドキュメント:Create a Custom Object - Salesforce ヘルプ
https://help.salesforce.com/s/articleView?id=sf.dev_object_create.htm&type=5 - 📖 公式ドキュメント:CustomObject - Metadata API Developer Guide
https://developer.salesforce.com/docs/atlas.en-us.api_meta.meta/api_meta/meta_customobject.htm - 🎓 Trailhead モジュール:Data Modeling for Salesforce
https://trailhead.salesforce.com/content/learn/modules/data_modeling - 🎓 Trailhead モジュール:Admin Beginner
https://trailhead.salesforce.com/content/learn/trails/admin_beginner
コメント
コメントを投稿