階層的なデータ構造を表現するPostgreSQLの継承テーブル
PostgreSQLにおける継承テーブルの使用タイミング
PostgreSQLでは、テーブル継承機能を使用して、テーブル間で共通する属性や制約を定義することができます。これは、コードの冗長性を減らし、データベーススキーマの保守性を向上させるのに役立ちます。
継承テーブルを使用するタイミング
継承テーブルは、以下の状況で役立ちます。
- 共通の属性を持つテーブル
複数のテーブルで共通する属性がある場合、親テーブルにその属性を定義し、子テーブルはその親テーブルを継承することで、属性の重複を避けることができます。
例:
階層的なデータ構造を表現する場合、継承テーブルを使用して、親子の関係を定義することができます。
将来的にテーブルの拡張性を考慮する場合、継承テーブルを使用して、新しい属性や制約を容易に追加することができます。
商品
テーブルに、将来的に販売価格
や在庫数
などの属性を追加する必要がある場合、商品詳細
という子テーブルを作成し、そこにこれらの属性を定義することで、商品
テーブルを拡張することができます。
継承テーブルの注意点
- 継承テーブルを使用する際には、以下の点に注意する必要があります。
- 子テーブルは親テーブルのすべての属性を継承するため、子テーブルにのみ必要な属性を定義すると、データ冗長が発生する可能性があります。
- 親テーブルのスキーマを変更すると、子テーブルにも影響を与えるため、変更には注意が必要です。
- 複雑なスキーマになると、理解や管理が難しくなる可能性があります。
共通属性を持つテーブル
-- 親テーブル: 個人
CREATE TABLE person (
id serial NOT NULL PRIMARY KEY,
name text NOT NULL,
address text NOT NULL,
phone_number text NOT NULL
);
-- 子テーブル: 社員
CREATE TABLE employee (
id serial NOT NULL PRIMARY KEY,
department text NOT NULL,
salary integer NOT NULL,
-- 親テーブルから継承
INHERITS (person)
);
-- 子テーブル: 顧客
CREATE TABLE customer (
id serial NOT NULL PRIMARY KEY,
customer_type text NOT NULL,
-- 親テーブルから継承
INHERITS (person)
);
階層的なデータ構造
-- 親テーブル: カテゴリ
CREATE TABLE category (
id serial NOT NULL PRIMARY KEY,
name text NOT NULL
);
-- 子テーブル: サブカテゴリ
CREATE TABLE subcategory (
id serial NOT NULL PRIMARY KEY,
category_id integer NOT NULL REFERENCES category(id),
name text NOT NULL,
-- 親テーブルから継承
INHERITS (category)
);
テーブルの拡張性
-- 親テーブル: 商品
CREATE TABLE product (
id serial NOT NULL PRIMARY KEY,
name text NOT NULL,
description text NOT NULL
);
-- 子テーブル: 商品詳細
CREATE TABLE product_detail (
id serial NOT NULL PRIMARY KEY,
product_id integer NOT NULL REFERENCES product(id),
price integer NOT NULL,
quantity integer NOT NULL,
-- 親テーブルから継承
INHERITS (product)
);
継承テーブル以外の方法
ビューは、複数のテーブルのデータを結合して、あたかも一つのテーブルのように扱うことができる機能です。
CREATE VIEW vw_person AS
SELECT *
FROM employee
UNION ALL
SELECT *
FROM customer;
抽象データ型は、データ型とそれに関連する操作をまとめたものです。
CREATE TYPE person AS (
name text,
address text,
phone_number text
);
CREATE TABLE employee (
id serial NOT NULL PRIMARY KEY,
department text NOT NULL,
salary integer NOT NULL,
person person
);
CREATE TABLE customer (
id serial NOT NULL PRIMARY KEY,
customer_type text NOT NULL,
person person
);
トリガーは、特定の操作が行われた際に、自動的に別の操作を実行する機能です。
CREATE TRIGGER update_person_address
BEFORE UPDATE ON person
FOR EACH ROW
BEGIN
UPDATE customer
SET address = NEW.address
WHERE customer.person_id = OLD.id;
END;
- 共通属性が少なく、変更頻度が少ない場合は、ビューが適しています。
- 共通属性が多く、複雑な操作が必要な場合は、抽象データ型が適しています。
- データの整合性を保つ必要がある場合は、トリガーが適しています。
継承テーブルは、これらの方法と組み合わせて使用することもできます。
postgresql