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

क्या मुझे पोस्टग्रेएसक्यूएल में इनहेरिटेंस डिजाइन करने के लिए टाइप कॉलम जोड़ना चाहिए?

निश्चित रूप से आप इसे उदाहरण के लिए यह लागू करने के लिए कर सकते हैं कि केवल एक उप तालिका किसी दी गई पंक्ति को संदर्भित कर सकती है:

CREATE TABLE Super_Table (
  super_id SERIAL PRIMARY KEY,
  sub_type CHAR(1) NOT NULL,
  UNIQUE KEY (super_id, sub_type) 
);

CREATE TABLE Sub_Table_A (
  super_id PRIMARY KEY,
  sub_type CHAR(1) NOT NULL,
  CHECK (sub_type = 'A'),
  FOREIGN KEY (super_id, sub_type) REFERENCES Super_Table (super_id, sub_type)
);

CREATE TABLE Sub_Table_B (
  super_id PRIMARY KEY,
  sub_type CHAR(1) NOT NULL,
  CHECK (sub_type = 'B'),
  FOREIGN KEY (super_id, sub_type) REFERENCES Super_Table (super_id, sub_type)
);

अब सुपर_टेबल में एक पंक्ति को दोनों उप तालिकाओं में एक पंक्ति द्वारा संदर्भित नहीं किया जा सकता है। Super_Table की पंक्ति में या तो 'A' या 'B' होना चाहिए और इसलिए केवल एक उप तालिका विदेशी कुंजी संदर्भ को संतुष्ट कर सकती है।

अपनी टिप्पणी दें:

मेरी समझ यह है कि INHERITS का वर्तमान PostgreSQL कार्यान्वयन अनुक्रमणिका, अद्वितीय स्थिरांक और विदेशी कुंजी बाधाओं से संबंधित कई विसंगतियों की अनुमति देता है। इस सुविधा का उपयोग करना मुश्किल और त्रुटि-प्रवण है।

मूल रूप से, क्योंकि अनुक्रमणिका केवल एक ही तालिका में मौजूद होती है, यदि आपकी मूल तालिका में एक अद्वितीय बाधा है तो यह माता-पिता और उसके सभी बच्चों पर उस विशिष्टता को कैसे लागू कर सकती है? बच्चे अपनी तालिकाओं में मान सम्मिलित कर सकते हैं जो पहले से ही माता-पिता में मौजूद हैं, या माता-पिता एक मान सम्मिलित कर सकते हैं जो पहले से ही बच्चों में से एक में मौजूद है।

इसी तरह विदेशी कुंजियाँ मूल तालिका और/या उसके बच्चों को संदर्भित नहीं कर सकती हैं क्योंकि यह अस्पष्ट है कि माता-पिता/बच्चों में एक ही प्राथमिक कुंजी या अद्वितीय मान के साथ कई पंक्तियाँ मौजूद हो सकती हैं तो कौन सी पंक्ति का संदर्भ दिया जाता है।

ये PostgreSQL में INHERITS की ज्ञात और अनसुलझी सीमाएँ हैं। ऊपर दिखाया गया डिज़ाइन प्राथमिक कुंजी के लिए समस्या का समाधान करता है, लेकिन द्वितीयक अद्वितीय कुंजियों के लिए नहीं।

http://archives.postgresql.org/pgsql-hackers/2010 -05/msg00285.php




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. चुनें * नई तालिका से पोस्टग्रेज में समकक्ष

  2. पासवर्ड प्रॉम्प्ट के बिना बैश स्क्रिप्ट में PostgreSQL CLI (psql) चलाएँ?

  3. JDBC का उपयोग करके PostgreSQL पर धीरे-धीरे डालें

  4. PostgreSQL 9 . में कैलेंडर टेबल

  5. रेल / पोस्टग्रेज:"ग्रुप बाय क्लॉज में दिखाई देना चाहिए या एक समग्र कार्य में उपयोग किया जाना चाहिए"