टिप्पणियों और उत्तरों के आधार पर, और कुछ प्राथमिक शोध के आधार पर, मेरे पास पोस्टग्रेस-एरती से टिप्पणियों के लिए निम्नलिखित सारांश है। वास्तव में आपके इनपुट की सराहना करेंगे।
Postgres डेटाबेस तालिका कॉलम में प्रविष्टियों को प्रतिबंधित करने के तीन तरीके हैं। "रंगों" को संग्रहीत करने के लिए एक तालिका पर विचार करें जहाँ आप केवल 'लाल', 'हरा', या 'नीला' को मान्य प्रविष्टियाँ बनाना चाहते हैं।
-
प्रगणित डेटा प्रकार
CREATE TYPE valid_colors AS ENUM ('red', 'green', 'blue'); CREATE TABLE t ( color VALID_COLORS );
लाभ यह है कि इस प्रकार को एक बार परिभाषित किया जा सकता है और फिर आवश्यकतानुसार कई तालिकाओं में पुन:उपयोग किया जा सकता है। एक मानक क्वेरी ENUM प्रकार के सभी मानों को सूचीबद्ध कर सकती है, और इसका उपयोग एप्लिकेशन फॉर्म विजेट बनाने के लिए किया जा सकता है।
SELECT n.nspname AS enum_schema, t.typname AS enum_name, e.enumlabel AS enum_value FROM pg_type t JOIN pg_enum e ON t.oid = e.enumtypid JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace WHERE t.typname = 'valid_colors' enum_schema | enum_name | enum_value -------------+---------------+------------ public | valid_colors | red public | valid_colors | green public | valid_colors | blue
नुकसान हैं, ENUM प्रकार सिस्टम कैटलॉग में संग्रहीत है, इसलिए इसकी परिभाषा देखने के लिए ऊपर के रूप में एक क्वेरी की आवश्यकता है। तालिका परिभाषा देखते समय ये मान स्पष्ट नहीं होते हैं। और, चूंकि एक ENUM प्रकार वास्तव में एक डेटा प्रकार है जो बिल्ट इन NUMERIC और TEXT डेटा प्रकारों से अलग है, नियमित संख्यात्मक और स्ट्रिंग ऑपरेटर और फ़ंक्शन इस पर काम नहीं करते हैं। इसलिए, कोई ऐसा प्रश्न नहीं कर सकता जैसे
SELECT FROM t WHERE color LIKE 'bl%';
-
बाधाओं की जाँच करें
CREATE TABLE t ( colors TEXT CHECK (colors IN ('red', 'green', 'blue')) );
दो फायदे हैं, एक, "जो आप देखते हैं वही आपको मिलता है," यानी, कॉलम के लिए मान्य मान सीधे तालिका परिभाषा में दर्ज किए जाते हैं, और दूसरा, सभी मूल स्ट्रिंग या संख्यात्मक ऑपरेटर काम करते हैं।
-
विदेशी कुंजियाँ
CREATE TABLE valid_colors ( id SERIAL PRIMARY KEY NOT NULL, color TEXT ); INSERT INTO valid_colors (color) VALUES ('red'), ('green'), ('blue'); CREATE TABLE t ( color_id INTEGER REFERENCES valid_colors (id) );
मूल रूप से एक ENUM प्रकार बनाने के समान ही, मूल संख्यात्मक या स्ट्रिंग ऑपरेटरों को छोड़कर, और मान्य मानों को खोजने के लिए सिस्टम कैटलॉग को क्वेरी करने की आवश्यकता नहीं है।
color_id
. को लिंक करने के लिए शामिल होना ज़रूरी है वांछित टेक्स्ट मान के लिए।