2008-08-27 21 views
135

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

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

  2. 'वाई' या 'एन' के साथ एक चार फ़ील्ड का उपयोग केवल दो मानों के रूप में करें।

  3. चेक बाधा के साथ एक enum का उपयोग करें।

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

+181

मेरी इच्छा है कि ओरेकल के पास 'दीवार' डेटा प्रकार था, इसलिए मैं बूलियन का उपयोग करते समय इसके खिलाफ अपने सिर को तोड़ सकता था। – Greg

उत्तर

76

मुझे this लिंक उपयोगी पाया गया।

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

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

असल में वे विधि नंबर 2 की वकालत, दक्षता की खातिर,

  • मानों का उपयोग 0/1 की एक चेक बाधा
  • एक साथ (JDBC के 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 का अर्थ भाषा बाधाओं में निरंतर है। –

+6

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

+40

* बूलियन * मान के रूप में, वे अस्पष्ट हैं। प्रक्रिया वापसी कोड बुलियन मूल्य नहीं हैं। –

1

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

26

अंतरिक्ष के कम से कम राशि का उपयोग करने के लिए आप 'Y' या 'एन' के लिए विवश एक CHAR क्षेत्र का उपयोग करना चाहिए। ओरेकल बुलेन, बीआईटी, या टिन्यिनट डेटा प्रकारों का समर्थन नहीं करता है, इसलिए CHAR का एक बाइट उतना छोटा है जितना आप प्राप्त कर सकते हैं।

4

डेटाबेस मैंने अपने अधिकांश कामों को 'वाई'/'एन' पर बूलियन के रूप में किया था।

  1. गणना पंक्तियों को सत्य हैं: कि कार्यान्वयन के साथ, आप जैसे कुछ चाल हटा सकते हैं
    चयन योग (मामला है जब BOOLEAN_FLAG = 'वाई' तो और 1 0) से एक्स

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

+4

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

5

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

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

+0

1/0 को "कम स्मृति कुशल" कहा जाता है लेकिन ... मुझे इसे और भी पसंद है (और हाइबरनेट को स्पष्ट रूप से एक बूलियन के लिए 1/0 की आवश्यकता होती है) – rogerdpack

+0

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

+0

@rogerdpack ऐसा इसलिए है क्योंकि एक चार फ़ील्ड nchar के लिए 1 बाइट, या 2 बाइट्स है, जहां यह निर्धारित किया जाता है कि यह कैसे परिभाषित किया जाता है कि संख्या 1 से 22 बाइट – MikeT

28

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

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

+7

+1 हो सकती है ओरेकल आंतरिक दृश्यों और तालिकाओं के बारे में वाई/एन का उपयोग करके अच्छा बिंदु। यदि ओरेकल ऐसा करते हैं तो यह सही होना चाहिए! :) –

+0

क्या आप समझा सकते हैं कि वाई और एनयूएल वाई और एन की तुलना में एक छोटी सूचकांक कैसे बनाता है? – styfle

+6

ओआरएलएल में ओयूएलईएल को अनुक्रमित नहीं किया गया है, इसलिए यदि आपकी अनुक्रमणिका में कुछ वाई वर्ण हैं, लेकिन अधिकतर एनयूएलएल में आपके पास बहुत छोटी अनुक्रमणिका होगी। –

19

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

0/1 के लाभ:

  • भाषा स्वतंत्र। अगर वाई हर कोई इसका इस्तेमाल करता है तो 'वाई' और 'एन' ठीक होगा। लेकिन वे नहीं करते हैं। फ्रांस में वे 'ओ' और 'एन' का उपयोग करते हैं (मैंने इसे अपनी आंखों से देखा है)। मैंने फिनलैंड में प्रोग्रामिंग नहीं किया है कि वे 'ई' और 'के' का उपयोग करते हैं - इसमें कोई संदेह नहीं है कि वे इससे ज्यादा चालाक हैं, लेकिन आप सुनिश्चित नहीं हो सकते हैं।
  • व्यापक रूप से उपयोग की जाने वाली प्रोग्रामिंग भाषाओं (सी, सी ++, पर्ल, जावास्क्रिप्ट) में अभ्यास के साथ मिलकर
  • एप्लिकेशन परत के साथ बेहतर खेलता है उदा।
  • लीड हाइबरनेट अधिक संक्षिप्त एसक्यूएल, उदाहरण के लिए, पता लगाने के लिए चाहते हैं कि कितने केले 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'/'एन' के लाभ खाने के लिए तैयार हैं:

  • 0/1
  • यह क्या ओरेकल पता चलता है की तुलना में कम जगह लेता है, तो हो सकता है कि कुछ लोगों को और अधिक
लिए किया जाता है

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

+3

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

+1

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

+2

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

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_new_boolean_column बुलाया my_table_name में एक नया स्तंभ बनाता है 0 के डिफ़ॉल्ट मान। कॉलम NULL मान स्वीकार नहीं करेगा और स्वीकार किए गए मानों को 0 या 1 पर प्रतिबंधित करेगा।