क्या मुझे बूलियन डेटाबेस क्षेत्र में फाल्स को नल के रूप में संग्रहीत करना चाहिए?


20

मान लीजिए कि आप अपने में एक बूलियन क्षेत्र है कि एक आवेदन करते Userनामक तालिका Inactive

वहाँ केवल शून्य के रूप में झूठी भंडारण के साथ कुछ गलत है? यदि ऐसा है तो आप कृपया बता सकते हैं कि नीचे की तरफ क्या होना चाहिए? मैंने कुछ महीने पहले किसी के साथ इस पर चर्चा की है और हम दोनों सहमत थे कि जब तक आप इसे ऐप / डेटाबेस में लगातार नहीं करते तब तक कोई फर्क नहीं पड़ता। हाल ही में, मुझे पता है कि कोई भी व्यक्ति "सच्चा" है trueया falseइसका इस्तेमाल किया जाना चाहिए, लेकिन उन्होंने वास्तव में ऐसा क्यों नहीं किया।


25
विकिपीडिया का कहना है कि Null is a special marker used in Structured Query Language (SQL) to indicate that a data value does not exist in the database यह स्वीकृत ज्ञान है और आपको अपने आवेदन में नल का क्या मतलब है इसे फिर से परिभाषित नहीं करना चाहिए। यह आपके कोड के साथ काम करने वाले अन्य सभी लोगों को भ्रमित करेगा।
PersonalNexus

10
आप ऐसा क्यों करना चाहेंगे? क्यों न केवल एक अशोभनीय बिट फ़ील्ड का उपयोग करें और डिफ़ॉल्ट को गलत पर सेट करें यदि वह व्यवहार है जिसे आप त्रिकोणीय स्थिति के साथ समस्या को भ्रमित करने के बजाय चाहते हैं?
20

5
वास्तविक दुनिया का उदाहरण कि यह एक बहुत बुरा विचार क्यों है: SELECT * FROM foo WHERE bar = FALSEआपको अपेक्षित परिणाम नहीं देते हैं।
Blrfl

2
बूलियन के बजाय 0 के डिफ़ॉल्ट के साथ एक अंतर स्तंभ का उपयोग करने पर विचार करें। इस तरह से यदि नई स्थितियाँ उत्पन्न होती हैं (उदाहरण के लिए शायद एक 'लंबित' राज्य), तो आपको डेटाबेस संरचना में परिवर्तन नहीं करना होगा।
ग्रैंडमास्टरबी

4
लेकिन अगर आप झूठे को शून्य के रूप में संग्रहीत करते हैं तो आप FILE_NOT_FOUND कैसे स्टोर करेंगे? ( thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx )
एड जेम्स

जवाबों:


50

वहाँ केवल शून्य के रूप में झूठी भंडारण के साथ कुछ गलत है?

हाँ।

यदि ऐसा है तो आप कृपया बता सकते हैं कि नीचे की तरफ क्या होना चाहिए?

NULL, False के समान नहीं है।

परिभाषा के अनुसार, NULL को शामिल करने वाली तुलना (और तर्क) NULL (गलत नहीं) के मूल्यों को वापस करना चाहिए। हालाँकि, SQL कार्यान्वयन भिन्न हो सकते हैं।

True and NULL NULL (गलत नहीं है)।

True and NULL or False NULL (गलत नहीं है)।

http://en.wikipedia.org/wiki/Null_(SQL)#Three-valued_logic_.283VL.29

http://technet.microsoft.com/en-us/library/cc966426.aspx


3
मूल्य की अनुपस्थिति का प्रतिनिधित्व करने वाला मूल्य NULL क्यों है, इस पर स्पष्टीकरण।
maple_shaft

2
मेरे पहले विकास कार्य के पहले दिन में डिबगिंग और इस प्रश्न / उत्तर की तरह एक त्रुटि को ठीक करना शामिल था,
याददाश्त

1
ध्यान दें कि आपके द्वारा जोड़ा गया बहुत ही लेख यह कहता है कि यदि nullतर्क के लिए अप्रासंगिक है (जैसा कि इस मामले में है whatever OR TRUEया whatever AND FALSEजहां स्थिति का कोई मूल्य नहीं whateverबदल सकता है), तो अभिव्यक्ति एक मूल्य लौटाती है। यह एक अनुकूलन नहीं है; यह 3-मूल्यवान तर्क कैसे काम करता है । कोई भी डीबीएमएस जो उन भावों के लिए वापस लौटने पर जोर देता है UNKNOWN/ NULLमौलिक रूप से टूट गया है।
cHao

1
@ S.Lott, लेकिन कुछ जगह बचाने के लिए झूठे के बजाय अशक्त नहीं है ??
अजराफती

2
@ बल्ड्रीम: बुलियन के लिए, एक अशक्त क्षेत्र वास्तव में अधिक स्थान ले सकता है, जो डीबीएमएस पर निर्भर करता है। (यह, हालांकि, लगभग सभी मामलों में एक नगण्य राशि है।) बूलियन एक बिट में व्यक्त किया जा सकता है ... लेकिन एक नल बूलियन तीन संभावित मान (सच, झूठे, और नल) है, और इस तरह एक बिट की तुलना में अधिक की जरूरत है।
cHao

15

बूलियन क्षेत्र में नल की अनुमति देकर, आप एक द्विआधारी प्रतिनिधित्व (सत्य / असत्य) को एक त्रि-राज्य प्रतिनिधित्व (सच्चा, गलत, अशक्त) में बदल रहे हैं जहां आपकी 'अशक्त' प्रविष्टियां अनिश्चित हैं। 'अशक्त' मूल्य न तो 'सही' है और न ही 'असत्य' है। अपने प्रतिनिधित्व को गलत ठहराने के लिए आपको क्या कारण होगा?

यहां तक ​​कि अगर आप इस तरह के एक पैटर्न पर निर्णय लेते हैं और अपने पूरे आवेदन में लगातार करते हैं, तो यह ठीक नहीं है। आप उस स्थिति में समाप्त हो जाएंगे जहाँ यह ताज़ा आँखों के लिए स्पष्ट नहीं है कि यह पैटर्न क्यों है या अधिक संभावना है, आप ऐसी स्थिति में समाप्त होंगे जहाँ यह पैटर्न अनजाने में टूट गया है।


5

दूसरों ने क्या कहा है। 3 संभावित मूल्य एक बूलियन नहीं है।

लेकिन आपको 3 मानों की वैध आवश्यकता हो सकती है। जैसे (सत्य, असत्य, अज्ञात)। भले ही यह मामला है, अगर आप अति-सामान्यीकरण में हैं, तो आप किसी भी अशक्त मूल्यों की अनुमति नहीं देंगे। इसके बजाय आप 1 से 1 संबंध के साथ एक और टेबल में एक असली बूलियन स्टोर करेंगे। एक अशक्त मान को क्वेरी में "विफल" बाहरी जुड़ाव द्वारा उत्पादित किया जा सकता है, न कि किसी भौतिक रूप से संग्रहीत शून्य मान द्वारा।


मेरे बूलियन प्रश्न के दायरे के बाहर अगर आप इसे करने के लिए अशक्त इस्तेमाल करते हैं तो सच्चा अज्ञात क्यों बुरा होगा? मेरे सवाल से परे आमतौर पर अशक्त होने से बचा जा सकता है? क्यों?
ओमिनस

3
@Ominus: यदि आप एक प्यूरिस्ट हैं तो आमतौर पर नल से बचा जा सकता है। यदि उनका उपयोग किया जाता था, जैसा कि उनका उपयोग किया जाता था (क्योंकि नकली-नकली के बजाय "यहां कोई मूल्य नहीं है" false), तो उनके पास अपना स्थान है। यदि वे नहीं करते, तो वे मौजूद नहीं होते। विकल्प, जैसा कि उल्लेख किया गया है, मूल रूप से आपकी पंक्ति की प्राथमिक कुंजी और एक एकल बूलियन (या इंट, या वर्चर, या आपके पास क्या है) के साथ एक पूरी अन्य तालिका है। प्रत्येक क्षेत्र के लिए जिसे आप अन्यथा अशक्त बना देंगे। जबकि विशुद्ध रूप से शुद्ध, यह अधिकांश प्रयोजनों के लिए बहुत जटिल है।
cHao

-3

है bool?एक बूलियन प्रकार? नहीं। यह प्रकार का है, Nullable<T>जहां Tबूलियन है। एक अशक्त बूलियन में 3 मान हो सकते हैं: सच, गलत और अशक्त। उपयोग करना boolया bool?अपनी आवश्यकता पर निर्भर करता है। वैध कारण हो सकता है जहाँ आपको अशक्त का उपयोग करने की आवश्यकता हो सकती है लेकिन एक प्रकार जो बाइनरी की तरह गंध करता है लेकिन आपको इसका उत्तर नहीं पता है। उपरोक्त उदाहरण में,User.IsActiveस्पष्ट कटौती लगता है। उपयोगकर्ता सक्रिय है या नहीं। एक प्रणाली के रूप में, यह जानना चाह सकता है कि उपयोगकर्ता सक्रिय है या नहीं। Maybe शायद ’नहीं होना चाहिए। लेकिन एक सुविधा ध्वज की तरह कुछ के बारे में सोचो। क्या सुविधा चालू है? उत्तर हां, नहीं या निश्चित नहीं हो सकते हैं। आपके पास एक व्यावसायिक नियम हो सकता है जो मंत्र केवल बटन को दिखाता है जब झंडा सही पर सेट होता है। कोई तर्क कर सकता है कि बूल डिफ़ॉल्ट रूप से गलत है, इसलिए क्यों अशक्त बूल का निर्माण करें? आवश्यकता को उलटा करें: क्या आप डेटा स्रोत के सभी मानों को सच करने जा रहे हैं?


2
यह पोस्ट पढ़ना मुश्किल है (पाठ की दीवार)। आप आपत्ति तो नहीं है संपादित एक बेहतर आकार में यह ing?
gnat
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.