Точно така, проблемът е, че искате само един обект от един подтип да препраща към даден ред от родителския клас. Започвайки от примера, даден от @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:
INSERT към две таблици ще изисква два оператора за вмъкване. Но това е вярно и в SQL всеки път, когато имате дъщерни таблици. Това е обикновено нещо.
UPDATE може да изисква два израза, но някои марки RDBMS поддържат UPDATE с множество таблици със синтаксис JOIN, така че можете да го направите с един израз.
Когато отправяте заявка към данни, можете да го направите просто като направите заявка за 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 = ?
Ако искате информация за даден медиен запис и не знаете какъв тип е той, ще трябва да се присъедините към всичките си таблици с подтипове, като знаете, че само една такава таблица на подтипове ще съвпада:
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.