सरणी के रूप में स्टोर करें (असामान्यीकृत)
मैं अतिरिक्त मॉड्यूल पर विचार करूंगा intarray
जो सुविधाजनक (और तेज़) कार्य प्रदान करता है uniq()
और sort()
. एक सामान्य आधुनिक पोस्टग्रेज इंस्टालेशन में यह इतना आसान है:
CREATE EXTENSION intarray;
इनका उपयोग करते हुए, एक आसान CHECK
बाधा आरोही को लागू कर सकती है विशिष्ट . के साथ सरणियाँ तत्व।
CHECK (uniq(sort(cat_arr)) = cat_arr)
आप अतिरिक्त कर सकते हैं (वैकल्पिक रूप से) एक ट्रिगर है जो सरणी मानों को सामान्य करता है ON INSERT OR UPDATE
खुद ब खुद। तब आप बस कोई भी . पास कर सकते हैं सरणी (संभवतः अनसोल्ड और डुप्लिकेट के साथ) और सब कुछ बस काम करता है। पसंद:
CREATE OR REPLACE FUNCTION trg_search_insup_bef()
RETURNS trigger AS
$func$
BEGIN
NEW.cat_arr := uniq(sort(NEW.cat_arr);
RETURN NEW;
END
$func$ LANGUAGE plpgsql;
CREATE TRIGGER insup_bef
BEFORE INSERT OR UPDATE OF cat_arr ON search
FOR EACH ROW
EXECUTE PROCEDURE trg_search_insup_bef();
अतिरिक्त मॉड्यूल इंटररे वैकल्पिक है, और भी तरीके हैं:
लेकिन इंटररे फ़ंक्शन बेहतर प्रदर्शन प्रदान करते हैं।
फिर आप बस एक UNIQUE
बना सकते हैं बाधा संपूर्ण सरणी की विशिष्टता को लागू करने के लिए सरणी स्तंभ पर।
UNIQUE (cat_arr)
मैंने केवल दो दिन पहले इस संबंधित उत्तर में ट्रिगर्स (कम विश्वसनीय लेकिन अधिक सुविधाजनक) के साथ संयोजन (बहुत सख्त और विश्वसनीय) बाधाओं के लाभों के बारे में अधिक लिखा था:
यदि, प्रत्येक संयोजन के लिए, आपको प्रति श्रेणी केवल आईडी (और कोई अतिरिक्त जानकारी) संग्रहीत करने की आवश्यकता है, तो यह पर्याप्त होना चाहिए।
हालांकि , इस तरह से संदर्भात्मक अखंडता आसानी से सुनिश्चित नहीं की जाती है। सरणी तत्वों (अभी तक) के लिए कोई विदेशी कुंजी बाधाएं नहीं हैं - जैसे आपके लिंक में प्रलेखित
:यदि श्रेणियों में से कोई एक हटा दिया जाता है या आप आईडी बदलते हैं, तो संदर्भ टूट जाते हैं ...
सामान्यीकृत स्कीमा
यदि आपको अधिक स्टोर करने की आवश्यकता है या आप संदर्भात्मक अखंडता को लागू करने के लिए सामान्यीकृत स्कीमा के साथ जाना चाहते हैं या किसी कारण से, आप ऐसा भी कर सकते हैं, और हाथ से बने भौतिक दृश्य (एक अनावश्यक तालिका) को पॉप्युलेट करने के लिए एक ट्रिगर जोड़ सकते हैं और इसी तरह विशिष्टता को लागू करें:
CREATE TABLE search (
search_id serial PRIMARY KEY
, ... more columns
);
CREATE TABLE cat (
cat_id serial PRIMARY KEY
, cat text NOT NULL
);
CREATE TABLE search_cat (
search_id int REFERENCES search ON DELETE CASCADE
, cat_id int REFERENCES cat
, PRIMARY KEY (search_id, cat_id)
);
संबंधित उत्तर (अद्वितीय संयोजनों के लिए नहीं, बल्कि अद्वितीय तत्वों के लिए) जो ट्रिगर प्रदर्शित करता है: