エンティティ
Entity
概要(サマリー)
エンティティ(Entity)とは、日本語で「実体」や「独立したもの」を意味し、ITの分野(特にデータベース設計やプログラミング)では、システムの中で管理したい「モノ」や「概念」のまとまりを指す。
例えば、学校の管理システムを開発する場合、「生徒」「教師」「教科」「教室」などはそれぞれシステムが記録・追跡すべき対象であり、これらがエンティティとなる。エンティティは、それぞれの特徴を表す「名前」や「住所」「学年」といった細かな情報(属性)を持ち、他のエンティティと繋がることでシステム全体のデータの流れを作り出す。
詳細解説
システムが管理する「モノや概念」の実体
システムを設計する際、最初に行うのが「このシステムで何を管理するか」を整理する作業である。エンティティは、実在する具体的なモノ(人、商品、店舗など)だけでなく、実体のない抽象的な概念(注文、予約、ログイン履歴など)も含まれる。
データベース設計(ER図)におけるエンティティ
データベース設計(リレーショナルデータベース)において、エンティティはデータを格納する「テーブル」の設計図になる。
設計者は、管理したいエンティティ(実体)と、それらの関係性(リレーションシップ)を表した「ER図(Entity-Relationship Diagram)」を描いてデータベースの構造を整理する。
- エンティティ: 「顧客(Customer)」
- 属性(Attribute): 「顧客ID」「氏名」「電話番号」「メールアドレス」
- テーブル化: データベース内に
customersという名前のテーブルが作られ、1行(レコード)が特定の1人の顧客データを表す。
プログラミング(オブジェクト指向・DDD)におけるエンティティ
オブジェクト指向プログラミングや、ドメイン駆動設計(DDD)という設計手法において、エンティティは特別な意味を持つオブジェクトとして扱われる。
ここでのエンティティの定義は、「固有の識別子(ID)を持ち、そのライフサイクル(生成されてから消滅するまで)を通じて同一性が維持されるオブジェクト」である。
たとえば、「ユーザー」というエンティティは、時間の経過とともに名前や住所が変わったとしても、ユーザーID(識別子)が同じであれば「同一人物」とみなされる。
値オブジェクト(Value Object)との違い
エンティティを理解する上で最も重要なのが、対比される概念である「値オブジェクト」との違いである。
| 比較項目 | エンティティ (Entity) | 値オブジェクト (Value Object) |
|---|---|---|
| 同一性の判断基準 | 固有の識別子(ID)が同じかどうか | 保持しているすべての値(中身)が同じかどうか |
| 具体例 | パスポート、生徒、注文 | お金、色、電話番号、住所 |
| 状態の変更 | 名前や属性が変わっても同一とみなす | 値が変わるとそれは別の「値」になる |
例えば、1万円札を思い浮かべてみる。
- もし「シリアル番号(ID)」に注目して、「世界に1枚しかない特定の1万円札」として扱う場合、これはエンティティである。
- 単に買い物をする際、「1万円の価値があること」だけが重要で、どの1万円札を使っても同じであると扱う場合、これは値オブジェクトである。
エンティティの具体例
以下は、TypeScriptを使ったオブジェクト指向的なエンティティの設計例である。
エンティティ(User)のコード例
class User {
// 固有の識別子(ID)を持つ
public readonly id: string;
public name: string;
constructor(id: string, name: string) {
this.id = id;
this.name = name;
}
// 同一性の検証ロジック:IDが同じなら、名前が書き換わっていても「同じユーザー」と判断する
public equals(other: User): boolean {
return this.id === other.id;
}
}
// 使用例
const userA = new User("u001", "たろう");
const userB = new User("u001", "じろう"); // 名前は違うがIDは同じ
console.log(userA.equals(userB)); // true (同一のエンティティとみなされる)
AIコーディングとの関係
AIに「ECサイトのデータベース設計を考えて」や「DDDに則ったユーザー登録のクラス設計をして」と依頼すると、AIは管理対象となるエンティティを切り出し、それに応じたテーブル定義(SQL)やクラスコードを生成してくれる。
特にドメイン駆動設計(DDD)のコードを書かせる際は、「エンティティと値オブジェクトを明確に区別し、エンティティには識別子による同一性検証ロジック(equalsメソッド等)を含めてください」と指示することで、ビジネスロジックの不整合が起きにくい強固なクラス設計を出力させることができる。
よくある勘違い
エンティティ = データベースのテーブルそのもの?
概念としては別のものである。
エンティティは「設計・ビジネス上の関心ごととしての実体」であり、テーブルは「それをデータベースに保存するための物理的な仕組み」である。基本的には1対1で対応することが多いが、1つのエンティティ(例: 注文)の情報を、データベース上では複数のテーブル(例: orders テーブルと order_items テーブル)に分割して保存することもある。
属性(Attribute)やプロパティとエンティティの違いは?
エンティティは管理対象となる「まとまり(全体)」であり、属性やプロパティはそのまとまりを構成する「個々の要素(ディテール)」である。
例えば、「車」というエンティティに対して、「ナンバープレート」「車種」「色」「走行距離」といった個々のデータ項目が属性に該当する。
プログラミングにおける「オブジェクト(Object)」と何が違う?
オブジェクトは、プログラム上でデータと処理をまとめた「物質的な仕組み(メモリ上に展開されたもの)」の総称である。
エンティティは、オブジェクトという仕組みを使って表現される「設計上の役割(ライフサイクルとIDを持つ実体)」の一つである。すべてのエンティティはオブジェクトとしてプログラムに実装されるが、すべてのオブジェクトがエンティティというわけではない(単なる計算補助クラスなどはエンティティではない)。
まとめ
- エンティティとは、システムで管理・追跡すべき対象となる「モノ」や「概念」のまとまり(実体)。
- データベース設計においては、テーブル構造やリレーションを定義するための基本要素となる。
- プログラミング(特にDDDなど)では、時間の経過によって状態が変わっても、固有の「ID(識別子)」によって同一であり続けるオブジェクトを指す。
- 値そのものによって同一性を判断する「値オブジェクト」と正しく切り分けて設計することが、バグの少ないシステム構築に繋がる。
- AIにデータ構造を設計させる際は、エンティティの抽出や関係性の整理(リレーション定義)をレビューしてもらうと効果的。
より詳しくAIに聞いてみよう
- エンティティという概念を、RPGゲームの「モンスター」や「プレイヤーの装備品」を例にして初心者向けに説明してください。
- データベースの設計(データモデリング)において、エンティティを漏れなく見つけ出し、ER図として整理する手順を教えてください。
- TypeScriptやJavaで、エンティティクラスから値オブジェクト(住所など)を切り離して、すっきりしたコードにリファクタリングする例を示してください。
- AIに「ブログシステムのオブジェクト指向設計」を考えてもらうとき、エンティティ、値オブジェクト、サービス、リポジトリの役割分担を明確にしたコードを出力させるプロンプトを教えてください。
- データベースの「正規化」と、エンティティ設計の関係性についてわかりやすく教えてください。