डिफ़ॉल्ट रूप से NULL या NOT NULL?


41

MySQL में, यह हमेशा बेहतर है कि जब तक आपको पता न हो कि किसी क्षेत्र की आवश्यकता है, या हमेशा उपयोग करें, Not Nullजब तक कि आपको पता न हो कि किसी क्षेत्र में नल मौजूद हैं, तो nulls को अनुमति देना बेहतर है। या इससे कोई फर्क नहीं पड़ता?

मुझे पता है कि कुछ DBMS में वे Not Nullजितना संभव हो उतना उपयोग करने के लिए कहते हैं क्योंकि नल को अनुमति देने के लिए अशक्त स्थिति को संग्रहीत करने के लिए प्रति रिकॉर्ड एक अतिरिक्त बिट (या बाइट?) की आवश्यकता होती है।


1
NULLयदि NULLआप मॉडलिंग कर रहे हैं, तो आपके लिए केवल और अगर मूल्य की व्याख्या है, तो आपको अनुमति देनी चाहिए ।
jameshfisher

जवाबों:


25

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

एक मामूली प्रदर्शन निहितार्थ होगा, क्योंकि अतिरिक्त NOT NULLबाधाओं को संभावित रूप से प्रत्येक पंक्ति के लिए जांचना होगा जिसे आप किसी भी INSERT या UPDATE से प्रभावित करते हैं, लेकिन जैसा कि अधिकांश डेटाबेस सापेक्ष लेखन-प्रकाश और पढ़ने में भारी हैं, यह संभवतः एक चिंता का विषय नहीं है (थोड़ा) अतिरिक्त समय किसी भी तरह से ध्यान देने योग्य होने की संभावना नहीं है क्योंकि यह एक सीपीयू-बाउंड ऑपरेशन है जहां बाकी सम्मिलित / अपडेट ऑपरेशन आईओ-बाउंड और बहुत अधिक महत्वपूर्ण बोतल-गर्दन होगा) और यह आपको कुछ "मुफ्त" देता है "डेटा की जाँच इसलिए आपका कोड (या अन्य लोगों का कोड) गलती से NULLs नहीं डाल सकता है जहाँ अन्य कोड उनसे अपेक्षा नहीं कर रहा है और इसलिए उनकी उपस्थिति में गलत परिणाम दे सकता है।

संपादित करें: जैसा कि पीटर अपनी टिप्पणी में बताते हैं कि उपरोक्त एक सामान्यता है और सभी DMBS के लिए सही नहीं हो सकता है , हालांकि मुझे पूरा यकीन है कि यह mysql और mssql के लिए है। क्षेत्र की अन्य जटिलताओं में विरल तालिकाओं (उदाहरण के लिए MSSQL 2008 के रूप में कार्यान्वित) जैसी विशेषताएं शामिल हो सकती हैं, जो अशक्त स्तंभों (नहीं) के प्रदर्शन की गतिशीलता को बदल देगी।


8
जरूरी नहीं कि यह PostgreSQL में सही हो। अशक्त स्तंभ अंतरिक्ष को बचाते हैं, जिससे गति में सुधार हो सकता है, और प्रसंस्करण समय उसी के बारे में होना चाहिए।
पीटर आइजेंट्राट

4
यह ओरेकल के लिए भी सही नहीं है। इसके अलावा, MySql के विपरीत, Oracle nulls को इंडेक्स नहीं करता है ताकि आप उनका उपयोग करके अपने इंडेक्स के आकार को कम कर सकें। देखें stackoverflow.com/questions/289001/does-mysql-index-null-values
Leigh Riffel

8

आपको अपने स्कीमा डिज़ाइन और एप्लिकेशन आवश्यकताओं को इस निर्णय का मार्गदर्शन करने देना चाहिए। प्रदर्शन अंतर शायद ज्यादातर मामलों में या तो ध्यान देने योग्य नहीं है।


3
एक बार फिर, सुनिश्चित करने के लिए सबसे अच्छा तरीका प्रोफाइलिंग और परीक्षण है।
jcolebrand

मैं इस तरह के व्यापक बयानों से सावधान रहूंगा - यदि आप किसी ईटीएल प्रक्रिया के माध्यम से एक रात में 10 मिलियन पंक्तियों को एक तालिका में लिख रहे हैं और उस तालिका में Not Null विवश क्षेत्रों का एक समूह है, तो आप प्रदर्शन प्रभाव देखेंगे।
स्कॉटकर

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