2008-12-12 16 views
45

मेरे आवश्यकताMySQL Enum प्रकार बनाम में शामिल होने के टेबल

एक तालिका एक स्थिति स्तंभ को बनाए रखने की जरूरत है।

यह कॉलम 5 राज्यों में से एक का प्रतिनिधित्व करता है।


प्रारंभिक डिजाइन

मैं सोचा मैं सिर्फ यह एक पूर्णांक स्तंभ बनाने के लिए और एक अंकीय मान का उपयोग कर राज्यों का प्रतिनिधित्व कर सकते हैं।

  • 0 =
  • 1 = चल
  • 2 = दुर्घटनाग्रस्त
  • 3 = रुका हुआ
  • 4 =

बंद कर दिया के बाद से मैं अपने ऐप बनाए रखने के लिए नहीं करना चाहती शुरू पूर्णांक से उनके स्ट्रिंग विवरण में मैपिंग, मैं उन्हें एक अलग राज्य विवरण तालिका (एक एफके संबंध पर भरोसा) में रखने की योजना बना रहा हूं।

तब मैंने पाया कि MySQL में एक ईएनएम प्रकार है जो मेरी आवश्यकता से बिल्कुल मेल खाता है। MySQL पर प्रत्यक्ष निर्भरता के अलावा, क्या ENUM प्रकार का उपयोग करने में कोई समस्या है?

+0

ईएनएन डेटा प्रकार 1 के साथ गिनती शुरू करता है, जैसा आपने इंगित किया है 0 के साथ नहीं। – Tomalak

+1

देखें: http://dev.mysql.com/doc/refman/5.0/en/enum.html – Tomalak

उत्तर

81
  • एक Enum में मूल्यों का वह समूह बदलने से ALTER TABLE जो एक मेज पुनर्गठन के कारण हो सकता की आवश्यकता है - अगर आप बस के अंत तक एक नया मूल्य जोड़ने एक अविश्वसनीय रूप से महंगा ऑपरेशन (टेबल पुनर्गठन नहीं होता है ईएनएम परिभाषा, लेकिन यदि आप एक को हटाते हैं, या ऑर्डर बदलते हैं, तो यह एक टेबल पुनर्गठन करता है)। जबकि लुकअप टेबल में मानों का सेट बदलना उतना आसान है जितना INSERT या DELETE।

  • ईएनएन में मानों के साथ अन्य विशेषताओं को जोड़ने का कोई तरीका नहीं है, जैसे कि सेवानिवृत्त हो चुके हैं, और कौन से आपके उपयोगकर्ता इंटरफ़ेस में ड्रॉप-डाउन सूची में शामिल होने योग्य हैं। हालांकि, एक लुकअप टेबल में ऐसे विशेषताओं के लिए अतिरिक्त कॉलम शामिल हो सकते हैं।

  • विशिष्ट मानों की एक सूची प्राप्त करने के लिए ईएनएन से पूछना बहुत मुश्किल है, मूल रूप से आपको INFORMATION_SCHEMA से डेटा प्रकार परिभाषा से पूछताछ करने और बीएलओबी से बाहर सूची को पार्स करने की आवश्यकता होती है। आप अपनी तालिका से SELECT DISTINCT status आज़मा सकते हैं, लेकिन यह केवल वर्तमान में उपयोग में जाने वाले स्टेटस मान प्राप्त करता है, जो कि ENUM में सभी मान नहीं हो सकता है। हालांकि, अगर आप एक लुकअप तालिका में मानों रखने के लिए, यह क्वेरी करने के लिए आसान है, है, प्रकार आदि

मैं Enum का एक बड़ा प्रशंसक नहीं हूँ, जैसा कि आप बता सकते हैं। :-)

यह चेक बाधाओं पर लागू होता है जो केवल कॉलम की तुलना निश्चित मानों के साथ करते हैं। हालांकि MySQL किसी भी तरह की जांच बाधाओं का समर्थन नहीं करता है।

+1

आपकी युक्तियों के लिए धन्यवाद बिल। कभी-कभी ईएनएन प्रकार की तरह अवशोषण सरल और सुरुचिपूर्ण लग सकते हैं लेकिन एक प्रशासनिक टाइमबॉम्ब है। – ashitaka

+4

ओह मैं भूल गया: ENUM मानक एसक्यूएल नहीं है और AFAIK डेटाबेस का कोई अन्य ब्रांड इसका समर्थन नहीं करता है। इसलिए यदि आप इसका उपयोग करते हैं तो यह आपके पोर्टेबिलिटी को सीमित करता है। –

+3

किसी ने मुझे एक डाउनवोट दिया। जब आप डाउनवॉट देते हैं, तो क्या आप कृपया बता सकते हैं कि आपका आपत्ति क्या है? शायद मैं जवाब में सुधार कर सकते हैं। –

0

अंतर्राष्ट्रीयकरण के लिए एक तालिका आसान होगी। लेकिन डेटाबेस के बाहर पूरी तरह से एक वर्ग होगा। मुझे लगता है कि एक समस्या की खोज में एक समाधान होने के लिए मुझे लगता है - या जब आप जानते हैं कि डेटाबेस क्या है तो आप क्या उपयोग करते हैं।

9

यहां लेख speed comparison of enum है। शायद यह कुछ संकेत देता है। आईएमएचओ इसे स्ट्रिंग्स ("हां/नहीं", "बाल/वयस्क") की निश्चित सूची में उपयोग तक ही सीमित होना चाहिए, जिसमें भविष्य में 99% संभावनाएं नहीं बदली हैं।

7

mysql में Enums पहले से समझाए गए कारणों के लिए खराब हैं।
मैं निम्नलिखित तथ्य जोड़ सकता हूं: Enum सर्वर पक्ष पर किसी भी प्रकार की सत्यापन सुनिश्चित नहीं करता है। यदि आप एक मान के साथ एक पंक्ति डालते हैं जो enum परिभाषा में बाहर नहीं निकलता है, तो आपको एनएम फ़ील्ड घोषणा की पूर्ण क्षमता के आधार पर डीबी में अच्छा या शून्य मान मिलेगा।

tinyints के बारे में मेरे बिंदु:
- enums 65535 मूल्यों
तक ही सीमित हैं - अगर आप 256 से अधिक मूल्यों की जरूरत नहीं है, tinyint प्रत्येक पंक्ति के लिए कम जगह ले जाएगा, और अपने व्यवहार में बहुत अधिक "predictible" है ।

+0

रुको, तो enums हैं या tinyints बुरा? अथवा दोनों? –

+1

काफी यकीन है कि वह कहने के लिए 'enums' बताए गए कारणों के लिए बुरे हैं। – abenson

+0

एबेंसन सही है, मैंने अपना जवाब संपादित किया। – MatthieuP

2

यदि आपके पास अपने डीबी में अधिक डेटा है (अधिक डेटा तो आपके पास रैम है) और आप ENUM मान कभी नहीं बदलेंगे, मैं शामिल होने के बजाय, ENUM के साथ जाऊंगा। यह तेज़ होना चाहिए।
इसके बारे में सोचें, शामिल मामले में, आपको दूसरी तालिका में अपनी प्राथमिक कुंजी पर अपनी विदेशी कुंजी और इंडेक्स पर एक इंडेक्स चाहिए। जैसा कि रिहो ने कहा, बेंचमार्क देखें।

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