किसी रिलेशनल डेटाबेस में एनुमरेटेड टाइप का प्रतिनिधित्व कैसे करना चाहिए?


12

मैं एक संबंधपरक डेटाबेस को विकसित करने पर काम कर रहा हूं, जो मेरी कंपनी के लिए काम कर रहे डिवाइस पर होने वाले लेनदेन को ट्रैक करता है। डिवाइस पर विभिन्न प्रकार के लेन-देन हो सकते हैं, इसलिए हमारे पास हमारे मुख्य रिकॉर्ड तालिकाओं में से एक में "ट्रांस_टाइप" फ़ील्ड है। मेरे समूह ने इस क्षेत्र के प्रकार को पूर्णांक बनाने का फैसला किया है और इसे एक एन्यूमरेटेड प्रकार के रूप में माना है। मेरा अंतर्ज्ञान मुझे बताता है कि इस क्षेत्र को एक स्ट्रिंग बनाने के लिए एक बेहतर विचार होगा ताकि हमारे डेटाबेस का डेटा अधिक पठनीय और प्रयोग करने योग्य हो। मेरे सहकर्मी चिंतित लग रहे हैं कि इससे मूल्य की तुलना में अधिक परेशानी होगी। यह स्ट्रिंग तुलना बहुत महंगा है और टाइपोस की संभावना एक बाधा से बहुत बढ़िया है।

तो, आपकी राय में, जब एक संबंधपरक डेटाबेस में एक फ़ील्ड से निपटना जो अनिवार्य रूप से एक एन्यूमरेटेड वैल्यू है, तो क्या इस फ़ील्ड को पूर्णांक या स्ट्रिंग बनाने के लिए एक बेहतर डिज़ाइन निर्णय है? या क्या कोई और विकल्प है जिसकी मैंने अनदेखी की है?

नोट: स्पष्ट गणना प्रकार हम उस डेटाबेस द्वारा समर्थित नहीं हैं जिसका हम उपयोग कर रहे हैं। और जिस सॉफ्टवेयर को हम विकसित कर रहे हैं वह इस डेटाबेस के साथ इंटरफेस करेगा C C ++ में लिखा गया है।


क्या यह लंबे समय तक किसी और पर प्रहार करता है ताकि इसे बनाने की तालिका में केवल एक प्रकार की जाँच की परिभाषा बना सके? कुछ इस तरह से: रचनात्मक टेबल हिट (आईपी varchar (40), ip_class ENUM (0, "IPv4", 1, "IPv6")); यह आपको अध्यादेश या स्ट्रिंग के साथ = <और> जाँच करने की अनुमति देनी चाहिए (जो कि अध्यादेश के नक्शे)।
dlamblin

जवाबों:


26

आपके डेटाबेस में अलग-अलग प्रकार की एक अलग तालिका होनी चाहिए जिसमें एक आईडी नंबर और एक स्ट्रिंग नाम और आपके द्वारा उपयोगी कोई अन्य कॉलम हो। फिर प्रत्येक प्रकार इस तालिका में एक पंक्ति के रूप में मौजूद है। फिर अपनी तालिका में आप लेनदेन को रिकॉर्ड कर रहे हैं "trans_Type" फ़ील्ड उस संदर्भ तालिका की कुंजी के लिए एक विदेशी कुंजी होनी चाहिए। यह डेटाबेस सामान्यीकरण में एक मानक अभ्यास है।

इस तरह आपने एक आधिकारिक नाम स्ट्रिंग संग्रहीत किया है, प्रदर्शन के लिए संख्या तुलना का उपयोग करने के लिए मिलता है, और संदर्भात्मक अखंडता है कि हर लेनदेन का एक मान्य प्रकार है।


1
हां और यदि आप तय करते हैं कि आप 'O' को 'Open' में बदलना चाहते हैं तो आपको केवल एक पंक्ति बदलनी होगी।
डैनियल कापलान

+1। एक साधारण int / string table एक संबंधपरक db में enums का प्रतिनिधित्व करने का सबसे अच्छा तरीका है।
mike30

संभवतः, अगले आगंतुक जो जावा समाधान की तलाश कर रहे हैं, वे इसे उपयोगी पाते हैं
जौहेन

2
यह। अतिरिक्त क्रेडिट के लिए - यदि देव टीम ने पूर्णांक को जावा / सी # एनम या कुछ इसी तरह परिभाषित किया है, तो आप एक परीक्षण लिख सकते हैं जो यह जांचता है कि कोड एनम की परिभाषा लुकअप टेबल से हट गई है या नहीं। हमेशा एक खतरा होता है कि किसी तत्व को अनुक्रम से जोड़ने से चीजें सिंक से बाहर आ सकती हैं और आपको तब तक एहसास नहीं होता जब तक कि लाइव डेटा रिकॉर्ड गलत नहीं दिखता।
जूलिया हेवर्ड

4

एक सामान्य अभ्यास एक trans_typesतालिका बनाना है , और फिर आपकी मुख्य तालिका को नामांकित विदेशी कुंजी के साथ संदर्भित करना है trans_type_id। यह सुनिश्चित करता है कि आपके रिकॉर्ड केवल मान्य गणना वाले प्रकारों को संदर्भित करेंगे।

उदाहरण:

trans_type
----------
  आईडी
  नाम

लेन-देन
------------
  आईडी
  trans_date
  विवरण
  trans_type_id (FK to trans_type.id)

उदाहरण डेटा:

trans_type

आईडी | नाम
----------
1 | प्रस्तुत
2 | रद्द करना


लेन-देन

आईडी | trans_date | trans_type_id
---------------------------------
1 | 2012-12-31 | 1
2 | 2013-01-09 | 2

3

यदि मान डेटाबेस में पूर्णांक के रूप में आ रहे हैं, तो उन्हें इस तरह संग्रहीत करें। डेटाबेस में लिखते समय स्ट्रिंग्स में कनवर्ट करने का ओवर-हेड लगाने की कोई आवश्यकता नहीं है। आप हमेशा स्ट्रिंग / पाठ मान (अधिक सामान्यीकृत) के साथ एक लुकअप तालिका से संबंधित कर सकते हैं।

यह किसी प्रकार के अद्यतन रूटीन को चलाने के बजाय किसी एकल स्थान में स्ट्रिंग मान को अद्यतन करने का अतिरिक्त लाभ है। 1 = 'लाल' के बजाय यह 'वास्तव में लाल' के बराबर हो सकता है

स्ट्रिंग मानों (अपसामान्य) के साथ केवल एक तालिका की आवश्यकता के मुकाबले प्रदर्शन रिपोर्टिंग के लिए यह आदर्श नहीं है। इस क्षेत्र पर एक सूचकांक प्रदर्शन को काफी अच्छा बना देगा।

अधिकांश RDBMS पर्याप्त अश्वशक्ति की अनुमति देगा। हालाँकि आपके सादे डेटा फॉर्म में तालिका को 'पढ़ने' में सक्षम होने का आपका विचार, तालिका में शामिल होना कोई बड़ी बात नहीं है। बस किसी दृश्य या किसी समान वस्तु का उपयोग करने की आदत डालें।


2

मुझे इस सवाल के अन्य जवाबों से असहमत होना है जो अलग गणना तालिका दृष्टिकोण की वकालत कर रहे हैं।

हालाँकि, मैं निश्चित रूप से पहले से ही कही गई बात को नहीं दोहराने के पक्ष में हूं, इसलिए मैं केवल स्टैक ओवरफ्लो पर एक ही प्रश्न के उत्तर को स्वीकार करूंगा: /programming//a/229919 / 114,626


लिंक किए गए उत्तर के लिए +1। इस प्रश्न के लिए, आपका जुड़ा हुआ उत्तर सही प्रतीत होता है। लेकिन निश्चित रूप से, यदि प्रश्नकर्ता एन्यूमरेटेड प्रकारों में लचीलापन चाहता है तो एक संदर्भ तालिका बहुत बेहतर होगी।
हरक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.