2008-10-21 9 views
18

मेरे पास एक सहकर्मी है जो एक नए ऐप के लिए डेटाबेस की योजना बना रहा है जिसमें 30 से अधिक फ़ील्ड वाले कई टेबल होंगे। क्या यह अत्यधिक है? शायद मैं समझने के लिए पर्याप्त उद्यम नहीं हूँ।किसी तालिका में कितने फ़ील्ड 'बहुत अधिक' हैं?

संपादित करें: इसके अलावा, बहुत से फ़ील्ड विकल्प-प्रकार की चीजें हैं (जैसे अनुरोध फ़ॉर्म पर, क्या आप अपने विजेट को पीले या हरे रंग के होने के लिए पसंद करेंगे, उसके पास 'रंग' के लिए एक रंग है) । यह काफी संभावना है कि इन्हें समय के साथ जोड़ा या हटा दिया जाएगा। मैंने वास्तव में डेटाबेस डिज़ाइन नहीं किया है और इसे स्वयं से दूर रहने का प्रयास किया है, इसलिए शायद मैं पूरी तरह से बेवकूफ हूं, लेकिन निश्चित रूप से ऐसा करने का एक बेहतर तरीका है ??

उत्तर

4

कोई मनमानी सीमा नहीं है; काफी काम किया अंगूठे का एक अच्छा नियम है पाने के लिए

यदि आप एक बेहतर डाटाबेस डिजाइन है, यह सुझाव है

यदि आप अधिक विस्तृत प्रतिक्रिया चाहते हैं, स्कीमा

6
बेशक

, मानक उत्तर पोस्ट है यह पर निर्भर करता है। कई क्षेत्रों में एक टेबल वास्तव में कुछ परिस्थितियों में काफी समझ में आ सकता है।

उस डेटा के बारे में सोचें जो आप वहां संग्रहित करेंगे। क्या यह संभावना है कि इनमें से कई फ़ील्ड न्यूल होंगे? इन क्षेत्रों में परिवर्तन की संभावना क्या है (उदाहरण: अधिक जोड़े गए हैं)?

यदि कुछ निश्चित फ़ील्ड केवल कुछ वस्तुओं पर लागू होते हैं, तो शायद उन फ़ील्ड को किसी अन्य तालिका में डालने के बारे में सोचें। वैकल्पिक रूप से, केवल एक तालिका में बुनियादी, सामान्य फ़ील्ड स्टोर करें, और दूसरी तालिका में अतिरिक्त जानकारी, प्रति पंक्ति एक पंक्ति। a different question (which might be helpful to you) के लिए I suggested के रूप में:

 
refs (id, title, refType) 
-- title of the reference, and what type of reference it is 

fieldDef (id, fieldName, refType, dataType) 
-- name of the field, which reference types it applies to, and 
-- what type of data is stored in these fields (ISDN number, date, etc) 

fields (refId, fieldId, value) 
-- where you actually add data to the references. 

ध्यान दें कि यह था अच्छे कारण के साथ downvoted, और शायद। यह एक विकल्प है, जरूरी नहीं कि सबसे अच्छा विकल्प है, लेकिन यह अभी भी एक व्यावहारिक विधि है। प्रश्न से जुड़े प्रश्न में सबसे ज्यादा वोट दिया गया जवाब हालांकि सबसे अच्छा समाधान हो सकता है।


संपादित करें: जब से तुम कहना है कि यह प्रति-उपयोगकर्ता सेटिंग जैसी चीज़ें लेंगे (जैसे: विजेट रंग), मैं वास्तव में विधि (तीन तालिकाओं के साथ) ऊपर उल्लिखित सलाह देते हैं। संभावना है कि ज्यादातर लोग डिफ़ॉल्ट रूप से चीजें छोड़ देंगे, इसलिए आपके पास बेकार जानकारी का ढेर होगा। कृपया मेरे उत्तर को दूसरे प्रश्न में पढ़ें क्योंकि अन्य पाठकों ने इस विधि की कमियों को इंगित किया है।

3

फ़ील्ड की संख्या आमतौर पर एक समस्या नहीं है, लेकिन आप यह सुनिश्चित करना चाहते हैं कि आपका डेटाबेस सही ढंग से न ही व्यवस्थित है। Third normal form एक अच्छी शुरुआत है।

+0

बीसीएनएफ बेहतर है - और आम तौर पर जो 3 एनएफ में है वह भी बीसीएनएफ में है। –

2

यदि आपको यह पूछना है, "क्या इस तालिका में बहुत सारे क्षेत्र हैं?" तो शायद वहाँ हैं।

+0

हाहा, मैं एक ही टिप्पणी करने जा रहा था :-P –

0

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

मैं कहूंगा कि डेटाबेस डिज़ाइन में एक कोर्स आपके डीबी "विशेषज्ञ" के लिए है। और मैं सुझाव दूंगा कि आप इसे भी ब्रश करें ... यह केवल आपके करियर में बढ़ने में आपकी मदद कर सकता है :)

12

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

उदाहरण के लिए, यदि आपके पास एक सारणी है जिसमें इसमें पते हैं, तो क्या आप उस तालिका में शहर, राज्य और ज़िप कोड फ़ील्ड शामिल करते हैं? या, क्या आप केवल एक फ़ील्ड को शामिल करते हैं जो उन मानों के लिए एक अलग तालिका में रिकॉर्ड के लिए "अंक" देता है? अलग तालिका में अद्वितीय शहर, राज्य, ज़िप कोड संयोजन होंगे। डेटा को दो तालिकाओं में विभाजित करने का प्रभाव संग्रहीत डेटा की मात्रा में कमी (सबसे अधिक संभावना है लेकिन पूर्ण नहीं है) लेकिन जब आप डेटाबेस के विरुद्ध क्वेरी चलाने के लिए जाते हैं तो कुछ जटिल जटिलता होती है। अब, आपको केवल एक के बजाय 2 टेबल से निपटना होगा। लेकिन, चमकदार तरफ, यह बहुत साफ है, और बहुत छोटा (संभवतः)।

वास्तविक उत्तर यह है कि सही परिस्थितियों में पता तालिका में शहर-राज्य-ज़िप डेटा छोड़ना ठीक है। या, आप इसे "सामान्य" करना चाहते हैं। दोनों ठीक हैं।

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

+5

पते को एक अलग तालिका में विभाजित करना केवल तभी समझ में आता है जब प्रत्येक पते को एक से अधिक बार उपयोग किया जा सकता है, लेकिन जब तक आप अपने इंटरफ़ेस को जटिल नहीं करते हैं तब तक यह बहुत ही असंभव है। यदि प्रत्येक पता केवल एक व्यक्ति द्वारा उपयोग किया जाता है, तो आपने जो किया है वह ऊर्ध्वाधर विभाजन है, सामान्यीकरण नहीं। –

+0

मैं ज़िप, शहर, राज्य को पता तालिका में एक विदेशी कुंजी के साथ एक अलग तालिका में विभाजित करने का जिक्र कर रहा था। आमतौर पर यह संभावना है कि कई पतों में उनके साथ जुड़े एक ज़िप कोड और इसलिए शहर और राज्य होगा। (प्रत्येक ज़िप कोड afaik केवल एक शहर और राज्य से जुड़ा हुआ है।) इसलिए, यदि आपकी पता तालिका बहुत बड़ी है, तो यह डुप्लीकेट ज़िप, शहर और राज्य डेटा को एक अलग तालिका में सामान्य करने के लिए भुगतान कर सकती है। –

+0

ज़िप्स को कई शहर/राज्यों से जोड़ा जा सकता है ... उदाहरण के लिए मेरा ज़िप कोड (17402) "यॉर्क, पीए" और "स्प्री, पीए" दोनों –

9

तीस फ़ील्ड बहुत अधिक नहीं हैं - आपको बस यह सुनिश्चित करना होगा कि आपका डेटा ठीक से सामान्यीकृत हो (जिसके लिए वेब पर बहुत सारे गाइड हैं)।

आपके संपादन के आधार पर जहां आप निर्दिष्ट करते हैं कि कई कॉलम विकल्प-प्रकार फ़ील्ड होंगे जिन्हें समय के साथ जोड़ा या हटाया जा सकता है, मैं सुझाव दूंगा कि निम्नलिखित एक बेहतर विचार है।

BaseTable: 
    Id 
    NonOptionFields 
OptionTable: 
    Id 
    OptionName 
    OptionValue 

फिर आप अपने सभी विकल्पों को बेस रिकॉर्ड में जोड़ सकते हैं। इसका मतलब यह होगा कि आपको जो भी चाहिए वो प्राप्त करने के लिए आपको सामान्य रूप से सामान्यीकृत तरीके से कॉलम में कॉलम जोड़ने और हटाने की आवश्यकता नहीं होगी।

11

सबसे स्पष्ट संकेत तालिका को सामान्यीकरण की आवश्यकता होती है जिसे मैंने देखा है फ़ील्ड पूर्णांक के साथ समाप्त होता है: कूपनकोड 1, कूपनकोड 2, कूपनकोड 3 .. आपको बिंदु मिलता है। नियम के अपवाद हमेशा के रूप में होगा।

+0

यदि आप इस नियम के लिए कोई अपवाद जानते हैं, तो कृपया developp में संकोच न करें। मैंने कभी ऐसा अपवाद नहीं मिला –

+1

दिमाग में आने वाला पहला पता एड्रेसलाइन कॉलम जैसा होगा। मुझे पता कॉल 2 के साथ कॉलम नाम के रूप में कोई समस्या नहीं है। वैकल्पिक रूप से, आप अतिरिक्त एड्रेसलाइन या कुछ समान के साथ जा सकते हैं, लेकिन जैसा कि मैंने कहा, इस अपवाद में, मैं इसके साथ ठीक हूं। –

+2

मेरे सहयोगियों में से एक ने हमेशा कहा "डेटाबेस के अंगूठे नियम - नीचे हमेशा मारता है!" –

1

सामान्य-दर-डिफ़ॉल्ट करने के लिए छापामार गाइड:

  1. एक तालिका प्राथमिक कुंजी और अधिकतम एक अन्य स्तंभ होना चाहिए।
  2. जितनी बार आवश्यक हो उतनी बार नियम संख्या 1 तोड़ें।
+0

नियम संख्या 1 Darwen et al's 6NF है, है ना? मैंने Darwen इसे तोड़ दिया है (http://www.dbdebunk.com/page/page/3010532.htm)। – onedaywhen

1

डेटाबेस सिद्धांत में फ़ील्ड की संख्या पर कोई बाधा नहीं है। एक तालिका प्राथमिक कुंजी तक सीमित हो सकती है (भले ही यह प्राथमिक कुंजी 2 फ़ील्ड से बना हो), जिसका अर्थ है कि Apocalisp's answer बहुत स्पष्ट नहीं है। विरोध में, जब तक normal form rules सम्मानित होते हैं, तब तक खेतों के हजारों में से एक तालिका बनाई जा सकती है।

जब फ़ील्ड के समूहों को तालिका में स्पष्ट रूप से उपयोग किया जाता है, तो यह मुख्य तालिका और "उप" तालिका के बीच 0-1 संबंध के साथ फ़ील्ड के इस समूह को किसी अन्य तालिका में विभाजित करने के लिए स्मार्ट हो सकता है।

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

4

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

2

OLTP

डिजाइनिंग डेटाबेस के मेरे अनुभव से, वहाँ एक सामान्यीकृत OLTP डेटाबेस में बहुत कुछ तालिकाओं कि स्तंभों की पागलपन की हद तक बड़ी संख्या में शामिल हैं।

आईएमओ 30 कॉलम बहुत अधिक हैं।

मेरे लिए, मेरे OLTP तालिकाओं में से 10% से अधिक कॉलम की एक बड़ी संख्या (> 10) नहीं है।

OLAP

अब आप एक आयामी/रिपोर्टिंग संरचना करने के लिए जा रहे हैं, कुछ लोगों को एक 30 कॉलम तालिका पर विचार संकीर्ण हो सकता है।

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