はじめに
Salesforceを使用する上で最も重要な概念の一つが「sObject」です。sObjectはSalesforceのデータモデルの基本単位であり、データベースのテーブルに相当します。本記事では、SalesforceのデータモデルにおけるsObjectの構造に焦点を当て、その特徴や構成要素について詳しく解説します。
sObjectとは
sObjectは「Salesforce Object」の略称で、Salesforceプラットフォーム上でのデータエンティティを表します。リレーショナルデータベースに例えると、sObjectはテーブルに相当し、各レコードはテーブルの行に相当します。
sObjectの種類
Salesforceには主に2種類のsObjectが存在します:
1. 標準オブジェクト
Salesforceにデフォルトで用意されているオブジェクトです。代表的な標準オブジェクトには以下があります:
- Account:取引先を表す
- Contact:取引先責任者を表す
- Opportunity:商談を表す
- Lead:見込み客を表す
- Case:サポートケースを表す
- User:ユーザーを表す
- Product2:製品を表す
- PricebookEntry:価格表エントリを表す
- Order:注文を表す
2. カスタムオブジェクト
組織固有の要件に合わせて作成したオブジェクトです。カスタムオブジェクトの名前には通常、末尾に「__c」というサフィックスが付きます。
例:
- Project__c:プロジェクトを表すカスタムオブジェクト
- Invoice__c:請求書を表すカスタムオブジェクト
sObjectの構造
sObjectは以下の要素から構成されています:
1. フィールド
フィールドはsObjectの属性またはプロパティを表します。データベースのカラムに相当します。
標準フィールド
SalesforceのすべてのsObjectには、いくつかの標準フィールドが自動的に含まれます:
- Id:18文字の一意識別子(API、Apex、SOQLで使用される形式。UI上では15文字の短縮版が表示される場合がある)
- Name:レコードの名前(一部のオブジェクトでは自動採番)
- CreatedDate:レコード作成日時
- CreatedById:レコード作成者のユーザーID
- LastModifiedDate:最終更新日時
- LastModifiedById:最終更新者のユーザーID
- IsDeleted:削除フラグ(ごみ箱に入っているかどうか)
カスタムフィールド
標準フィールドに加えて、カスタムフィールドを作成することができます。カスタムフィールドの名前には「__c」というサフィックスが付きます。
例:
- CustomField__c:カスタムフィールドの例
2. フィールドデータ型
SalesforceのsObjectでは、様々なデータ型が使用できます。主なデータ型は以下の通りです:
テキスト系データ型
- Text(テキスト):最大255文字の文字列
- Long Text Area(ロングテキストエリア):最大131,072文字の文字列
- Rich Text(リッチテキスト):書式設定可能なテキスト
- Text Area(テキストエリア):複数行のテキスト
- Email(メール):有効なメールアドレス形式の文字列
- Phone(電話):電話番号形式の文字列
- URL(URL):有効なURL形式の文字列
- Encrypted Text(暗号化テキスト):暗号化された文字列
数値系データ型
- Number(数値):整数または小数
- Currency(通貨):通貨金額
- Percent(パーセント):百分率
日付/時間系データ型
- Date(日付):日付のみ
- Date/Time(日付/時間):日付と時間
論理データ型
- Checkbox(チェックボックス):True/Falseの値
選択リスト系データ型
- Picklist(選択リスト):事前定義された値のリストから選択
- Multi-select Picklist(複数選択リスト):複数の値を選択可能
参照系データ型
- Lookup Relationship(参照関係):別のオブジェクトへの参照
- Master-Detail Relationship(主従関係):親子関係を持つ別のオブジェクトへの参照
その他のデータ型
- Auto Number(自動採番):自動的に生成される連番
- Formula(数式):他のフィールドに基づく計算結果
- Roll-up Summary(積み上げ集計):子レコードの値を集計
- Geolocation(位置情報):緯度と経度の組み合わせ
3. リレーションシップ(関連付け)
sObject間のリレーションシップには、主に2種類あります:
1. ルックアップ関係(Lookup Relationship)
ルックアップ関係は、オブジェクト間の緩やかな関連付けを提供します。主な特徴:
- 一方のレコードが削除されても、関連するレコードは残る
- 親オブジェクトへの参照が必須ではない場合がある
- 1つのオブジェクトに複数の異なるルックアップ関係フィールドを作成可能
例:
Contact(取引先責任者) -> Account(取引先)
2. 主従関係(Master-Detail Relationship)
主従関係は、オブジェクト間の強い依存関係を提供します。主な特徴:
- 親(主)レコードが削除されると、子(従)レコードも一緒に削除される
- 子レコードは親レコードなしでは存在できない
- 子レコードは親レコードの共有設定と権限を継承する
- 親オブジェクトのフィールドに対して積み上げ集計が可能
例:
OpportunityLineItem(商談品目) -> Opportunity(商談)
4. メタデータ
各sObjectには、そのsObjectの動作や特性を定義するメタデータが関連付けられています。主なメタデータ要素には以下があります:
- ラベル:ユーザーインターフェイスに表示される名前
- API名:プログラムから参照する名前
- 説明:オブジェクトの目的や使用法の説明
- 共有設定:アクセス権限の制御方法
- 検索可能:検索結果に含めるかどうか
- レポート・ダッシュボード:レポートやダッシュボードでの使用方法
5. sObjectのJSON構造例
REST APIなどでsObjectのデータを取得すると、以下のようなJSON構造で表現されます:
{
"attributes": {
"type": "Account",
"url": "/services/data/v58.0/sobjects/Account/001XXXXXXXXXXXXXXX"
},
"Id": "001XXXXXXXXXXXXXXX",
"Name": "サンプル株式会社",
"Type": "Customer",
"BillingStreet": "東京都千代田区丸の内1-1-1",
"BillingCity": "東京",
"BillingPostalCode": "100-0001",
"Phone": "03-1234-5678",
"CreatedDate": "2023-01-15T09:30:00.000+0000",
"LastModifiedDate": "2023-05-20T14:45:00.000+0000",
"Custom_Field__c": "カスタム値"
}
このJSON構造の特徴:
- attributes:オブジェクトの型とURLが含まれるメタデータ
- 標準フィールド:Id, Name, CreatedDate などの標準フィールド
- カスタムフィールド:Custom_Field__c などのカスタムフィールド(末尾に__cが付く)
sObjectの特別な種類
1. 外部オブジェクト(External Object)
外部オブジェクトは、Salesforce外部のデータソースに保存されているデータを表します。外部オブジェクトの名前には「__x」というサフィックスが付きます。
例:
ExternalOrder__x
2. プラットフォームイベント(Platform Event)
プラットフォームイベントは、Salesforce内外のシステム間でのイベントドリブンなコミュニケーションに使用されます。プラットフォームイベントの名前には「__e」というサフィックスが付きます。
例:
OrderShipped__e
3. BigObject
BigObjectは、大量のデータを保存するために設計されたオブジェクトです。BigObjectの名前には「__b」というサフィックスが付きます。
例:
HistoricalData__b
sObjectの実装詳細
1. レコードタイプ(Record Type)
同じsObjectでも、異なるユースケースやビジネスプロセスに対応するために、複数のレコードタイプを持つことができます。レコードタイプごとに:
- 異なるページレイアウト
- 異なる選択リスト値
- 異なるビジネスプロセス
を設定できます。
2. 検証ルール(Validation Rule)
検証ルールは、レコードが保存される前に、データが特定の基準を満たしていることを確認するためのルールです。検証ルールに違反すると、エラーメッセージが表示され、レコードは保存されません。
3. 数式フィールド(Formula Field)
数式フィールドは、他のフィールドの値に基づいて計算される読み取り専用のフィールドです。数式フィールドは、四則演算、テキスト操作、日付操作、論理演算など、様々な関数をサポートしています。
4. 積み上げ集計フィールド(Roll-up Summary Field)
積み上げ集計フィールドは、主従関係の親オブジェクトに配置され、子オブジェクトのレコードの値を集計します。集計タイプには、COUNT、SUM、MIN、MAXがあります。
sObjectを活用するためのベストプラクティス
1. 命名規則
オブジェクトやフィールドには、明確で一貫性のある命名規則を使用しましょう。
- オブジェクト:単数形の名詞を使用(Customer__c, Order__c など)
- フィールド:具体的な名前を使用(FirstName, LastPurchaseDate__c など)
2. 関連付けの適切な選択
- 緩やかな関連付けが必要な場合は「ルックアップ関係」
- 強い依存関係がある場合は「主従関係」
- 多対多の関係が必要な場合は「連結オブジェクト」
3. インデックスの活用
頻繁に使用される検索条件のフィールドには、カスタムインデックスを作成することでパフォーマンスを向上させることができます。
4. データ型の適切な選択
- 数値を格納する場合は、適切な桁数と小数点以下の桁数を持つ数値型
- 日付情報には、Date型またはDateTime型
- 長いテキストには、Text Area型またはLong Text Area型
5. 項目レベルセキュリティの活用
機密データを含むフィールドには、項目レベルセキュリティを設定して、不正アクセスからデータを保護しましょう。
sObjectの実践的な使用例
1. カスタムオブジェクトの定義例
プロジェクト管理のためのカスタムオブジェクト:
Object: Project__c
Fields:
- Name: テキスト型(プロジェクト名)
- Status__c: 選択リスト型(未開始、進行中、完了、保留)
- StartDate__c: 日付型(開始日)
- EndDate__c: 日付型(終了日)
- Budget__c: 通貨型(予算)
- Manager__c: ルックアップ関係(User)
- Description__c: ロングテキストエリア型(説明)
2. 主従関係の例
プロジェクトとそのタスクの関係:
Master Object: Project__c
Detail Object: Task__c
Fields:
- Name: テキスト型(タスク名)
- Status__c: 選択リスト型(未開始、進行中、完了)
- DueDate__c: 日付型(期日)
- Priority__c: 選択リスト型(高、中、低)
- AssignedTo__c: ルックアップ関係(User)
- Project__c: 主従関係(Project__c)
3. 積み上げ集計フィールドの例
プロジェクトの完了タスク数を集計する積み上げ集計フィールド:
Object: Project__c
Field: CompletedTaskCount__c
Type: 積み上げ集計(数値)
Summarized Object: Task__c
Summarize: COUNT
Filter Criteria: Status__c = "完了"
4. 検証ルールの例
プロジェクトの終了日が開始日より後であることを確認する検証ルール:
Object: Project__c
Rule: EndDateAfterStartDate
Error Condition:
EndDate__c < StartDate__c
Error Message:
"終了日は開始日より後の日付を設定してください。"
Apex言語でのsObject操作
Salesforceの独自プログラミング言語Apexでは、sObjectを以下のように操作できます:
1. sObjectの作成
// 標準オブジェクト
Account acc = new Account();
acc.Name = 'サンプル株式会社';
acc.BillingCity = '東京';
// カスタムオブジェクト
Project__c proj = new Project__c();
proj.Name = '新規プロジェクト';
proj.Status__c = '未開始';
2. sObjectの挿入
Account acc = new Account(Name = 'サンプル株式会社', BillingCity = '東京');
insert acc;
// 複数のレコードをバッチで挿入
List<Contact> contacts = new List<Contact>();
contacts.add(new Contact(LastName = '山田', FirstName = '太郎', AccountId = acc.Id));
contacts.add(new Contact(LastName = '鈴木', FirstName = '花子', AccountId = acc.Id));
insert contacts;
3. sObjectの取得(SOQL)
// 単一のレコードを取得
Account acc = [SELECT Id, Name, BillingCity FROM Account WHERE Name = '山田株式会社' LIMIT 1];
// 関連オブジェクトを含む取得
Account accWithContacts = [
SELECT Id, Name,
(SELECT Id, FirstName, LastName FROM Contacts)
FROM Account
WHERE Id = :accId
];
// 安全な動的SOQL(バインド変数を使用)
String companyName = '山田株式会社';
List<Account> accounts = [SELECT Id, Name FROM Account WHERE Name = :companyName];
// 完全に動的なSOQL(使用は最小限に)
String searchName = '山田株式会社';
String query = 'SELECT Id, Name FROM Account WHERE Name LIKE \'%' + String.escapeSingleQuotes(searchName) + '%\'';
List<Account> dynamicAccounts = Database.query(query);
4. sObjectの更新
Account acc = [SELECT Id, Name FROM Account WHERE Id = :accId];
acc.Phone = '03-9876-5432';
update acc;
// 複数のレコードを更新
List<Account> accountsToUpdate = [SELECT Id, Name FROM Account WHERE BillingCity = '東京'];
for (Account a : accountsToUpdate) {
a.BillingPostalCode = '100-0001';
}
update accountsToUpdate;
5. sObjectの削除
Account acc = [SELECT Id FROM Account WHERE Id = :accId];
delete acc;
// 複数のレコードを削除
List<Contact> contactsToDelete = [SELECT Id FROM Contact WHERE AccountId = :accId];
delete contactsToDelete;
6. 動的にsObjectやフィールドを扱う
// 動的なsObject作成
SObject genericObj = Schema.getGlobalDescribe().get('Account').newSObject();
genericObj.put('Name', '動的作成会社');
insert genericObj;
// オブジェクトのメタデータを取得
Map<String, Schema.SObjectField> fieldMap = Schema.getGlobalDescribe().get('Account').getDescribe().fields.getMap();
for (String fieldName : fieldMap.keySet()) {
Schema.DescribeFieldResult field = fieldMap.get(fieldName).getDescribe();
System.debug('フィールド名: ' + field.getName());
System.debug('ラベル: ' + field.getLabel());
System.debug('データ型: ' + field.getType());
}
sObjectに関する制限と考慮事項
1. 制限
Salesforce の各種制限値(カスタムオブジェクト数、カスタムフィールド数、リレーションシップ数など)は、
エディション、契約内容、アドオンの有無によって大きく異なります。
そのため、具体的な数値は「組織ごとに適用された制限」に従う必要があります。
主な制限項目の例:
- 作成できるカスタムオブジェクト数
- オブジェクトごとのカスタムフィールド数
- 使用できるリレーションシップ(Lookup / Master-Detail)
- 主従関係の階層の深さ
- 積み上げ集計フィールドの数
2. パフォーマンスの考慮事項
- 大量のレコードを扱うオブジェクトではインデックスを適切に設定
- 選択リストの値は合理的な数に制限(多すぎると検索やUIのパフォーマンスが低下)
- 不要なカスタムフィールドを作成しない
- 過度に複雑な数式を避ける
- SOQLクエリでは必要なフィールドのみを取得する(SELECT * は使用できません)
まとめ
sObjectはSalesforceのデータモデルの中心的な概念であり、標準オブジェクトとカスタムオブジェクトの両方でデータを構造化するための強力なフレームワークを提供します。本記事では、sObjectの基本構造、フィールドタイプ、リレーションシップ、そして実際の使用例について解説しました。
sObjectの構造を理解することで、Salesforceプラットフォーム上で効率的なデータモデルを設計し、堅牢なアプリケーションを構築することができます。また、Apexプログラミングやインテグレーションを行う際にも、sObjectの概念は非常に重要です。






