क्या एक स्तंभ तालिका अच्छा डिज़ाइन है? [बन्द है]


111

सिर्फ एक कॉलम के साथ एक टेबल रखना ठीक है? मुझे पता है कि यह तकनीकी रूप से अवैध नहीं है, लेकिन क्या इसे खराब डिज़ाइन माना जाता है?

संपादित करें:

कुछ उदाहरण निम्नलिखित हैं:

  • आपके पास 50 मान्य अमेरिकी राज्य कोड वाली एक तालिका है, लेकिन आपको क्रियात्मक राज्य नामों को संग्रहीत करने की कोई आवश्यकता नहीं है।
  • एक ईमेल ब्लैकलिस्ट।

किसी ने एक महत्वपूर्ण क्षेत्र को जोड़ने का उल्लेख किया। जिस तरह से मैं इसे देखता हूं, यह एकल स्तंभ प्राथमिक कुंजी होगा।


मुझे केवल एक कॉलम वाली तालिका के लिए उपयोग-मामले की कल्पना करने में थोड़ी परेशानी हो रही है। क्या आप एक उदाहरण दे सकते हैं?
पॉल मोरी

लेकिन कम से कम इसके लिए एक सूचकांक न बनाएं!
सत्य

3
अमेरिकी राज्य कोड एक डोमेन को परिभाषित करने का शास्त्रीय उदाहरण है
क्वासोई

3
मैंने पहले एक आवेदन के लिए एक ताला मूल्य रखने के लिए इस्तेमाल किया डेटाबेस तालिका देखा है
Russ कैम

इस पैटर्न के लिए मेरा उपयोग डेटा के सेट बनाने के लिए था। मुख्य तालिका में प्रत्येक रिकॉर्ड में एक सेट फ़ील्ड है। एक ही सेट के साथ रिकॉर्ड जुड़े हुए हैं। आप एक ही सेट के साथ कई रिकॉर्ड कैसे डालेंगे? 'INSERT INTO ने VALUES ()' सेट किया है और फिर रिकॉर्ड में संलग्न करने के लिए अपनी SET आईडी के रूप में अंतिम इंसर्ट आईडी का उपयोग करें। तो फिर, शायद मैं यूयूआईडी का उपयोग कर सकता था, लेकिन कुछ गलत लगता है।
विलियम एंट्रिएन

जवाबों:


87

हां, टेबल को इस तरह से डिजाइन करना निश्चित रूप से अच्छा है कि इसे सबसे कुशल बनाया जाए। "खराब आरडीबीएमएस डिजाइन" आमतौर पर अक्षमता के आसपास केंद्रित है।

हालाँकि, मैंने पाया है कि एकल कॉलम डिज़ाइन के अधिकांश मामले अतिरिक्त कॉलम से लाभान्वित हो सकते हैं। उदाहरण के लिए, राज्य कोड में आमतौर पर पूर्ण राज्य का नाम दूसरे कॉलम में लिखा जा सकता है। या एक ब्लैकलिस्ट में नोट जुड़े हो सकते हैं। लेकिन, यदि आपके डिज़ाइन को वास्तव में उस जानकारी की आवश्यकता नहीं है, तो एकल कॉलम होना पूरी तरह से ठीक है।


168

के संदर्भ में relational algebraयह एक एकल संबंध हो सकता है, जिसका अर्थ है ' इस बात से मौजूद है "

हां, इस तरह के संबंध को परिभाषित करने वाली एक तालिका होना ठीक है: उदाहरण के लिए, एक डोमेन को परिभाषित करने के लिए।

ऐसी तालिका के मूल्यों को निश्चित रूप से प्राकृतिक प्राथमिक कुंजी होना चाहिए।

एक खोज तालिका prime numbersहै जो पहले मेरे दिमाग में आती है।


3
+1: तालिका उन मूल्यों का एक समूह है जो आपके RDBMS के आदिम प्रकार के होते हैं।
एस.लॉट

4
संबंधपरक सिद्धांत के आधार पर उत्तर प्रदान करने के लिए +1।
लूबोस हैस्को

यहां एक स्कीमा का एक अच्छा उदाहरण है जिसमें 1 कॉलम तालिका है जो प्राकृतिक कुंजी नहीं है, एक संदेश प्रणाली में थ्रेड तालिका ... stackoverflow.com/a/6542556/45767
जेरेमी वीयर

29

मैंने उन्हें अतीत में इस्तेमाल किया है। मेरा एक ग्राहक किसी को भी इस बड़ी सूची में एक फोन नंबर के साथ साइन अप करने की कोशिश करना चाहता था, इसलिए उसके पास सिर्फ एक बड़ी ब्लैकलिस्ट थी।


19

अगर इसके लिए कोई वैध आवश्यकता है, तो मुझे कोई समस्या नहीं दिखती है। हो सकता है कि आप किसी कारण से प्रदर्शित होने वाली संभावनाओं की सूची चाहते हैं और आप इसे गतिशील रूप से बदलना चाहते हैं, लेकिन इसे किसी अन्य तालिका से लिंक करने की आवश्यकता नहीं है।


+1 - निचला रेखा, यह मेरी पुस्तक में सही उत्तर है
मार्क ब्रिटिंगम

संक्षिप्त, स्पष्ट उत्तर के लिए +1।
मैथ्यू जोन्स

3
एक स्तंभ तालिका को दूसरी तालिका से क्यों नहीं जोड़ा जा सकता है?
अन्हो

2
क्यों नहीं? एक उदाहरण के रूप में राज्य कोड तालिका लें। आप पता फ़ील्ड के साथ किसी अन्य तालिका के विरुद्ध एक प्रमुख कुंजी बाधा के रूप में इसका उपयोग क्यों नहीं करेंगे?
अन्हो

1
यह उस समय का एक महान उदाहरण है कि यह एक अच्छा विचार होगा।
केविन

11

एक मामला जो मुझे कभी-कभी मिला, वह कुछ इस तरह है:

टेबल देशों_द , प्रत्येक देश के लिए संख्यात्मक आईडी वाला केवल एक कॉलम होता है।

सारणी देशों_केद , देश आईडी के साथ, भाषा आईडी एक स्तंभ और स्थानीय देश के नाम के साथ एक स्तंभ के साथ कॉलम होता है।

तालिका company_factories , जिसमें विच में देश सहित कंपनी के प्रत्येक कारखाने की जानकारी शामिल है।

इसलिए तालिकाओं में डेटा सुसंगतता और भाषा स्वतंत्र डेटा बनाए रखने के लिए डेटाबेस केवल भाषा के निर्भरता के बिना विदेशी कुंजी की अनुमति देने के लिए केवल एक स्तंभ के साथ तालिकाओं के साथ इस स्कीमा का उपयोग करता है।

इस मामले में मुझे लगता है कि एक कॉलम टेबल का अस्तित्व उचित है।

द्वारा टिप्पणी के जवाब में संपादित: Quassnoi


(स्रोत: ggpht.com )

इस स्कीमा में मैं टेबल company_factories में एक विदेशी कुंजी को परिभाषित कर सकता हूं जिसके लिए मुझे टेबल पर भाषा कॉलम शामिल करने की आवश्यकता नहीं है, लेकिन अगर मेरे पास टेबल देशों_id नहीं है, तो मुझे विदेशी कुंजी को परिभाषित करने के लिए टेबल पर भाषा कॉलम शामिल करना होगा ।


2
क्यों देशों_पर? किसी देश को सम्मिलित करने के लिए, आपको कम से कम एक भाषा में उसका नाम जानना होगा, और इसके परिणामस्वरूप देश-विषय-वस्तु प्रदर्शित होगी। Country_description प्रविष्टि के बिना एक country_id अर्थहीन है। "मिस्टर बराक ओबामा, COALESCE के अध्यक्ष (14243, देश_नाम) आज पूरी तरह से रिटायर्ड हुए, दमित्री मेदवेदेव, Россия के अध्यक्ष से मिले"
क्वासोनि

4
@ डोलिवरस: ठीक है, मैं अब देखता हूं, +1। हालांकि मैं coutry_code के लिए ISO 3166-1 का उपयोग करूंगा। संख्यात्मक आईडी के विपरीत, 3-अक्षर वाला देश कोड इस बात का विचार देता है कि दुनिया में लगभग हर किसी को किस देश का उल्लेख है जो लैटिन वर्णमाला पढ़ सकता है।
क्वासोई

यहाँ एक ही तरीका है जो मैंने प्राकृतिक भाषा अनुवादों को एक ही तालिका में समायोजित करने के लिए लागू किया है। दी गई है, कई फ़ील्ड परिणाम के रूप में अशक्त हैं, लेकिन आप कस्टम ट्रिगर्स पर डेटा अखंडता को लोड कर सकते हैं। टेबल बनाएं "डीबीए" "myLocalisedTable" ( "entry_id" पूर्णांक नहीं NULL डिफ़ॉल्ट AutoIncrement, "master_entry_id" पूर्णांक शून्य, "master_entry_label" VARCHAR (200) शून्य, "language_id" पूर्णांक शून्य, "localised_entry_label" VARCHAR (300) शून्य,।
विंसेंट बक

7

ऐसे दुर्लभ मामले होंगे जहां एकल-स्तंभ तालिका समझ में आती है। मैंने एक डेटाबेस किया था जहाँ वैध भाषा कोड की सूची एक एकल-स्तंभ तालिका थी जिसका उपयोग विदेशी कुंजी के रूप में किया जाता था। एक अलग कुंजी होने का कोई मतलब नहीं था, क्योंकि कोड ही कुंजी था। और कोई निश्चित विवरण नहीं था क्योंकि भाषा कोड विवरण कुछ संदर्भों के लिए भाषा से भिन्न होगा।

सामान्य तौर पर, किसी भी मामले में जहां आपको उन मूल्यों की एक आधिकारिक सूची की आवश्यकता होती है जिनके पास कोई अतिरिक्त विशेषता नहीं है, एक-स्तंभ तालिका के लिए एक अच्छा उम्मीदवार है।


5

मैं हर समय सिंगल-कॉलम टेबल का उपयोग करता हूं - निर्भर करता है, निश्चित रूप से, क्या ऐप डिज़ाइन पहले से ही डेटाबेस का उपयोग करता है। एक बार जब मैंने डेटाबेस कनेक्शन स्थापित करने के लिए डिजाइन ओवरहेड को समाप्त कर लिया है, तो मैंने सभी उत्परिवर्तनीय डेटा को जहां संभव हो, तालिकाओं में डाल दिया है।

मैं सिंगल-कॉलम टेबल OTMH के दो उपयोगों के बारे में सोच सकता हूं:

1) डेटा आइटम मौजूद है। अक्सर ड्रॉपडाउन सूचियों में उपयोग किया जाता है। सरल वैधता परीक्षणों के लिए भी उपयोग किया जाता है।

उदाहरण के लिए। दो अक्षर का यूएस स्टेट संक्षिप्तिकरण; ज़िप कोड जिन्हें हम जहाज करते हैं; स्क्रैबल में कानूनी शब्द; आदि।

2) विरल द्विआधारी विशेषता, यानी, एक बड़ी तालिका में, एक द्विआधारी विशेषता जो केवल बहुत कम रिकॉर्ड के लिए सच होगी। एक नए बूलियन कॉलम को जोड़ने के बजाय, मैं एक अलग तालिका बना सकता हूं जिसमें रिकॉर्ड्स की कुंजी होगी, जिसके लिए विशेषता सत्य है।

उदाहरण के लिए। जिन कर्मचारियों को एक टर्मिनल बीमारी है; 360-दिन के वर्ष वाले बैंक (अधिकांश 365 का उपयोग करते हैं); आदि।

-Al।



4

अधिकतर मैंने इसे लुकअप प्रकार की तालिकाओं में देखा है जैसे कि आपके द्वारा वर्णित राज्य तालिका। हालाँकि, यदि आप ऐसा करते हैं तो स्तंभ को अद्वितीयता के लिए प्राथमिक कुंजी के रूप में सेट करना सुनिश्चित करें। यदि आप इस मान को विशिष्ट नहीं बना सकते हैं, तो आपको एक कॉलम का उपयोग नहीं करना चाहिए।


यहाँ एक एकल स्तंभ का उपयोग करना संभवत: ठीक है, ध्यान रखें कि आप अन्य स्तंभों पर भी विशिष्टता अवरोध स्थापित कर सकते हैं।
चुपके रब्बी

2

मैं सामान्य तौर पर कहूंगा, हां। निश्चित नहीं कि आपको केवल एक कॉलम की आवश्यकता क्यों है। इसके कुछ अपवाद हैं जो मैंने प्रभावी रूप से उपयोग किए हैं। यह इस बात पर निर्भर करता है कि आप क्या हासिल करना चाहते हैं।

वे वास्तव में अच्छे डिज़ाइन नहीं हैं जब आप डेटाबेस के स्कीमा के बारे में सोच रहे हैं, लेकिन वास्तव में केवल उपयोगिता तालिकाओं के रूप में उपयोग किया जाना चाहिए।

मैंने पूर्व में प्रभावी ढंग से उपयोग की गई संख्या तालिकाएं देखी हैं ।


1

एक डेटाबेस का उद्देश्य जानकारी के टुकड़ों को एक दूसरे से संबंधित करना है। आप कैसे कर सकते हैं जब कोई डेटा संबंधित नहीं है?

हो सकता है कि यह किसी प्रकार का संकलन सारणी हो (यानी फर्स्टनाम + लास्टनाम + जन्मतिथि), हालांकि मुझे अभी भी यकीन नहीं है कि आप ऐसा क्यों करना चाहेंगे।

संपादित करें: मैं किसी तरह की एक साधारण सूची के लिए इस तरह की तालिका का उपयोग कर देख सकता था। क्या आप इसके लिए इसका उपयोग कर रहे हैं?


9
नहीं, डेटाबेस का प्राथमिक उद्देश्य सूचनाओं को संग्रहीत करना है।
स्पेंसर रूपोर्ट

लेकिन एक स्प्रेडशीट जानकारी संग्रहीत कर सकती है। और यह जानकारी कैसे उपयोगी है अगर यह सिर्फ असंबद्ध संख्याओं और अक्षरों का एक गुच्छा है, जिनके बीच कोई संबंध नहीं है?
मैथ्यू जोन्स

जानकारी उपयोगी हो सकती है क्योंकि डेटाबेस का उपयोग करने वाले एप्लिकेशन को इसकी आवश्यकता है और यह एक निश्चित सेट नहीं है। यही है, डीबी एक डेटाबेस ऐप द्वारा उपयोग की जाने वाली जानकारी डालने के लिए बस सबसे सुविधाजनक जगह है - रिलेशनल या अन्यथा। मुझे पूरा यकीन है कि आप सहमत होंगे कि हम संबंधपरक आदर्श के संबंध में अपनी शुद्धता साबित करने के लिए ऐप्स का निर्माण नहीं कर रहे हैं। इसके बजाय, हम उपयोगी होने के लिए एप्लिकेशन बनाते हैं।
मार्क ब्रिटिंगम

@ मर्क - एक साधारण सूची से मेरा मतलब है। यकीन मानिए मैंने खुद को बहुत अच्छी तरह से नहीं समझाया।
मैथ्यू जोन्स

1
@ एसआर - नहीं, डेटाबेस का प्राथमिक उद्देश्य सूचना को पुनः प्राप्त करना है। ब्याज की पंक्तियों के रूप में अधिक बार डेटा के अन्य टुकड़ों पर निर्भर नहीं होता है मुझे लगता है कि एमजे की मूल टिप्पणी खड़ी है।
११

1

जब तक क्षेत्र प्राथमिक कुंजी है जैसा कि आपने कहा था कि यह होगा। कारण यह है कि यदि आप डुप्लिकेट डेटा सम्मिलित करते हैं तो उन पंक्तियों को आसानी से पढ़ा जाएगा। यदि आप डुप्लिकेट की गई पंक्तियों में से एक को हटाने का प्रयास करते हैं। यह काम नहीं करेगा क्योंकि सर्वर को नहीं पता होगा कि किस पंक्ति को हटाना है।


2
क्या बकवास है। प्राथमिक कुंजी या बाधा के बिना एक डिलीट ऑपरेशन सभी मिलान पंक्तियों को हटाने जा रहा है, उन्हें अनदेखा न करें।
एरिक फनकेनबस

1
'काम नहीं' करने से उनका मतलब "उम्मीद के मुताबिक काम नहीं करना" हो सकता है, जिसमें "अरे मैंने एक पंक्ति को हटा दिया है, लेकिन दोनों चले गए हैं" स्थिति।
GWLlosa

या, यदि आप "ओपन टेबल" दृश्य से SSMS में एक रिकॉर्ड को हटाने की कोशिश करते हैं, तो यह वास्तव में एक संवाद को फेंक देगा कि रिकॉर्ड विशिष्ट रूप से पहचाना नहीं जा सकता है और फिर कुछ भी नहीं ...
माइकल फ्रेडरिकसन

-1

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

अन्यथा, डेटा की विभिन्न विशेषताओं के बीच संबंधों का लाभ उठाने के लिए डेटाबेस में डेटा को आमतौर पर डेटाबेस में रखा जाता है। यदि आपके डेटा में इसके मूल्य से परे कोई विशेषता नहीं है तो ये संबंध कैसे विकसित होंगे?

इसलिए, गैरकानूनी नहीं है, जबकि सामान्य तौर पर आपको सिर्फ एक कॉलम के साथ एक टेबल नहीं होना चाहिए।


इसके समान संख्याओं की तालिका है जो लूपिंग को रोकने के लिए बहुत काम आती है।
u07ch 16

-1

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


1
ऐसा लगता है कि आप लेन-देन तालिका के साथ डेटा तालिका मिला रहे हैं। मेरी राय में, ये दो अलग-अलग चीजें होनी चाहिए।
जोश नं।

-2

हां जो पूरी तरह से ठीक है। लेकिन एक आईडी क्षेत्र इसे सही चोट नहीं पहुंचा सकता है?


7
वास्तव में, यह कर सकते हैं। जब आपके पास मान्य मानों की एक निश्चित सूची होती है, तो अंतिम चीज़ जो आप चाहते हैं, वह एक आईडी फ़ील्ड है क्योंकि इसका अर्थ है कि मान अद्वितीय नहीं हैं। यदि 'लाइटबेल्यू' एक कुंजी है, तो आप यह नहीं सोचना चाहते हैं कि आईडी 1 के साथ 'लाइटब्लू' आईडी 4 के साथ 'लाइटब्लू' से अलग हो सकता है
जेरेमी बॉर्क

कौन कहता है कि पहचान होना चाहिए? या कुंजी का हिस्सा?
एरिक

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