Benar, masalahnya adalah Anda ingin hanya satu objek dari satu sub-tipe untuk mereferensikan baris tertentu dari kelas induk. Mulai dari contoh yang diberikan oleh @Jay S, coba ini:
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)
);
Ini adalah contoh subtipe terpisah yang disebutkan oleh @mike g.
Komentar ulang oleh @Countably Infinite dan @Peter:
INSERT ke dua tabel akan membutuhkan dua pernyataan insert. Tapi itu juga berlaku di SQL setiap kali Anda memiliki tabel anak. Itu hal yang biasa dilakukan.
UPDATE mungkin memerlukan dua pernyataan, tetapi beberapa merek RDBMS mendukung UPDATE multi-tabel dengan sintaks GABUNG, sehingga Anda dapat melakukannya dalam satu pernyataan.
Saat mengkueri data, Anda dapat melakukannya hanya dengan mengkueri media
tabel jika Anda hanya membutuhkan informasi tentang kolom umum:
SELECT name, url FROM media WHERE media_id = ?
Jika Anda mengetahui bahwa Anda sedang mengkueri film, Anda bisa mendapatkan informasi spesifik film dengan sekali gabung:
SELECT m.name, v.release_date
FROM media AS m
INNER JOIN movies AS v USING (media_id)
WHERE m.media_id = ?
Jika Anda menginginkan informasi untuk entri media tertentu, dan Anda tidak tahu jenisnya, Anda harus bergabung ke semua tabel subtipe Anda, mengetahui bahwa hanya satu tabel subtipe tersebut yang akan cocok:
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 = ?
Jika media yang diberikan adalah film, maka semua kolom di t.*
akan menjadi NULL.