2010-01-07 7 views
5

मेरे पास निम्न तालिकाओं:उपयोग

Cateogories

  • CategoryID (int) प्राथमिक कुंजी
  • CategoryName (varchar)

आइटम

  • आईटी मध्य (int) प्राथमिक कुंजी
  • CategoryID (int)
  • ITEMNAME (varchar)

Items.CategoryID पर एक विदेशी कुंजी बाधा नहीं है। एक मौका है कि जब एक नई वस्तु बनाई जाती है तो कोई श्रेणी निर्दिष्ट नहीं की जाएगी।

क्या आइटम को सेट करना बेहतर है। श्रेणीकरण को नल की अनुमति देने और मेरे कोड में नल के साथ सौदा करने के लिए बेहतर है या नल की अनुमति न देने के लिए बेहतर है, डिफ़ॉल्ट श्रेणी आईडी को 1 पर सेट करें, और "Uncategorized" नामक श्रेणियों तालिका में एक डमी रिकॉर्ड बनाएं। और फिर मेरे कोड में उस डमी श्रेणी से निपटें?

+0

मुझे मूल रूप से पोस्ट करना चाहिए था कि एक आइटम केवल एक ही श्रेणी में हो सकता है। – jpshook

+0

संबंधित: http://stackoverflow.com/questions/2016730/column-nullability-optionality-null-vs-not-null –

उत्तर

6

जब आइटम के लिए कोई श्रेणी नहीं है तो श्रेणी आईडी कॉलम NULL के लिए तर्कसंगत सही तरीका होगा।

यदि आप नल के उपयोग से जुड़े किसी भी गॉथस से फंस गए हैं, तो यह संभवतः एक संकेत है कि डिजाइन ने इस तथ्य को नहीं लिया है कि वस्तुओं में कोई श्रेणी नहीं हो सकती है। डिजाइन को ठीक करें। एनयूएलएल सुनिश्चित करेगा कि आप सही समस्या को हल करने के लिए चिपके रहें।

+0

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

+1

पोस्टर का कहना है कि ऐसे समय होते हैं जब किसी आइटम में कोई श्रेणी नहीं होती है। यह एक विविध या अन्य डमी श्रेणी होने से अलग है। क्या आपके पास कुछ जानकारी है जो मैं नहीं करता? –

+1

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

0

SQL NULLs are tricky, इसलिए मुझे लगता है कि आप एक सेंटीनेल श्रेणी से बेहतर हैं।

+0

उस सूची में लगभग हर बुलेट बिंदु गणितीय रूप से व्याख्या करना आसान है और/या ** ** समझाया गया है एसक्यूएल स्पेक में। यह प्रश्नों के उत्तर देने के लिए एक साइट है, इस बात के बारे में पकड़ नहीं है कि मानकों के चश्मे ठीक तरह से काम नहीं करते हैं, जिस तरह से आपको लगता है कि उन्हें क्या करना चाहिए। – Aaronaught

+0

मुझे मानक के बारे में गड़बड़ करने की आवश्यकता नहीं है - कुल मिलाकर एक बहुत ही उपयोगी मानक - लेकिन यह कहना उचित है कि इसके कुछ हिस्सों से बचा जाना चाहिए। "गणितीय रूप से व्याख्या करने में आसान", यह हिस्सा नहीं है। – Tobu

+1

एनयूएलएलएस एएनएसआई स्पेक असंगत है और आमतौर पर टूटा माना जाता है। ज्यादातर डेवलपर्स जो सोचते हैं कि वे वास्तव में नहीं समझते हैं। – KenFar

0

इस मामले में मेरा मानना ​​है कि यह वास्तव में व्यक्तिगत वरीयता का मामला है। किसी भी तरह से आपको अपने कोड में अनुक्रमित वस्तुओं से निपटना होगा।

1

आदर्श रूप से आप किसी आइटम को बनाने की अनुमति देने से पहले एक श्रेणी विकल्प को मजबूर करना चाहते हैं। यदि किसी आइटम के पास भविष्य में किसी भी समय कोई श्रेणी नहीं होगी तो आपको उस श्रेणी से निपटने के लिए विशेष रूप से एक श्रेणी बनाना होगा। मैं व्यक्तिगत रूप से इसे "Uncategorized" नहीं कहूंगा, हालांकि इसका तात्पर्य है कि कोई उपयोगकर्ता इसे बाद में पीछा कर सकता है - जो वे खतरनाक नियमितता से करना भूल जाएंगे!

तार्किक स्थिरता के लिए जाएं या आप एक गड़बड़ी में खत्म हो जाएंगे। यदि इसका मतलब है कि "विविध" श्रेणी बनाना है तो यह करें और सुनिश्चित करें कि (ए) उपयोगकर्ता इसका उपयोग कब करते हैं और (बी) यह सुनिश्चित करने के लिए नियमित रूप से सूचित किया जाता है कि वस्तुओं को सही ढंग से वर्गीकृत किया गया है।

2

यह निर्भर करता है:

अपने आइटम वास्तव में कोई श्रेणी है, तो मैं NULL रों की अनुमति होगी, के रूप में है कि तुम क्या है: कोई CategoryID।

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

यदि आप सभी वस्तुओं को प्रदर्शित करना और श्रेणियां दिखाना चाहते हैं, तो आप बेहतर जानते होंगे कि श्रेणी के बिना आइटम हैं, इसलिए आप उस मामले में LEFT JOIN का उपयोग करेंगे।

यदि संभव हो, तो वास्तव में अपने आइटम को सहेजने से पहले एक श्रेणी का चयन करने के लिए अपना एप्लिकेशन बदलें।


आप (उन्हें अन्य श्रेणियों के साथ सूची, यह करने के लिए आवंटित आइटम गिनती सूचियों/ड्रॉपडाउन में उसका चयन करें) बस अन्य श्रेणियों जैसी कि Uncategorized श्रेणी के इलाज के लिए है, तो यह यह अपनी श्रेणी है मिलना चाहिए चाहते हैं, और आइटम। श्रेणी आईडी NOT NULL होना चाहिए।

0

मुझे विश्वास नहीं है कि विकल्पों में से कोई भी बहुत अच्छा है।

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

आईएमओ सबसे अच्छा डिजाइन तीन टेबल होना है।

Categories 
ID 
Name 

Items 
ID 
Name 

Categories2Items 
CategoryID 
ItemID 

यह शून्य के लिए की जरूरत है (और gotchas शामिल) के साथ ही आप अवर्गीकृत आइटम नहीं हैं के लिए अनुमति देता है, और आइटम जो कई श्रेणियों के हैं दूर करता है। इस डिजाइन जो हमेशा एक अच्छी बात है बोयस-कॉड सामान्य रूप में भी है .. en.wikipedia.org/wiki/BCNF

+1

फिर आपको प्रति आइटम एकाधिक श्रेणियां मिलती हैं, उन्हें टैग करें। यह एक अच्छा डिजाइन है, लेकिन क्या ओपी चाहता है? – Tobu

+0

मुझे यह उल्लेख करना चाहिए था कि इस मामले में श्रेणियों के लिए आइटम एक के लिए एक था। आपका उत्तर कई स्थितियों के लिए उपयुक्त है। एक से एक के लिए, यह एसक्यूएल को जटिल बनाता है और आपको एप्लिकेशन (गन्दा) में एक को लागू करने की आवश्यकता होती है। मेरा मूल डिजाइन कम से कम 3 एनएफ के लिए मान्य है। – jpshook

+0

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

1

इस प्रकार यह लगभग हमेशा बेहतर है NULLs नामंज़ूर करने और अपने लुकअप तालिका में अज्ञात मूल्य के सरल देखने तालिकाओं के लिए।

क्यों?

  • क्योंकि एएनएसआई नल विनिर्देश असंगत और बहुत जटिल हैं। nulls के साथ काम बहुत कोडिंग दोष की संभावना बढ़ जाती है, और एक बहुत अधिक कोड
  • लिखने के लिए कुछ डेवलपर्स वास्तव में समझ कैसे NULLs सभी स्थितियों
  • में काम करते हैं क्योंकि यह अच्छी तरह से अपने मॉडल और प्रश्नों को सरल क्योंकि लेता है। आप बहुत सरल एसक्यूएल के साथ किसी भी दिशा से आंतरिक जुड़ने के साथ अच्छी तरह से चीजों में शामिल हो सकते हैं।

हालांकि, कुछ सावधानियों:

  • आप एक "डमी" मूल्य से अधिक कर सकते हैं: के लिए "नहीं सौंपा" "अज्ञात" के लिए और दूसरा। बेशक, न्यूल दोनों एक ही मूल्य में बंडल करते हैं, इसलिए यदि आप ऐसा करते हैं तो आप कम से कम & से ऊपर जा रहे हैं।
  • आप कभी-कभी अतिरिक्त गैर-कुंजी विशेषताओं को समाप्त कर देंगे जो या तो डमी पंक्तियों के लिए शून्य या 'n/a' प्रकार मान लेना चाहिए। भारी रूप से denormalized लुकअप टेबल (गोदाम आयामों की तरह) के लिए आप शायद इन कॉलम के लिए nulls अनुमति देता है क्योंकि 'n/a' टाइमस्टैम्प, रकम आदि के लिए अच्छी तरह से काम नहीं करता है
  • यदि आप इस तकनीक को बस से अधिक के लिए लागू करते हैं सरल लुकअप टेबल यह नाटकीय रूप से आपके डिजाइन को जटिल करेगा। ऐसा मत करो।