तत्वों की PostgreSQL सरणी जो प्रत्येक एक विदेशी कुंजी है


88

मैं अपने ऐप के लिए एक डीबी बनाने का प्रयास कर रहा हूं और एक चीज जो मैं करना चाहता हूं वह यह है कि मेरे Usersऔर Itemsतालिकाओं के बीच एक-से-कई संबंध बना रहा है ।

मुझे पता है कि मैं एक तीसरी तालिका बना सकता हूं ReviewedItems, और कॉलम में एक Userआईडी और एक Itemआईडी होना चाहिए , लेकिन मैं यह जानना चाहूंगा कि क्या इसमें एक कॉलम बनाना संभव है Users, आइए बताते हैं कि reviewedItemsएक पूर्णांक सरणी है जिसमें विदेशी कुंजियाँ हैं की समीक्षा की।ItemsUser

यदि PostgreSQL ऐसा कर सकता है, तो कृपया मुझे बताएं! यदि नहीं, तो मैं अपने तीसरे टेबल रूट पर जाऊंगा।


3
Postgres में इस सुविधा को जोड़ने के लिए पैच दिए गए हैं, देखें blog.2ndquadrant.com/… (2012) और postgresql.org/message-id/… (2017)। उन्हें अभी तक स्वीकार नहीं किया गया है, लेकिन उम्मीद है कि एक दिन।
साइमन Kissane

जवाबों:


71

नहीं, यह संभव नहीं है।

PostgreSQL एक संबंधपरक DBMS है, जो ठीक से सामान्यीकृत डेटा मॉडल पर सबसे अधिक कुशलता से काम करता है। Arrays हैं - परिभाषा के अनुसार, उन्हें सेट के आदेश दिए गए हैं - संबंधपरक डेटा संरचना नहीं और SQL मानक इसलिए सरणी तत्वों पर विदेशी कुंजियों को परिभाषित करने का समर्थन नहीं करता है, और न ही PostgreSQL।

हालाँकि, आप अन्य तालिकाओं में प्राथमिक कुंजियों को जोड़ने वाले सरणी तत्वों के साथ एक पूरी तरह से ठीक डेटाबेस का निर्माण कर सकते हैं। उन सरणी तत्वों को, हालांकि, विदेशी कुंजी घोषित नहीं किया जा सकता है और इसलिए DBMS संदर्भात्मक अखंडता को बनाए नहीं रखेगा।


3
आप एक बाधा ट्रिगर को परिभाषित कर सकते हैं जो कि जांच करेगा। लेकिन मुझे यकीन नहीं है कि यह सभी मामलों में मज़बूती से काम करता है।
a_horse_with_no_name

@a_horse_with_no_name: क्या आप इसके बारे में एक उदाहरण दे सकते हैं reliably in all cases? आप कभी-कभी ट्रिगर विफल हो सकते हैं मतलब है? धन्यवाद।
लुआन हुआन्ह

1
@LuanHuynh: मुझे तकनीकी (तकनीकी) विवरण याद नहीं है, लेकिन पिछली बार जब यह मेलिंग सूची पर चर्चा की गई थी, तो किसी ने उल्लेख किया था कि एक संगत बाधा ट्रिगर सभी मामलों को पकड़ नहीं सकता है - लेकिन यह अब सच नहीं हो सकता है
a_horse -with_no_name

धन्यवाद, मुझे लगता है कि मैं उनके लिए एक रिलेशनशिप टेबल
Zach

1
@a_horse_with_no_name क्या आप इस तरह के अवरोध के उदाहरण के साथ उत्तर दे सकते हैं?
ऑरेंजडॉग

69

जल्द ही ऐसा करना संभव हो सकता है: https://commitfest.postgresql.org/17/1252/ - मार्क रोफेल इस पैच पर कुछ उत्कृष्ट काम कर रहे हैं!

पैच (एक बार पूर्ण) की अनुमति देगा

CREATE TABLE PKTABLEFORARRAY (
    ptest1 float8 PRIMARY KEY,
    ptest2 text
);
CREATE TABLE FKTABLEFORARRAY (
    ftest1 int[],
    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY,
    ftest2 int
);

हालांकि, लेखक को वर्तमान में पैच (अपनी क्षमता से परे) को फिर से बनाने में मदद करने की आवश्यकता है ताकि कोई भी इसे पढ़े जो जानता है कि पोस्टग्रैज इंटर्ल्स कृपया मदद कर सकें।


8
बहुत गर्म वास्तव में ...CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int )
विक्टर

1
पैच अप करने के लिए लेखक की प्रतीक्षा कर रहा है। सुविधा उपलब्ध होने तक, आपको अखंडता की जांच के लिए ट्रिगर का उपयोग करना होगा जो धीमा हो सकता है।
योन्घम

36
शर्म की बात है, यह शामिल नहीं लगता है :(
Teocali

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.