継承マッピング戦略
メニューを表示するにはスワイプしてください
継承はオブジェクト指向モデリングにおける基本的な概念であり、一般的なエンティティを定義し、親から属性や振る舞いを継承する特化したサブタイプを作成することが可能です。しかし、リレーショナルデータベースを設計する際には、継承の表現は容易ではありません。リレーショナルデータベースはテーブルと行を基盤としており、継承階層をネイティブにサポートしていません。そのため、共通のプロパティを持ちながらも固有の特徴を持つ実世界のエンティティをモデル化する際に課題が生じます。クエリの簡潔さ、ストレージ効率、保守性のバランスを考慮したマッピング戦略の選択が必要です。
-- Single-table inheritance: All employee types in one table, distinguished by a 'type' column
CREATE TABLE employees_single (
employee_id SERIAL PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
hire_date DATE NOT NULL,
department_id INTEGER REFERENCES departments(department_id),
manager_id INTEGER REFERENCES employees_single(employee_id),
type VARCHAR(20) NOT NULL CHECK (type IN ('FullTime', 'PartTime')),
salary NUMERIC(12,2), -- Only for FullTime
bonus NUMERIC(12,2), -- Only for FullTime
hourly_rate NUMERIC(8,2), -- Only for PartTime
hours_per_week INTEGER -- Only for PartTime
);
継承階層をリレーショナルテーブルにマッピングするための戦略はいくつか存在します。代表的なアプローチとして、クラステーブル継承とコンクリートテーブル継承があります。
クラステーブル継承は、階層内の各クラス(基底クラスおよびすべてのサブクラス)ごとに個別のテーブルを作成します。各サブクラスのテーブルには、そのサブクラス固有のフィールドのみが含まれ、主キーは基底クラスを参照する外部キーにもなります。この方法は正規化を維持し、サブクラス固有フィールドのNULL値を回避できますが、完全なオブジェクトを取得するには複数テーブルの結合が必要となり、パフォーマンスやクエリの複雑さに影響します。
コンクリートテーブル継承は、各具体的なサブクラスごとに個別のテーブルを作成し、基底クラスのすべてのフィールドを各サブクラスのテーブルに複製します。抽象的な基底クラス用のテーブルは存在しません。この方法はサブクラスインスタンスのクエリを簡素化し、結合を回避できますが、データの冗長性が生じ、すべての型に適用すべき制約の強制が困難になります。
どちらの戦略を選択するかは、データアクセスパターン、各サブクラス固有のフィールド数、階層全体を横断してクエリする頻度などに依存します。
-- Class table inheritance: Separate tables for base class and each subclass
-- Base class table
CREATE TABLE employees_base (
employee_id SERIAL PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
hire_date DATE NOT NULL,
department_id INTEGER REFERENCES departments(department_id),
manager_id INTEGER REFERENCES employees_base(employee_id)
);
-- Subclass table for FullTime employees
CREATE TABLE full_time_employees_cti (
employee_id INTEGER PRIMARY KEY REFERENCES employees_base(employee_id),
salary NUMERIC(12,2) NOT NULL,
bonus NUMERIC(12,2) DEFAULT 0
);
-- Subclass table for PartTime employees
CREATE TABLE part_time_employees_cti (
employee_id INTEGER PRIMARY KEY REFERENCES employees_base(employee_id),
hourly_rate NUMERIC(8,2) NOT NULL,
hours_per_week INTEGER NOT NULL
);
1. シングルテーブル継承とは何ですか?
2. どの継承マッピング戦略が「type」カラムを使用しますか?
3. クラステーブル継承の欠点は何ですか?
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください