【Salesforce】カスタムオブジェクトとカスタムメタデータの違いって何？

### **結論**
- **データ管理が目的**なら、カスタムオブジェクトを使用。
- **システムや設定情報の管理が目的**なら、カスタムメタデータを使用。

---

### **1. 基本的な概要**
| 項目                | カスタムオブジェクト                            | カスタムメタデータ                          |
|---------------------|--------------------------------------------|-----------------------------------------|
| **目的**            | アプリケーションのデータを保存・管理するため。         | アプリケーションやシステムの設定情報を保存するため。 |
| **主な用途**        | - レコードデータの管理<br>- ビジネスプロセスの実行用 | - 設定値や定数の管理<br>- カスタマイズや動的ロジックの実現 |
| **保存するデータ例** | - 顧客情報<br>- 契約情報<br>- 注文データ         | - デフォルト設定<br>- 検証ルール<br>- 参照可能な設定値 |

---

### **2. 作成および使用の違い**

| 項目                     | カスタムオブジェクト                          | カスタムメタデータ                          |
|--------------------------|------------------------------------------|-----------------------------------------|
| **作成・変更方法**        | SalesforceのUI、API、またはApex経由でレコードを作成・変更可能。 | メタデータのレコードはAPIやApexでは変更不可（変更セットやメタデータAPI経由で行う）。 |
| **移行方法**             | - データローダー、データインポートウィザードなどでデータを移行 | - 変更セットまたはメタデータAPIを使用してレコードごと移行 |
| **Apexからの参照**        | Apexクラスやトリガーで通常のSOQLクエリで参照可能。 | `getInstance()`を利用して直接参照可能（SOQL不要）。 |
| **クエリ速度**           | 通常のSOQLでクエリ。データ量が多い場合はパフォーマンスに影響。 | クエリ速度が速く、Apexコードで直接参照可能（キャッシュされているため）。 |
| **データ量の制限**        | 大量のレコードデータを保存可能（ストレージ制限に依存）。 | 1組織あたりのメタデータレコード数に制限がある（10,000件）。 |

---

### **3. 特徴・機能の違い**

| 項目                     | カスタムオブジェクト                          | カスタムメタデータ                          |
|--------------------------|------------------------------------------|-----------------------------------------|
| **カスタム設定との違い**   | 主にデータを管理するために使用。設定の保存には向かない。    | カスタム設定と似ているが、より柔軟に設定やデプロイが可能。 |
| **デプロイ可能性**        | オブジェクト自体はデプロイ可能だが、データは手動またはインポートが必要。 | レコード（設定データ）も含めて変更セットで移行可能。 |
| **バージョン管理**        | 設定変更は容易だが、ソース管理ツールではデータを直接追跡できない。 | ソース管理ツールで追跡可能（メタデータXMLとして保存される）。 |
| **アクセス制限**          | プロファイルや権限セットで制御可能。                 | カスタムメタデータ自体にはアクセス権限の設定が不要。 |
| **主な利用例**            | - 顧客データ<br>- 注文情報<br>- 契約情報         | - APIキーの保存<br>- デフォルト値の設定<br>- 設定ルールの管理 |

---

### **4. 主な利用ケース**

#### **カスタムオブジェクトを使うべき場合**
- アプリケーションで動的に生成・変更されるデータを保存する必要がある場合。
- 大量のレコードを管理する必要がある場合（例: 顧客情報、注文履歴）。
- データをレポートやダッシュボードで分析したい場合。

#### **カスタムメタデータを使うべき場合**
- システムやアプリケーションの設定情報を管理したい場合（例: 検証ルール、デフォルト設定）。
- 設定を組織間で移行（デプロイ）する必要がある場合。
- データ量が少なく、アクセス速度が重視される場合。

---

### **5. 比較のまとめ**
| 特徴                   | カスタムオブジェクト                     | カスタムメタデータ                      |
|------------------------|------------------------------------|-----------------------------------|
| **柔軟性**              | 高い（データの追加・変更が可能）。            | 中程度（設定情報向けで変更は制限される）。       |
| **データ量の制限**       | 多量のデータを扱える。                   | 制限あり（10,000レコードまで）。        |
| **用途**               | データ管理用                         | 設定管理用                          |
| **デプロイの容易さ**      | データの移行には追加の手間が必要。            | レコード含めて一括デプロイ可能。            |
| **キャッシュ速度**       | 通常のクエリ速度。                     | 高速（キャッシュされるため）。             |

---

### **結論**
- **データ管理が目的**なら、カスタムオブジェクトを使用。
- **システムや設定情報の管理が目的**なら、カスタムメタデータを使用。

必要に応じて、両者を組み合わせて活用すると効率的です！

追加

以下に**カスタムオブジェクト**、**カスタムメタデータ**、**カスタム設定**の違いを分かりやすく表でまとめました。

---

### **カスタムオブジェクト vs カスタムメタデータ vs カスタム設定**
| 特徴                     | **カスタムオブジェクト**                              | **カスタムメタデータ**                             | **カスタム設定**                                   |
|--------------------------|------------------------------------------------|--------------------------------------------|--------------------------------------------|
| **主な用途**              | データ管理用                                     | アプリケーションの設定情報を管理                         | 設定値の保存、組織ごとやプロファイルごとの設定が可能          |
| **保存するデータ例**       | 顧客情報、契約情報、注文履歴など                        | デフォルト設定、APIキー、検証ルール                   | 制限値、システム設定値、デフォルト値                        |
| **レコードの移行**         | データローダーやインポートウィザードを使用                 | 変更セットやメタデータAPIで移行可能                   | 一部移行可能（カスタム階層設定は不可）                       |
| **レコードの編集方法**      | Salesforce UI、Apex、APIで編集可能                 | Salesforce UIで直接編集不可<br>デプロイで更新       | UI、Apex、APIで編集可能                              |
| **Apexでの参照方法**       | SOQLでクエリ実行                                   | `getInstance()`で直接参照可能（SOQL不要）           | `CustomSettingsName__c.getInstance()`で参照可能         |
| **アクセス速度**           | 通常（クエリの実行に依存）                            | 高速（キャッシュされているため）                      | 高速（キャッシュされているため）                      |
| **ストレージ容量**         | 組織のデータストレージ容量に依存                        | 制限あり（最大10,000レコード）                        | 制限あり（階層型：最大1,000項目、単純型：10MBまで）          |
| **プロファイルや権限セットでの制御** | 権限セットやプロファイルで制御可能                      | 制御不可（管理者がアクセス）                           | 権限セットやプロファイルで制御可能                        |
| **キャッシュ**             | キャッシュされない                                  | キャッシュされる                                   | キャッシュされる                                   |
| **データ構造の柔軟性**      | 複数のカスタムフィールドを持てる                         | 設定情報の保存に特化し、柔軟性は低い                     | 設定情報の保存に特化し、柔軟性は低い                     |
| **適用例**                | - 顧客情報、取引情報<br>- ダッシュボード用データ         | - APIキー管理<br>- デフォルト設定<br>- 検証ルール管理  | - 制限値の保存<br>- 組織やプロファイルごとの設定情報保存       |
| **データの共有と移行**      | データは手動またはデータローダーで移行が必要               | 設定レコードも含めてデプロイ可能                        | データローダーを使って部分的に移行可能                       |

---

### **それぞれの選択が適しているケース**
#### **カスタムオブジェクトを使用すべき場合**
- データの保存・管理が必要な場合（例: 顧客情報、売上データ）。
- レポートやダッシュボードでデータを分析する必要がある場合。

#### **カスタムメタデータを使用すべき場合**
- アプリケーションやシステムの設定値を保存したい場合（例: APIキー、検証ルール）。
- 設定値を環境間でデプロイする必要がある場合。

#### **カスタム設定を使用すべき場合**
- 組織全体やユーザーグループごとに異なる設定値を保存したい場合（例: プロファイルごとの制限値）。
- 高速にアクセス可能な設定値が必要な場合。

---

### **簡単なまとめ**
| **選択基準**       | **カスタムオブジェクト** | **カスタムメタデータ** | **カスタム設定** |
|-------------------|------------------|----------------|----------------|
| **動的なデータ管理** | 適している           | 適していない        | 適していない        |
| **設定値の保存**    | 適していない          | 非常に適している      | 適している          |
| **デプロイの容易さ** | 低い                | 高い             | 中程度            |
| **キャッシュ性能**   | 通常                | 高い             | 高い             |