2011-10-26 16 views
20

क्या मुझे एक पढ़ा डेटाबेस सामान्यीकरण (जॉइन टेबल का उपयोग करके) लागू करना चाहिए या क्या मुझे स्थिर या गतिशील डेटा के लिए ENUM प्रकार का उपयोग करना चाहिए?MySQL डेटाबेस सामान्यीकरण

उदाहरण के लिए:

मैं एक user_status के साथ एक मेज USER है। क्या मुझे एक टेबल status तालिका बनाना चाहिए या मैं स्थिति के साथ एक ENUM सूची बना सकता हूं?

धन्यवाद जी

उत्तर

25

IMHO, enum विस्तार यह बहुत आसान है एक तालिका में अर्थ विज्ञान एम्बेड करने के लिए बनाता है और यह भी द्वारा दक्षता में सुधार: एक प्रश्न

  • में खुला तालिकाओं की संख्या कम करने के लिए आवश्यक मिलती है की संख्या कम

    1. डीबीएमएस

    केवल कमियां मैं के बारे में पता कर रहा हूँ है

    1. ई NUM प्रकार अन्य डीबीएमएस
    2. यदि आप एक बाद की तारीख में Enum सेट करने के लिए अतिरिक्त मान जोड़ने के लिए चुनते हैं, तो आप एक DDL अद्यतन आवेदन कर रहे हैं द्वारा लागू नहीं है - जो एक बहुत बड़ी मेज
    के साथ एक लंबा समय लग सकता

    HTH

    सी

  • +1

    पेफॉर्मेंस टेस्ट: http://www.mysqlperformanceblog.com/2008/01/24/enum-fields-vs-varchar-vs-int-joined-table-what-is-faster/ –

    +1

    'ENUM के साथ अन्य समस्याएं हैं '। एक बात के लिए, सभी 'ENUM' कॉलम खाली स्ट्रिंग का एक विशेष "अज्ञात" मान ले सकते हैं (यदि आवश्यक हो तो 'NULL' के अतिरिक्त); इसके अलावा, यह मान किसी अमान्य मान के किसी असाइनमेंट के लिए उपयोग नहीं किया जाएगा जब तक कि एक सख्त SQL मोड उपयोग में न हो। इससे अनजान डेटाबेस असंगतता हो सकती है; भी, यदि वास्तव में 'ENUM' सूची में एक स्पष्ट खाली स्ट्रिंग मान है, तो इससे जबरदस्त भ्रम हो सकता है (क्योंकि किसी को निर्धारित करने के लिए संख्यात्मक मान का निरीक्षण करना चाहिए कि खाली स्ट्रिंग का "प्रकार" किस प्रकार संग्रहीत किया जाता है)। – eggyal

    +1

    इसके अलावा, संख्यात्मक संदर्भों में संख्यात्मक मानों के अंतर्निहित रूपांतरण से काफी भ्रम पैदा हो सकता है - विशेष रूप से यदि कोई संख्या 'ENUM' मानों के रूप में संख्याओं का प्रतिनिधित्व करने वाले तारों का उपयोग करने का प्रयास करता है। मैनुअल 'ENUM' सूची' ('0', '1', '2') का एक अच्छा उदाहरण देता है: "* यदि आप' 2' स्टोर करते हैं, तो इसे इंडेक्स वैल्यू के रूप में समझा जाता है, और '1' बन जाता है ''(इंडेक्स 2 के साथ मूल्य)। यदि आप' 2 '' स्टोर करते हैं, तो यह एक गणना मूल्य से मेल खाता है, इसलिए इसे '' 2 '' के रूप में संग्रहीत किया जाता है। अगर आप '' '' स्टोर करते हैं, तो यह किसी से मेल नहीं खाता है गणना मूल्य, इसलिए इसे एक सूचकांक के रूप में माना जाता है और '2' '(सूचकांक 3 के साथ मूल्य) बन जाता है। * " – eggyal

    0

    यह वास्तुकला और कई अन्य कारकों पर निर्भर करता है।

    उदाहरण के लिए, आप संग्रहित प्रक्रियाओं को छोड़कर डेटा पढ़ने/लिखने की अनुमति नहीं देते हैं। इस मामले में आप मुफ्त उपयोग "tinyint" डेटाटाइप महसूस कर सकते हैं। यदि आप प्रत्यक्ष प्रश्नों के साथ पढ़ने/लिखने की अनुमति देते हैं तो अनुचित स्थिति से बचने के लिए बाधा का उपयोग करना बेहतर होगा (यदि यूआई या बैक-एंड कोर्स की "गलत" स्थिति डाल सकता है)।

    दूसरी तरफ (और यह संभव है) डेटा प्रवाह में बदलाव हो सकते हैं और शायद आपको नई स्थितियां जोड़ने की आवश्यकता होगी। इस मामले में आपको इसकी आवश्यकता होगी: 1) यदि आपके पास स्थिर डेटाटाइप है तो कुछ भी नहीं करें; 2) यदि आपके पास ENUM है तो बदलें।

    तो ... मेरा जवाब है: यह आपके आवेदन और आपकी आवश्यकताओं पर निर्भर करता है।

    +2

    आप विदेशी कुंजी प्रतिबंध के साथ-साथ सही स्थितियों को लागू कर सकते हैं (InnoDB तालिकाओं का उपयोग।) – Inca

    +0

    ... और एक और एक तालिका बनाने के। मुझे लगता है कि "अति-सामान्यीकरण" (प्रत्येक स्थिति के लिए एक अतिरिक्त तालिका रखने के लिए) सामान्य रूप से एक अच्छा दृष्टिकोण नहीं है। – ravnur

    +0

    क्या आप समझा सकते हैं क्यों नहीं? कई टेबल होने में कोई समस्या नहीं है। (और वे अतिरिक्त लचीलापन की अनुमति देते हैं जैसे किसी स्थिति में संपादन योग्य विवरण जोड़ना, या पुराने रिकॉर्ड के लिए इसे रखते हुए नए रिकॉर्ड के लिए अक्षम करना।) – Inca

    1

    एक अन्य सामग्री पर विचार किया जाना ...

    एक enum केवल डेटाबेस संरचना का एक संशोधन के माध्यम से अद्यतन किया जा सकता कहीं और किसी लिंक किए गए तालिका रिकॉर्ड के गतिशील निर्माण अनुमति देता है।

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