जब आप बूलियन मान निर्धारित नहीं कर सकते तो क्या करें?


38

हम कंपनी के लिए एक वेब एप्लिकेशन का निर्माण कर रहे हैं, जो प्रशासन केवल एक्सेल शीट में मौजूद है। हम अब तक लगभग काम कर चुके हैं, लेकिन हाल ही में मुझे उन सभी डेटा को उन शीटों से हमारे नए सिस्टम में आयात करने का काम सौंपा गया था। सिस्टम जावा में बनाया गया है, लेकिन जैसा कि यह आयात सिर्फ एक बार की बात है, मैंने इसके बजाय पायथन में स्क्रिप्ट लिखने का फैसला किया और इसे सीधे एसक्यूएल प्रश्नों के साथ आयात किया। यहाँ समस्या आती है। नए डेटा मॉडल में कुछ नई विशेषताएँ हैं, जो उनके मौजूदा डेटा में शामिल नहीं हैं। ज्यादातर मामलों में, यह कोई समस्या नहीं है, मैं सिर्फ एक अशक्त डाल देता हूं जहां मुझे जानकारी नहीं मिल सकती है। लेकिन फिर मैं कुछ विशेषताओं में भाग गया, जो बूलियन हैं और डिफ़ॉल्ट रूप से NULL नहीं हो सकते। पहले मैंने अपने डेटाबेस में उन क्षेत्रों के लिए बस अनुमति देने की कोशिश की, लेकिन मेरे वरिष्ठ देव ने मुझे ऐसा करने के लिए कहा, क्योंकि यह भविष्य में हमारी प्रणाली में एक समस्या का कारण होगा। और अब मुझे पूरा यकीन नहीं है कि मुझे क्या करना है। स्पष्ट समाधान हर अज्ञात बूलियन मूल्य को गलत करने के लिए डिफ़ॉल्ट है, लेकिन मुझे लगता है कि यह भी गलत है, क्योंकि मैं वास्तव में नहीं जानता, चाहे वह गलत हो।

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

इस स्थिति में सबसे अच्छा तरीका क्या है? क्या हमें केवल कंपनी को लापता डेटा में मैन्युअल रूप से भरने के लिए कहना चाहिए? या इसे गलत के लिए डिफ़ॉल्ट?


70
मेरे लिए NULL की अनुमति देना सही समाधान होगा। क्या आपके वरिष्ठ "भविष्य में हमारी प्रणाली में एक समस्या का कारण" से अधिक विशिष्ट थे? यदि नहीं, तो उससे अधिक विशिष्ट कारणों के लिए पूछें।
लार्से

48
आपको इसे FileNotFoundस्पष्ट रूप से डिफ़ॉल्ट करना चाहिए ।
आप

7
क्या बूलियन फ़ील्ड को जोड़ना संभव है , "isValidHasRadio" या कुछ और, या क्या वह चीजों को भी तोड़ देगा?
हाइड

9
सही समाधान इनपुट डेटा कचरा पर विचार करना है और पूरे लेनदेन को समाप्त करना है, और फिर उस डेटा को कचरा नहीं माना जाना चाहिए , तो कार्य परिभाषा को समायोजित करने की मांग करें । यहां कोई दूसरा रास्ता नहीं है।
सर्ज बोर्स्च

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

जवाबों:


129

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

यह आमतौर पर निम्नलिखित मामलों में से एक को जन्म देगा:

  • विशिष्ट कॉलम के लिए एक अच्छा डिफ़ॉल्ट मान है, उपयोगकर्ताओं को कोई आपत्ति नहीं है यदि मूल्य शुरू में सभी रिकॉर्ड के लिए समान है, तो वे आवश्यक होने पर सही मान आसानी से सेट कर सकते हैं

  • अन्य नियमों से आदर्श डिफ़ॉल्ट मान निर्धारित करने का एक नियम है, इसलिए आप इस नियम को कोड में डाल सकते हैं

  • उपयोगकर्ता या आपके ग्राहक इनपुट डेटा का विस्तार करेंगे और डेटाबेस में आयात होने से पहले लापता मान (शायद मैन्युअल रूप से) प्रदान करेंगे

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

अंतिम मामले के लिए NULL की तरह कुछ की आवश्यकता होती है, जो अनैतिक या अज्ञात स्थिति का प्रतिनिधित्व करता है, भले ही एक बूलियन मूल्य के लिए, यदि आपका वरिष्ठ इसे पसंद करता है या नहीं। यदि कुछ अस्पष्ट तकनीकी कारण है जो किसी विशिष्ट कॉलम के लिए NULL मान के उपयोग को मना करता है, तो आपको "अज्ञात" स्थिति को एक अलग तरीके से अनुकरण करने की आवश्यकता है, या तो एक अतिरिक्त बूलियन कॉलम (जैसे hasRadioIsUnknown), या 3 का उपयोग करके एक बूलियन के बजाय -valued गणना (जैसे HasNoRadio=0, HasRadio=1, Unknown=2)। लेकिन अपने वरिष्ठ से फिर से बात करें, जब आप पूरी तरह से आवश्यकताओं का विश्लेषण कर लेते हैं, तो यह सुनिश्चित करने के लिए कि ऐसा समाधान वास्तव में आवश्यक है।


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

1
यह एक कार्यात्मक मुद्दा है। मॉडल (एक्सेल और नया वाला) मेल नहीं खाते, इन मामलों को ध्यान में रखते हुए माइग्रेशन प्रक्रिया की समीक्षा की जानी चाहिए। केवल यह कह सकते हैं कि कैसे आगे बढ़ना है / हितधारक हैं (ग्राहक या जो भी)। तकनीकी रूप से आप इसे कई तरीकों से हल कर सकते हैं, लेकिन कार्यात्मक रूप से केवल एक में। सही।
Laiv

12
मुझे यह टूटना पसंद है। इस संदर्भ में अशक्त होने के लिए मेरी अरुचि ज्यादातर स्पष्ट अर्थ की कमी के कारण है। अज्ञात स्पष्ट है। लेकिन क्या शून्य का मतलब अज्ञात है या लागू नहीं है? किसी को कैसे पता चलेगा? सिर्फ इसलिए कि यह आपके लिए मायने रखता है इसका मतलब यह नहीं है कि बाकी सभी लोग इसे उसी तरह देखेंगे।
कैंडिड_ऑरेंज

विकल्प 4: एक विशेष स्तंभ मान को रिकॉर्ड करने वाले रिकॉर्ड वास्तव में बेकार हैं और इसे आयात से बाहर रखा जाना चाहिए। विकल्प 5: किसी को आयात होने से पहले आने वाले सभी डेटा को सही करना होगा। विकल्पों के बहुत सारे, बस जरूरतों और बजट पर निर्भर करता है। पुराने डेटा को आयात करना हमेशा एक बड़ी गड़बड़ी है।
jpmc26

@ jpmc26: ठीक है, मैंने विकल्प 4 को शामिल नहीं किया था क्योंकि मैं ओपी को जो लिखना चाहता था उसे छड़ी करना चाहता था (एक ऐसा मामला जहां लापता डेटा निश्चित रूप से आयात डेटा में शामिल नहीं है, बिना किसी रिकॉर्ड के)। विकल्प 5 वास्तव में ध्यान देने योग्य है, क्योंकि यह NULL मूल्यों के लिए आवश्यकता से बचने का एक और तरीका है। मेरे हिसाब से जवाब दिया।
डॉक ब्राउन

39

यह एक तकनीकी प्रश्न नहीं है; यह एक व्यावसायिक नियम प्रश्न है। तो, आपको "व्यवसाय" पूछने की आवश्यकता है।

उत्पाद के मालिक और / या हितधारक (एस) को दृष्टिकोण दें और ऐसा कुछ कहें:

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

कुछ चर्चा संभवतः सुनिश्चित करेगी। लेकिन, यह मूल रूप से है। तकनीकी समाधान स्वाभाविक रूप से व्यापार नियमों से अधिक मांसल से बाहर निकलेगा।


9

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

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

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

हालाँकि, कुछ अंतर डेटा के कारण होने की संभावना है कि "होना चाहिए" जो गायब या दूषित है। (डेटा एंट्री एरर या डेटा प्रोसेसिंग सिस्टम में खराब माइग्रेशन या बग्स की खराब स्थिति से सबसे अधिक संभावना है।) यदि आपकी टीम में से किसी ने भी यह अनुमान नहीं लगाया है, तो आपने (सामूहिक रूप से) प्रोजेक्ट के समय का 20% खर्च करने के लिए खुद को सेट किया है " लगभग हो गया। (यह एक बना हुआ नंबर था, लेकिन यह बहुत दूर हो सकता हैइससे भी बदतर, या बेहतर। यह इस बात पर निर्भर करता है कि डेटा कितना गलत है, यह कितना महत्वपूर्ण है, यह कितना जटिल है, डेटा के लिए जिम्मेदार लोगों और अन्य कारकों से भागीदारी प्राप्त करना कितना आसान है।) एक बार जब आप यह निर्धारित कर लेते हैं कि डेटा "माना जाता है"। हो "लेकिन वहाँ गायब है। आमतौर पर आप पुराने डेटा स्रोतों को क्वेरी करके समस्या की सीमा निर्धारित करने का प्रयास करेंगे। यदि यह दर्जनों या सैकड़ों प्रविष्टियाँ हैं, तो संभवतः यह डेटा प्रविष्टि त्रुटियां हैं और डेटा के लिए ज़िम्मेदार ग्राहकों को मैन्युअल रूप से इसे हल करना चाहिए (यानी आपको बताएं कि मान क्या होना चाहिए।) यदि यह लाखों प्रविष्टियाँ हैं (या डेटा का एक महत्वपूर्ण अंश) , तब आपको पुनर्विचार करने की आवश्यकता हो सकती है कि क्या आपने सही पहचान की है कि यह "वहां" होना चाहिए। यह नई प्रणाली में मॉडलिंग त्रुटि का संकेत हो सकता है।

उदाहरण के लिए, एक ऐसे इनवॉइस की कल्पना करें जिसमें मात्राएं और प्रति आइटम योग (लेकिन यूनिट मूल्य नहीं) हो, सिवाय इसके कि कुछ मात्राएं अनावश्यक रूप से गायब थीं। ऐसे इनवॉइस को संसाधित करने वाले व्यक्ति से बात करते हुए, निम्नलिखित परिदृश्यों में से एक (या अधिक) का उत्पादन हो सकता है: 1) "ओह, एक खाली मात्रा का मतलब 1", 2) की मात्रा है "ओह, मुझे पता है कि वे आइटम लगभग $ 1,000 के लिए जाते हैं। स्पष्ट रूप से यह 2 ", 3) के लिए एक आदेश है" जब ऐसा होता है, तो मैं इस अन्य प्रणाली में कीमत देखता हूं और विभाजित करता हूं और गोल करता हूं ", 4)" मैं इसे किसी अन्य प्रणाली में देखता हूं ", 5)" यह वास्तविक डेटा नहीं है ", 6)" इससे पहले कभी नहीं देखा था "।

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


14
सारांश में: यदि आपको लगता है कि विरासत कोड के साथ काम करना अप्रिय है, तो विरासत डेटा से निपटने का प्रयास करें।
पीटर टेलर

0

डेटामॉडल बदलें।

आप hasradio को सामान्य कर सकते हैं और फिर आपके पास अब कोई नल नहीं होगा।

यदि आप बूलियन मान निर्धारित नहीं कर सकते, तो बूलियन का उपयोग न करें।

एक बूलियन मान को शून्य होने देने से यह एक बूलियन होना बंद हो जाता है। एक बूलियन में 2 अवस्थाएँ हो सकती हैं: झूठी, सच्ची।

आपको 3 राज्यों की आवश्यकता है: गलत, सत्य, अज्ञात।

क्या आपके पास डेटामॉडल को बदलने का विकल्प है?

(और एक और बात जो मैंने सोची थी, अगर अजगर या जावा में आप अपने डेटाबेस से डेटा को पुनः प्राप्त करते हैं। आप रिकॉर्ड को पुनः प्राप्त करते हैं, हैडरियो क्षेत्र की जांच करते हैं, क्या होगा यदि आप जांचते हैं कि क्या यह सच है या गलत है और यह सुस्त है?)


2
डेटा मॉडल और "बाहर hasRadio सामान्य" बदलने से, मैं तुम्हें एक नई तालिका को जैसे चाहें मतलब कुछ मान CarFeaturesक्षेत्रों के साथ, Car_ID, Feature_ID, Has_Feature? यह अच्छा विचार प्रतीत होता है।
जपा

2
@jpa यह एक मुश्किल स्थिति है। आप जो करते हैं उसमें आपको बहुत स्पष्ट होना पड़ता है, क्योंकि हमारी स्थिति में रिकॉर्ड की अनुपस्थिति का मतलब अज्ञात है। जबकि अक्सर एक रिकॉर्ड की अनुपस्थिति का मतलब यह सुविधा नहीं है।
पीटर बी

1
आप इसे गलत देख रहे हैं, पीटर। कोई भी नहीं कहता है कि boolदो से अधिक मान हैं, क्योंकि, जैसा आपने कहा है, ऐसा नहीं है। A या boolतो है । हालांकि, ओपी के मामले में, ओपी सीधे तौर पर काम नहीं कर रहा है , बल्कि ए , जो हो सकता है या हो सकता है । truefalseboolOption<bool>/Maybe<bool>Some -> true/falseNone
एंडी

@DavidPacker मेरा तर्क यह है कि इसकी वजह यह शायद एक <bool> है, आपको इसे किसी भी तरह से दूरस्थ रूप से कॉल करना बंद कर देना चाहिए या आपको भ्रम होगा। और अगर आप बूलियन का उपयोग करने पर जोर देते हैं तो इसे करने का एक सुरक्षित तरीका खोजें।
पीटर बी

4
मेरी राय में, अशक्त बूलियन पूरी तरह से ठीक है। मुझे कभी भी अशक्त मूल्यों की समस्या नहीं हुई है, हालांकि मैंने ऐसे डेवलपर्स से मुलाकात की है जिन्होंने किया था।
एंडी

-1

जैसा कि अन्य लोगों ने बताया है कि आपके यहाँ जो बूलियन मूल्य है वह वास्तव में बूलियन नहीं है और मुद्दा यह है कि इसे या तो बूलियन होने के लिए मजबूर किया जाए या अन्यथा इसे संभाल लिया जाए।

आप एक बूलियन परिणाम होने के बजाय, दो बूलियन परिणाम होने के बजाय क्या कर सकते हैं। ये सहमत या असहमत हो सकते हैं। यदि वे सहमत हैं, तो आपके पास एक सीधा सच्चा / गलत परिणाम है।

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.