ऑरेकल में बुलियन फील्ड


145

कल मैं एक Oracle तालिका में बूलियन फ़ील्ड जोड़ना चाहता था। हालाँकि, ओरेकल में वास्तव में एक बूलियन डेटा प्रकार नहीं है। क्या यहाँ किसी को बूलियन अनुकरण करने का सबसे अच्छा तरीका पता है? इस विषय को देखते हुए कई दृष्टिकोण खोजे गए

  1. पूर्णांक का उपयोग करें और इसे 0 या 1 के अलावा कुछ भी असाइन करने से परेशान न हों।

  2. केवल दो मानों के रूप में 'Y' या 'N' के साथ एक चार क्षेत्र का उपयोग करें।

  3. CHECK बाधा के साथ एक एनम का उपयोग करें।

क्या अनुभवी ओरेकल डेवलपर्स को पता है कि कौन सा दृष्टिकोण पसंद किया जाता है / विहित?


195
काश ओरेकल के पास एक wallडेटा प्रकार होता, तो मैं बूलियन्स का उपयोग करते समय इसके खिलाफ अपना सिर तोड़ सकता था।
ग्रेग

जवाबों:


82

मुझे यह कड़ी उपयोगी लगी।

यहां प्रत्येक दृष्टिकोण के कुछ पेशेवरों / विपक्षों पर प्रकाश डाला गया पैराग्राफ है।

सबसे अधिक देखा जाने वाला डिज़ाइन कई बूलियन-जैसे झंडे की नकल करना है जो कि ओरेकल के डेटा डिक्शनरी विचारों का उपयोग करते हैं, सच के लिए 'वाई' और झूठ के लिए 'एन' का चयन करते हैं। हालाँकि, होस्ट वातावरण, जैसे कि JDBC, OCCI और अन्य प्रोग्रामिंग वातावरण के साथ सही तरीके से बातचीत करने के लिए, झूठे के लिए 0 और सच के लिए 1 का चयन करना बेहतर है, इसलिए यह GetBoolean और setBoolean फ़ंक्शन के साथ सही ढंग से काम कर सकता है।

मूल रूप से वे दक्षता के लिए, विधि संख्या 2 की वकालत करते हैं

  • मूल्यों (JDBC के साथ अंतर की वजह से 0/1 के getBoolean()एक चेक बाधा के साथ आदि)
  • एक प्रकार का CHAR (क्योंकि यह NUMBER से कम स्थान का उपयोग करता है)।

उनका उदाहरण:

create table tbool (bool char check (bool in (0,1));
insert into tbool values(0);
insert into tbool values(1);`

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

7
कंप्यूटर विज्ञान के भीतर 0 और 1 बूलियन मान के अनुरूप नहीं होते हैं - शेल स्क्रिप्ट प्रकार की भाषा में सफलता के रूप में 0 और विफलता के रूप में गैर-शून्य होते हैं, जबकि C प्रकार की भाषा में विफलता के रूप में 0 और सफलता के रूप में गैर-शून्य होते हैं।
फिल

41
बूलियन मूल्यों के रूप में , वे असंदिग्ध हैं। प्रक्रिया रिटर्न कोड बूलियन मान नहीं हैं।
एंड्रयू स्पेंसर

13
इस उत्तर में दिए गए लिंक से इस पूरे पैराग्राफ को अनदेखा क्यों किया गया? "सबसे अधिक देखा जाने वाला डिज़ाइन कई बूलियन जैसे झंडे की नकल करने के लिए है जो कि ओरेकल के डेटा शब्दकोश विचारों का उपयोग करते हैं, सही के लिए 'वाई' का चयन करते हैं और झूठे के लिए 'एन' का चयन करते हैं। हालांकि, मेजबान वातावरण, जैसे जेडीबीसी, ओसीसीआई के साथ सही ढंग से बातचीत करने के लिए। और अन्य प्रोग्रामिंग वातावरण, झूठे के लिए 0 और सच के लिए 1 का चयन करना बेहतर है ताकि यह गेटबुलियन और सेटबुलियन फ़ंक्शन के साथ सही ढंग से काम कर सके। " वे कहते हैं कि जबकि 'Y / N' आम है, मेजबान वातावरण के साथ संगतता बढ़ाने के लिए '0/1' का उपयोग करने की सिफारिश की जाती है।
justin.hughey

28

ओरेकल खुद बूलियन मूल्यों के लिए वाई / एन का उपयोग करता है। पूर्णता के लिए यह ध्यान दिया जाना चाहिए कि pl / sql में एक बूलियन प्रकार है, यह केवल टेबल है जो ऐसा नहीं करता है।

यदि आप यह इंगित करने के लिए फ़ील्ड का उपयोग कर रहे हैं कि क्या रिकॉर्ड को संसाधित करने की आवश्यकता है या नहीं, तो आप Y और NULL को मान के रूप में उपयोग करने पर विचार कर सकते हैं। यह एक बहुत छोटे (तेजी से पढ़ें) सूचकांक के लिए बनाता है जो बहुत कम जगह लेता है।


7
Y / N का उपयोग करके Oracle आंतरिक विचारों और तालिकाओं के बारे में +1 अच्छा बिंदु। यदि ओरेकल ऐसा करता है तो यह सही होना चाहिए! :)
जेफरी केम्प

क्या आप समझा सकते हैं कि Y और NULL, Y और N की तुलना में एक छोटा सूचकांक कैसे बनाते हैं?
स्टाइलफल

6
NULLs को Oracle में अनुक्रमित नहीं किया जाता है, इसलिए यदि आपके अनुक्रमणिका में कुछ Y वर्ण हैं, लेकिन अधिकतर NULLs में आपके पास बहुत छोटा सूचकांक होगा।
लेह रिफ़ेल

25

अंतरिक्ष की कम से कम राशि का उपयोग करने के लिए आपको 'Y' या 'N' के लिए बाध्य CHAR फ़ील्ड का उपयोग करना चाहिए। Oracle BOOLEAN, BIT या TINYINT डेटा प्रकारों का समर्थन नहीं करता है, इसलिए CHAR का एक बाइट उतना ही छोटा है जितना कि आप प्राप्त कर सकते हैं।


19

सबसे अच्छा विकल्प 0 और 1 है (संख्या के रूप में - एक अन्य उत्तर 0 और 1 को CHAR के रूप में बताता है स्पेस-दक्षता के लिए के लेकिन मेरे लिए थोड़ा बहुत मुड़ है), उन मूल्यों पर सामग्री को सीमित करने के लिए NOT NULL और एक चेक बाधा का उपयोग कर रहा है। (यदि आपको स्तंभ को अशक्त होने की आवश्यकता है, तो यह एक बूलियन नहीं है जो आप के साथ काम कर रहे हैं, लेकिन तीन मूल्यों के साथ एक गणना है ...)

0/1 के लाभ:

  • भाषा स्वतंत्र। 'Y ’और Y N’ सबको इस्तेमाल करने पर ठीक रहेगा। लेकिन वे नहीं करते। फ्रांस में वे 'ओ' और 'एन' का उपयोग करते हैं (मैंने इसे अपनी आंखों से देखा है)। मैंने फिनलैंड में यह देखने के लिए प्रोग्राम नहीं किया है कि क्या वे 'ई' और 'के' का उपयोग करते हैं - इसमें कोई संदेह नहीं है कि वे इससे ज्यादा चालाक हैं, लेकिन आप सुनिश्चित नहीं हो सकते।
  • व्यापक रूप से उपयोग की जाने वाली प्रोग्रामिंग भाषाओं (C, C ++, पर्ल, जावास्क्रिप्ट) में अभ्यास के साथ बधाई
  • हाइबरनेट जैसे अनुप्रयोग परत के साथ बेहतर खेलता है
  • अधिक संक्षिप्त एसक्यूएल ओर जाता है, उदाहरण के लिए, पता लगाने के लिए कितने केले खाने के लिए तैयार कर रहे हैं select sum(is_ripe) from bananasके बजाय select count(*) from bananas where is_ripe = 'Y'या यहाँ तक कि (युक)select sum(case is_ripe when 'Y' then 1 else 0) from bananas

'Y' / 'N' के लाभ:

  • 0/1 से कम जगह लेता है
  • यह वही है जो ओरेकल सुझाता है, इसलिए हो सकता है कि कुछ लोग अधिक अभ्यस्त हों

एक अन्य पोस्टर ने प्रदर्शन लाभ के लिए 'Y' / null का सुझाव दिया। यदि आपने यह साबित कर दिया है कि आपको प्रदर्शन की आवश्यकता है, तो पर्याप्त रूप से उचित है, लेकिन अन्यथा इससे बचें क्योंकि यह कम स्वाभाविक बनाता है ( some_column is nullइसके बजाय some_column = 0) और बाईं ओर शामिल होने पर आप बिना किसी रिकॉर्ड के झूठेपन का सामना करेंगे।


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

1
हां, सही-गलत-अज्ञात की आवश्यकता हो सकती है, हालांकि अगर मैं picky (जो मैं हूं), मैं कहूंगा कि इसे वास्तव में बूलियन के रूप में वर्णित नहीं किया जाना चाहिए, क्योंकि यह नहीं है।
एंड्रयू स्पेंसर

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

1
सही है, अपनी पद्धति के लिए एक प्लस नोट पर यदि आप अपना नंबर सही तरीके से कॉन्फ़िगर करते हैं तो इसे एक सिंगल बाइट में एक चार फ़ील्ड के रूप में भी संग्रहीत किया जा सकता है, जो 0/1 का उपयोग करने के खिलाफ आकार तर्क को शून्य करता है, मुझे वर्तमान में लिंक नहीं मिल सकता है लेकिन एक नंबर के लिए भंडारण विन्यास के आधार पर 1 से 22 बाइट्स तक होता है
माइक

4
मुझे संदेह है कि डाउनवोट्स सबसे अधिक स्मृति कुशल कार्यान्वयन को चुनने पर एक विरासत दृष्टिकोण के कारण हैं। इस दिन और उम्र की स्मृति दक्षता एक प्राथमिकता से कम है और प्रयोज्य और संगतता के बाद ध्यान में रखा जाना चाहिए। जो कोई भी इस टिप्पणी का जवाब दे सकता है, मैं समयपूर्व अनुकूलन पर पढ़ने की सलाह देता हूं। यह वही है जो विशुद्ध रूप से स्मृति दक्षता के आधार पर 'वाई / एन' चुनकर होता है। आप उस निर्णय के कारण आमतौर पर उपयोग किए जाने वाले फ्रेमवर्क के सेट के साथ देशी अनुकूलता खो रहे हैं।
justin.hughey

5

या तो 1 / या Y / N उस पर एक चेक बाधा के साथ। ईथर तरीका ठीक है। मैं व्यक्तिगत रूप से 1/0 को पसंद करता हूं क्योंकि मैं पर्ल में बहुत काम करता हूं, और यह डेटाबेस फ़ील्ड्स के लिए पर्ल बुलियन ऑपरेशन करना वास्तव में आसान बनाता है।

आप एक बहुत गहराई में दैवज्ञ सिर honchos में से एक के साथ इस सवाल की चर्चा चाहते हैं, यह देखें कि टॉम Kyte इस बारे में क्या कहना है यहां


1/0 को "कम मेमोरी कुशल" कहा जाता है, लेकिन ... मुझे यह अधिक पसंद है (और स्पष्ट रूप से हाइबरनेट करने के लिए एक बूलियन के लिए
1/0 की

1/0 एक बूलियन के लिए हाइबरनेट का डिफ़ॉल्ट है लेकिन आप अपनी पसंद के किसी भी कस्टम मैपिंग को परिभाषित कर सकते हैं।
एंड्रयू स्पेंसर

@rogerdpack thats क्योंकि एक चर क्षेत्र 1 बाइट है, या 2 बाइट nchar के लिए, जहां के रूप में यह कैसे परिभाषित किया जाता है एक संख्या 1 से 22 बाइट्स हो सकती है
माइक

4

डेटाबेस मैंने अपना ज्यादातर काम 'वाई' / 'एन' पर बुलियन के रूप में किया था। उस कार्यान्वयन के साथ, आप कुछ तरकीबें खींच सकते हैं जैसे:

  1. उन पंक्तियों को गिनें जो सत्य हैं:
    SELECT SUM (CASE WHEN BOOLEAN_FLAG = 'Y' THEN 1 ELSE 0) X से

  2. पंक्तियों को समूहीकृत करते समय, "यदि एक पंक्ति सत्य है, तो सभी सत्य हैं" तर्क:
    Y से
    विपरीत MAX (BOOLEAN_FLAG) का चयन करें , एक पंक्ति के गलत होने पर समूहीकरण को बाध्य करने के लिए MIN का उपयोग करें।


4
वास्तव में दिखाए गए उदाहरण 0/1 दृष्टिकोण के लिए भी उपयोगी हैं - और, IMHO, तेज।
igorsantos07

2

एक ऑरेकल डेटाबेस ( numberप्रकार का उपयोग करके ) में मौजूदा तालिका में "बूलियन" कॉलम जोड़कर स्वीकृत उत्तर को लागू करने के लिए एक कार्य उदाहरण :

ALTER TABLE my_table_name ADD (
my_new_boolean_column number(1) DEFAULT 0 NOT NULL
CONSTRAINT my_new_boolean_column CHECK (my_new_boolean_column in (1,0))
);

इस में एक नया स्तंभ बनाता है my_table_nameकहा जाता है my_new_boolean_column0. के मूलभूत मूल्यों के साथ स्तंभ को स्वीकार नहीं करेगा NULLमूल्यों और करने के लिए या तो स्वीकार किए जाते हैं मानों को प्रतिबंधित करता है 0या 1


1

हमारे डेटाबेस में हम एक enum का उपयोग करते हैं जो सुनिश्चित करता है कि हम इसे TRUE या FALSE पास करते हैं। यदि आप इसे पहले दो तरीकों में से किसी एक में करते हैं, तो या तो यह आसान है कि किसी उचित डिज़ाइन के बिना पूर्णांक में नए अर्थ जोड़ना शुरू करें, या उस चार फ़ील्ड के साथ समाप्त करें जिसमें Y, y, N, n, T, t, F, f मान और यह याद रखना कि कोड का कौन सा अनुभाग किस तालिका का उपयोग करता है और कौन सा संस्करण इसका उपयोग कर रहा है।

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