そうです、問題は、1 つのサブタイプの 1 つのオブジェクトのみが、親クラスの特定の行を参照するようにしたいということです。@Jay Sの例から始めて、これを試してください:
create table media_types (
media_type int primary key,
media_name varchar(20)
);
insert into media_types (media_type, media_name) values
(2, 'TV series'),
(3, 'movie');
create table media (
media_id int not null,
media_type not null,
name varchar(100),
description text,
url varchar(255),
primary key (media_id),
unique key (media_id, media_type),
foreign key (media_type)
references media_types (media_type)
);
create table tv_series (
media_id int primary key,
media_type int check (media_type = 2),
season int,
episode int,
airing date,
foreign key (media_id, media_type)
references media (media_id, media_type)
);
create table movies (
media_id int primary key,
media_type int check (media_type = 3),
release_date date,
budget numeric(9,2),
foreign key (media_id, media_type)
references media (media_id, media_type)
);
これは、 @mike g によって言及された互いに素なサブタイプの例です。
@Countably Infinite と @Peter による再コメント:
2 つのテーブルへの INSERT には、2 つの挿入ステートメントが必要です。ただし、子テーブルがある場合はいつでも SQL に当てはまります。それは普通のことです。
UPDATE には 2 つのステートメントが必要な場合がありますが、一部のブランドの RDBMS は JOIN 構文を使用した複数テーブルの UPDATE をサポートしているため、1 つのステートメントで実行できます。
media
データをクエリするとき、共通の列に関する情報のみが必要な場合は、テーブルをクエリするだけで実行できます。
SELECT name, url FROM media WHERE media_id = ?
映画をクエリしていることがわかっている場合は、単一の結合で映画固有の情報を取得できます。
SELECT m.name, v.release_date
FROM media AS m
INNER JOIN movies AS v USING (media_id)
WHERE m.media_id = ?
特定のメディア エントリの情報が必要で、そのタイプがわからない場合は、すべてのサブタイプ テーブルに参加する必要があります。そのようなサブタイプ テーブルは 1 つだけ一致することがわかっています。
SELECT m.name, t.episode, v.release_date
FROM media AS m
LEFT OUTER JOIN tv_series AS t USING (media_id)
LEFT OUTER JOIN movies AS v USING (media_id)
WHERE m.media_id = ?
指定されたメディアが映画の場合、すべての列t.*
が NULL になります。