2009-04-17 15 views
18

मैं डेटाबेस में एक गणना फ़ील्ड को कैसे कार्यान्वित करूं जो गणनाओं का समर्थन नहीं करता? (यानी SQLite)डेटाबेस में enum फ़ील्ड के बिना गणना को कैसे संभालें?

फ़ील्ड को आसानी से "field =" के साथ खोजने योग्य होना चाहिए? तो किसी भी प्रकार के डेटा क्रमबद्धता का उपयोग करना एक बुरा विचार है।

+0

यदि यह एक डुप्लिकेट है, तो कृपया अच्छा रहें। मैंने पूछने से पहले मैंने स्टैक ओवरव्लो पर जवाब की तलाश की थी। – epochwolf

उत्तर

49

लुकअप टेबल पर एक विदेशी कुंजी का उपयोग करने का दृष्टिकोण मैं उपयोग करता हूं। असल में, मैं इसका उपयोग तब भी करता हूं जब मैं ऐसे डेटाबेस का उपयोग करता हूं जो 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 में कोई अर्थ नहीं है।

+0

= बनाम == चीज़ के लिए धन्यवाद :) यह थोड़ी देर हो गया है क्योंकि मैंने सीधे एसक्यूएल का उपयोग किया है। – epochwolf

+0

महान उत्तर, मेरे द्वारा +1। – Brann

+0

थोड़ा पुराना सवाल, लेकिन भयानक उत्तर। पक्ष में मत देना। –

-1

मैं एक वर्चर का उपयोग करूंगा। क्या यह आपके लिए कोई विकल्प नहीं है? एक varchar क्षेत्र

मैं व्यक्तिगत रूप से varchars के प्रयोग की वकालत करेंगे का उपयोग

  • उपयोग एक पूर्णांक क्षेत्र

  • क्योंकि आप जीता ':

+0

एक वर्चर का उपयोग करके denormalized डेटा का कारण बन जाएगा। यदि आप enum मान का नाम बदलना चाहते हैं, तो संदर्भ तालिका में केवल एक पंक्ति को बदलने के बजाय, इसे संपूर्ण तालिका पर एक अपडेट की आवश्यकता है। –

1

आप मूल रूप से दो विकल्प हैं यदि आप अपना enum बदलते हैं तो कुछ भी तोड़ें + फ़ील्ड मानव-पठनीय हैं, लेकिन इनट्स में कुछ समर्थक हैं, अर्थात् प्रदर्शन (डेटा का आकार एक स्पष्ट उदाहरण है)

2

संभावित मूल्यों को प्रतिबंधित करने के लिए मैं एक तालिका में एक विदेशी कुंजी का उपयोग करता हूं जिसमें गणना आइटम होते हैं।

यदि आप अपनी खोजों में शामिल नहीं होना चाहते हैं तो जॉइन एक समस्या नहीं है तो कुंजी को एक वर्चर बनाएं, फिर कुंजी को एक आईएनटी बनाएं और जब तक आपको उस क्षेत्र पर खोज करने की आवश्यकता न हो, तब तक शामिल न हों।

ध्यान दें कि डीबी में आपकी गणना डालने से आपके कोड में मानों की संकलन समय की जांच हो जाती है (जब तक आप कोड में गणना को डुप्लिकेट नहीं करते हैं।) मुझे यह एक बड़ी तरफ पाया गया है।

0

यह है कि मैं क्या हाल ही में

किया मेरी हाइबरनेट मैप किया गया है में POJO- मैं स्ट्रिंग के रूप में सदस्य के प्रकार रखा जाता है और यह डेटाबेस में VARCHAR है।

इस के लिए सेटर एक enum लेता है एक और सेटर जो String- लेता है, लेकिन यह निजी है (या आप क्षेत्र directly- मैप कर सकते हैं, तो यह है कि आप क्या पसंद करते हैं है।)

अब तथ्य मैं उपयोग कर रहा हूँ स्ट्रिंग सभी से encapsulated है। शेष एप्लिकेशन के लिए- मेरे डोमेन ऑब्जेक्ट्स एनम का उपयोग करते हैं। और जहां तक ​​डेटाबेस का संबंध है- मैं स्ट्रिंग का उपयोग कर रहा हूं।

यदि मुझे आपका प्रश्न याद आया- मैं क्षमा चाहता हूं।

+0

यह समझ में आता है। रेल पर रूबी एक ही व्यवहार को बोनस के रूप में सत्यापन के साथ अनुमति देगा। – epochwolf

संबंधित मुद्दे