2009-04-24 12 views
16

अद्यतन 2009.04.24कई से अधिक रिश्तों: कॉलम में सहयोगी तालिका या सीमांकित मान का उपयोग करें?

मेरे सवाल का मुख्य बिंदु डेवलपर भ्रम और इसके बारे में क्या करने के लिए नहीं है।

बिंदु यह समझना है कि सीमित मूल्य सही समाधान कब हैं।

मैंने वाणिज्यिक उत्पाद डेटाबेस (Ektron lol) में उपयोग किए गए सीमित डेटा को देखा है।

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

/अंत अद्यतन

आवेदन मैं डिजाइनिंग कुछ कई-से-अनेक संबंध हैं। अतीत में, मैंने अक्सर डेटाबेस में इन्हें प्रस्तुत करने के लिए सहयोगी तालिकाओं का उपयोग किया है। इससे डेवलपर्स को कुछ भ्रम पैदा हुआ है।

यहाँ एक उदाहरण डीबी संरचना है:

Document 
--------------- 
ID (PK) 
Title 
CategoryIDs (varchar(4000)) 


Category 
------------ 
ID (PK) 
Title 

दस्तावेज़ और श्रेणी के बीच अनेक-से-अनेक संबंध नहीं है।

इस कार्यान्वयन में, Document.CategoryIDs श्रेणी आईडी की एक बड़ी पाइप-सीमित सूची है।

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

कि मॉडल के साथ

, एक श्रेणी के लिए सभी दस्तावेज प्राप्त करने के लिए, आप की तरह कुछ की आवश्यकता होगी निम्नलिखित:

Document_Category 
------------------------------- 
DocumentID (PK) 
CategoryID (PK) 

यह:

select * from documents where categoryids like '%|' + @targetCategoryId + '|%' 

मेरे समाधान के रूप में निम्नानुसार एक साहचर्य तालिका बनाने के लिए है डेवलपर्स को भ्रमित कर रहा है। क्या कोई सुरुचिपूर्ण वैकल्पिक समाधान है जो मुझे याद आ रहा है?

मुझे लगता है कि दस्तावेज में हजारों पंक्तियां होंगी। श्रेणी 40 पंक्तियों या उससे भी हो सकती है। प्राथमिक चिंता क्वेरी प्रदर्शन है। क्या मैं इसे अधिक इंजीनियरिंग कर रहा हूं?

क्या कोई ऐसा मामला है जहां डेटा को किसी सहयोगी तालिका में डेटा को धक्का देने के बजाय डेटाबेस कॉलम में आईडी की सूचियां संग्रहीत करना पसंद है?

यह भी विचार करें कि हमें दस्तावेज़ों के बीच कई से अधिक संबंध बनाने की आवश्यकता हो सकती है। यह एक सहयोगी तालिका Document_Document का सुझाव देगा। क्या यह पसंदीदा डिज़ाइन है या संबंधित कॉलम आईडी को एक कॉलम में स्टोर करना बेहतर है?

धन्यवाद।

+1

मेरी कंपनी बड़े पैमाने पर सीएसवी कॉलम का उपयोग करती है। यह एक पूर्ण दुःस्वप्न है। यह बहुत बुरा है, उन्होंने इसे भी महसूस किया है और इसे रोकना बंद कर दिया है, लेकिन हमें अभी भी विरासत का समर्थन करना है :( – rmeador

+0

मैं आपकी विधि से सहमत हूं, लेकिन यदि आप कॉलम नाम के रूप में "आईडी" का उपयोग नहीं करते हैं तो यह मदद कर सकता है। " दस्तावेज़ आईडी "और" श्रेणी आईडी "बेहतर हैं और फिर एफके के पास समान कॉलम नाम हो सकते हैं। –

+2

सीमित मानों को स्वीकार्य माना जा सकता है यदि आपको किसी भी SQL कथन में सूची को विच्छेदन करने की आवश्यकता नहीं होती है, और कभी भी उन पर पूछताछ करने की आवश्यकता नहीं होती है। फिर भी, आमतौर पर आपके सहयोगी टेबल डिज़ाइन के साथ जाना बेहतर होगा। वैकल्पिक रूप से, मेरे उत्तर में, एक डीबीएमएस का उपयोग करें जो सूचियों को मूल रूप से संभालता है। –

उत्तर

11

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

आपके अन्य विकल्प आपके द्वारा उपयोग किए जा रहे डेटाबेस पर निर्भर हो सकते हैं। उदाहरण के लिए, SQL सर्वर में आपके पास एक एक्सएमएल कॉलम हो सकता है जो आपको अपनी सरणी को पूर्व परिभाषित स्कीमा में स्टोर करने की अनुमति देगा और फिर उस फ़ील्ड की सामग्री के आधार पर जुड़ें। अन्य डेटाबेस सिस्टम में कुछ समान हो सकता है।

+2

-1 नहीं है। –

+4

+1 एक विकल्प प्रदान करते हुए सामान्यीकरण को दृढ़ता से सुझाव देने के लिए जो ओपी के डेवलपर्स सुझाव दे रहे थे उससे बेहतर है। – Kevin

+0

जबकि सामान्यीकरण मेरी प्राथमिकता है, मैं निश्चित रूप से इस एक्सएमएल कॉलम के उपयोग की जांच करूँगा। इस कॉलम के खिलाफ एक प्रश्न कैसे दिखता है? – frankadelic

34

यह डेवलपर्स को भ्रमित कर रहा है।

बेहतर डेवलपर प्राप्त करें। यह सही दृष्टिकोण है।

+3

100% से सहमत है। एक योजक तालिका जाने का तरीका है। –

+1

सच है, उनसे छुटकारा पाएं और उनके सीएसवी डेटा डूबना – SQLMenace

+4

यदि आपके डेवलपर डेटाबेस सिस्टम से निपट रहे हैं और आपको पहले (सामान्य या परोक्ष रूप से) को प्राथमिक बनाने के लिए प्रोत्साहित करने के लिए प्रोत्साहित करते हैं, तो हाँ, वे curb पर होना चाहिए। –

17

कॉमा से अलग आईडी का उपयोग करने के लिए लगभग हमेशा एक बड़ी गलती होती है।
आरडीबीएमएस संबंधों को स्टोर करने के लिए डिज़ाइन किए गए हैं।

+0

। मूल्यों के एकाधिक, छोटे सेट के लिए एसईटी प्रकार का उपयोग करें। – DanMan

+0

@DanMan एसईटी प्रकार की तरह दिखता है 1NF का उल्लंघन करने का प्रस्ताव देने के लिए व्यापक रूप से समर्थित सम्मेलन –

6

आप जो कई मैपिंग कर रहे हैं वह ठीक और सामान्यीकृत है। यदि आवश्यक हो तो यह बाद में अन्य डेटा को जोड़ने की अनुमति देता है। उदाहरण के लिए, कहें कि आप उस समय को जोड़ना चाहते थे जब श्रेणी दस्तावेज़ में जोड़ा गया था।

मैं दस्तावेज़_category तालिका पर सरोगेट प्राथमिक कुंजी होने का भी सुझाव दूंगा। और एक अनोखा (दस्तावेज, श्रेणीबद्ध) बाधा अगर ऐसा करने के लिए समझ में आता है।

डेवलपर्स भ्रमित क्यों हैं?

16

मेरे समाधान एक साहचर्य तालिका बनाने के लिए इस प्रकार है: यह डेवलपर्स

सच करने के लिए भ्रामक है? यह डेटाबेस 101 है, यदि यह उनको भ्रमित कर रहा है तो शायद उन्हें अपने विज़ार्ड जेनरेट कोड से दूर कदम उठाने और कुछ बुनियादी डीबी सामान्यीकरण सीखने की आवश्यकता है।

जो आप प्रस्तावित करते हैं वह सही समाधान है !!

25

आपका सुझाव सुरुचिपूर्ण, शक्तिशाली, सर्वोत्तम अभ्यास समाधान है।

चूंकि मुझे नहीं लगता कि अन्य उत्तरों ने निम्नलिखित दृढ़ता से पर्याप्त कहा है, मैं इसे करने जा रहा हूं।

अपने डेवलपर्स 1) समझ में नहीं कर सकते एक संबंधपरक डेटाबेस में अनेक-से-अनेक संबंध मॉडल कैसे, और 2) दृढ़ता से सीमांकित चरित्र डेटा के रूप में अपने CategoryIDs भंडारण पर जोर देते हैं,

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

आखिरकार, उन्हें तब तक "डेटाबेस डेवलपर्स" के रूप में संदर्भित नहीं करना चाहिए जब तक वे गति से ठीक न हों, क्योंकि यह उन लोगों के लिए थोड़ा सा है जो वास्तव में सक्षम डेवलपर्स & डिज़ाइनर हैं।

मुझे आशा है कि यह उत्तर आपके लिए बहुत उपयोगी होगा।

अद्यतन

मेरे सवाल का मुख्य बिंदु डेवलपर भ्रम और इसके बारे में क्या करने के लिए नहीं है।

बिंदु यह समझना है कि सीमित मूल्य सही समाधान कब हैं।

सीमित दुर्लभ मामलों को छोड़कर सीमित मूल्य गलत समाधान हैं। जब व्यक्तिगत मूल्यों को कभी भी पूछताछ/डाला/हटाया/अपडेट किया जाएगा, यह साबित करता है कि यह गलत निर्णय था, क्योंकि आपको वांछित व्यक्ति के साथ काम करने के लिए अन्य सभी मूल्यों को पार्स और स्पर्श करना होगा। ऐसा करके आप पहले (!!!) सामान्य रूप का उल्लंघन कर रहे हैं (यह वाक्यांश आपको अविश्वसनीय रूप से अपमानजनक पसंद की तरह लग रहा है)। एक ही काम करने के लिए एक्सएमएल का प्रयोग करना भी गलत है। कॉलम में सीमित मान या बहु-मूल्य एक्सएमएल संग्रहीत करना समझ सकता है जब इसे एक अविभाज्य और अपारदर्शी "संपत्ति बैग" के रूप में माना जाता है जिसे डेटाबेस द्वारा पूछताछ नहीं किया जाता है लेकिन हमेशा पूरे उपभोक्ता को भेजा जाता है (शायद एक वेब सर्वर या एक ईडीआई प्राप्तकर्ता)।

यह मुझे मेरी प्रारंभिक टिप्पणी पर वापस ले जाता है। डेवलपर्स जो पहले सामान्य रूप का उल्लंघन करते हैं, एक अच्छा विचार है मेरी पुस्तक में बहुत ही अनुभवहीन डेवलपर्स हैं।

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

+0

-1 आपके "1.)" के कारण होता है और फिर यह कहने के लिए आगे बढ़ता है कि उन्हें डेटाबेस डिज़ाइन विशेषाधिकार खोना चाहिए। –

+0

@ChrisMarisic यह विचित्र है। 2 कैसे 1 के कारण नहीं है? किसी भी मामले में निहितार्थ यह था कि डीबी डिज़ाइन विशेषाधिकार खोना तब तक अस्थायी था जब तक कि उनके पास ऐसी बेवकूफ चीजें न करने के लिए पर्याप्त प्रशिक्षण था। क्या आप बनाए रखते हैं कि पहले सामान्य रूप का उल्लंघन करना बेवकूफ नहीं है? – ErikE

+0

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

6

'यह डेवलपर्स के डिजाइन में भ्रमित है इसका मतलब है कि आपके पास शिक्षित डेवलपर्स हैं। यह बेहतर संबंधपरक डेटाबेस डिज़ाइन है - यदि संभव हो तो आपको इसका उपयोग करना चाहिए।

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

+1

चूंकि मैंने यह उत्तर लिखा है, यू 2 डीबीएमएस को आईबीएम द्वारा रॉकेट सॉफ्टवेयर (http://rocketsoftware.com/) में बेचा गया है। –

5

यह क्लासिक ऑब्जेक्ट-रिलेशनल मैपिंग समस्या है। डेवलपर्स शायद बेवकूफ नहीं हैं, सही तरीके से काम करने के लिए सिर्फ अनुभवहीन या अपरिवर्तित हैं। चिल्लाओ "3 एनएफ!" बार-बार उन्हें सही तरीके से मनाने नहीं देंगे।

मेरा सुझाव है कि आप अपने डेवलपर्स से आपको यह बताने के लिए कहें कि वे पाइप-सीमित दृष्टिकोण का उपयोग करके श्रेणी के अनुसार दस्तावेजों की गिनती कैसे प्राप्त करेंगे। यह एक दुःस्वप्न होगा, जबकि लिंक टेबल इसे काफी सरल बनाता है।

+0

हां - दस्तावेजों का उपयोग केस की गिनती पाइप-सीमित दृष्टिकोण की सीमाओं को प्रदर्शित करने के लिए एक महान उदाहरण है। – frankadelic

+0

यह देखने में खुशी है कि कोई चिल्लाकर समस्या को हल नहीं कर रहा है। –

5

मेरे डेवलपर्स ने "डेटाबेस कॉलम में अल्पविराम-सीमित मान" दृष्टिकोण का प्रयास करने का एक कारण यह है कि उनके पास एक धारणा है कि एकाधिक मानों की आवश्यकता को हल करने के लिए एक नई तालिका जोड़ना बहुत लंबा लगेगा डेटा मॉडल और डेटाबेस।

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

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

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

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

हमें यह भी देखना चाहिए कि डेटा डेटा को लगातार हमारे डेटा आर्किटेक्चर के "निर्मित" हिस्से की निगरानी करने की आवश्यकता है।

व्यक्तिगत रूप से, मैं कभी भी एक रिलेशनल डेटाबेस में अल्पविराम सीमित मूल्यों के उपयोग को अधिकृत नहीं करता क्योंकि यह एक नई तालिका बनाने के लिए वास्तव में तेज़ है, यह कॉलम में एकाधिक मान बनाने, अपडेट करने और प्रबंधित करने के लिए एक पार्सिंग रूटीन बनाने के लिए है। और सभी विसंगतियों के साथ सौदा किया गया क्योंकि कभी-कभी उस डेटा ने अल्पविराम को भी एम्बेड किया है।

नीचे की रेखा, अल्पविराम सीमित मूल्यों को न करें, लेकिन पता लगाएं कि डेवलपर इसे क्यों करना चाहते हैं और उस समस्या को ठीक करना चाहते हैं।

+0

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

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