ठीक है, समस्या यह है कि आप मूल वर्ग की किसी भी पंक्ति को संदर्भित करने के लिए एक उप-प्रकार की केवल एक वस्तु चाहते हैं। @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 से दो तालिकाओं के लिए दो सम्मिलित विवरण की आवश्यकता होगी। लेकिन यह एसक्यूएल में भी सच है जब भी आपके पास बाल टेबल होते हैं। यह करना एक सामान्य बात है।
अद्यतन को दो कथनों की आवश्यकता हो सकती है, लेकिन RDBMS के कुछ ब्रांड 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.*
. में सभी कॉलम शून्य होगा।