Juist, het probleem is dat u slechts één object van één subtype wilt laten verwijzen naar een bepaalde rij van de bovenliggende klasse. Probeer dit, uitgaande van het voorbeeld van @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)
);
Dit is een voorbeeld van de onsamenhangende subtypes genoemd door @mike g.
Re opmerkingen van @Countably Infinite en @Peter:
INSERT naar twee tabellen zou twee insert-instructies vereisen. Maar dat geldt ook in SQL telkens wanneer u onderliggende tabellen heeft. Het is heel gewoon om te doen.
UPDATE kan twee instructies vereisen, maar sommige merken van RDBMS ondersteunen multi-table UPDATE met JOIN-syntaxis, dus u kunt het in één instructie doen.
Wanneer u gegevens opvraagt, kunt u dit eenvoudig doen door de media
. op te vragen tabel als u alleen informatie nodig heeft over de gemeenschappelijke kolommen:
SELECT name, url FROM media WHERE media_id = ?
Als je weet dat je een film zoekt, kun je filmspecifieke informatie krijgen met een enkele join:
SELECT m.name, v.release_date
FROM media AS m
INNER JOIN movies AS v USING (media_id)
WHERE m.media_id = ?
Als u informatie wilt voor een bepaald media-item, en u weet niet welk type het is, moet u lid worden van al uw subtypetabellen, wetende dat slechts één zo'n subtypetabel zal overeenkomen:
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 = ?
Als het gegeven medium een film is,dan alle kolommen in t.*
zal NULL zijn.