लुकअप टेबल पर एक विदेशी कुंजी का उपयोग करने का दृष्टिकोण मैं उपयोग करता हूं। असल में, मैं इसका उपयोग तब भी करता हूं जब मैं ऐसे डेटाबेस का उपयोग करता हूं जो ENUM (उदा। MySQL) का समर्थन करता है।
सादगी के लिए, मैं लुकअप टेबल के लिए हमेशा मौजूद "id
" छोड़ सकता हूं, और केवल लुकअप तालिका की प्राथमिक कुंजी के रूप में मेरी मुख्य तालिका में आवश्यक वास्तविक मान का उपयोग कर सकता हूं। इस तरह आपको मूल्य प्राप्त करने के लिए शामिल होने की आवश्यकता नहीं है।
CREATE TABLE BugStatus (
status VARCHAR(20) PRIMARY KEY
);
INSERT INTO BugStatus (status) VALUES ('NEW'), ('OPEN'), ('FIXED');
CREATE TABLE Bugs (
bug_id SERIAL PRIMARY KEY,
summary VARCHAR(80),
...
status VARCHAR(20) NOT NULL DEFAULT 'NEW',
FOREIGN KEY (status) REFERENCES BugStatus(status)
);
वैसे, तार भंडारण ENUM
के MySQL के कार्यान्वयन तुलना में अधिक स्थान लेता है, लेकिन जब तक प्रश्न में तालिका पंक्तियों के लाखों लोगों की है, यह शायद ही मायने रखती है।
लुकअप तालिका के अन्य लाभ है कि आप जोड़ सकते हैं या एक सरल INSERT
या DELETE
साथ सूची से कोई मान निकालने के लिए, ENUM
साथ आप ALTER TABLE
उपयोग करने के लिए सूची को फिर से परिभाषित करने के लिए है जबकि कर सकते हैं।
उदाहरण के लिए ENUM
में अनुमत मानों की वर्तमान सूची से पूछताछ करने का प्रयास करें, उदाहरण के लिए अपने उपयोगकर्ता इंटरफ़ेस में पिक-सूची पॉप्युलेट करने के लिए। यह एक बड़ी परेशानी है! लुकअप टेबल के साथ, यह आसान है: SELECT status from BugStatus
।
यदि आपको आवश्यकता है तो आप लुकअप टेबल में अन्य विशेषता कॉलम जोड़ सकते हैं (उदा। केवल प्रशासकों के लिए उपलब्ध विकल्पों को चिह्नित करने के लिए)। ENUM
में, आप प्रविष्टियों को एनोटेट नहीं कर सकते हैं; वे सिर्फ साधारण मूल्य हैं।
CREATE TABLE Bugs (
bug_id SERIAL PRIMARY KEY,
summary VARCHAR(80),
...
status VARCHAR(20) NOT NULL
CHECK (status IN ('NEW', 'OPEN', 'FIXED'))
);
लेकिन एक CHECK
बाधा के इस प्रयोग में एक ही से ग्रस्त है: -
एक लुकअप तालिका के अलावा एक अन्य विकल्प CHECK
बाधाओं (MySQL नहीं है डेटाबेस प्रदान की उन का समर्थन करता है) का उपयोग किया जाएगा ENUM
के रूप में नुकसान: ALTER TABLE
के बिना मूल्यों की सूची को बदलने में कठिनाई, अनुमत मानों की सूची से पूछताछ करना मुश्किल है, मूल्यों को एनोटेट करना मुश्किल है।
पीएस: एसक्यूएल में समानता तुलना ऑपरेटर एक एकल =
है। डबल ==
का SQL में कोई अर्थ नहीं है।
यदि यह एक डुप्लिकेट है, तो कृपया अच्छा रहें। मैंने पूछने से पहले मैंने स्टैक ओवरव्लो पर जवाब की तलाश की थी। – epochwolf