PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

SQL डेटाबेस तालिकाओं में बहुरूपता?

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL के लिए ऑडिट लॉगिंग

  2. PostgreSQL में ऐरे को कैसे अपडेट करें

  3. कैसे अद्वितीय संयुक्त प्राथमिक कुंजी के साथ एक Postgres तालिका बनाने के लिए?

  4. आयात त्रुटि क्या है:प्रतीक नहीं मिला:_PQencryptPasswordConn का अर्थ है और मैं इसे कैसे ठीक करूं?

  5. psycopg का उपयोग करके डालने के लिए समस्या