2012-06-04 4 views
6

तो कुछ साल पहले मैंने एक तीसरे पक्ष द्वारा विकसित प्रणाली की डीबी स्कीमा देखी और देखा कि उन्होंने बूलियन (टिनिंट) क्षेत्र के बजाय enum ('y', 'n') का उपयोग किया था। मुझे नहीं पता कि क्यों मुझे यह बहुत पसंद आया, मैंने पाया कि यह चीजों को पढ़ने में आसान बनाता है (पूरी तरह से व्यक्तिपरक मुझे पता है) लेकिन मैंने इसे अपनाया और तब से इसका उपयोग करना शुरू कर दिया। मुझे लगता है कि मैं इसे "सत्य" और "झूठी" के लिए स्वैप कर सकता हूं लेकिन, मैं क्या कह सकता हूं, मुझे बस यह पसंद आया।क्या MySQL तालिका में बुलियन फ़ील्ड के बजाय enum ('y', 'n') का उपयोग करना बुरा है?

अब कहा जा रहा है कि क्या इस तरह से काम करने के लिए कोई झटका है - एक प्रोग्रामर को थोड़ा परेशान करने से अलग जो गेम में देर से आएगा?

+3

यह वोट क्यों बंद करें?यह एक कानूनी प्रश्न –

+0

है, मैं कहूंगा कि यह बंद होने के बजाय http://programmers.stackexchange.com पर है। – lanzz

उत्तर

9

हाँ, यह बुरा है। आप इसके साथ अंतर्ज्ञानी बुलियन तर्क खो देते हैं (SELECT * FROM user WHERE NOT bannedSELECT * FROM user WHERE banned = 'n' बन जाता है), और आपको अपने आवेदन पक्ष पर बुलियन की बजाय तार मिलते हैं, इसलिए आपकी बूलियन स्थितियां भी बोझिल हो जाती हैं। आपके स्कीमा के साथ काम करने वाले अन्य लोग फ्लैग-जैसे कॉलम नाम देखकर और उन पर बूलियन तर्क का उपयोग करने का प्रयास करेंगे।

-2

मुझे लगता है कि यह मूर्ख है - बस boolean प्रकार का उपयोग करें - यही वह है।

लेकिन ऐसा लगता है कि यह 'शायद' और 'शायद' जैसे "अस्पष्ट" मानों के लिए दरवाजा खुला छोड़ देता है।

+0

तो enum ('y', 'n', 'p', 'm')? :) किसी भी रचनात्मक कारण के रूप में यह क्या है जो लानज़ पहले से साझा कर चुका है उससे अलग है? मैंने कुछ प्रश्नों को पढ़ा है जिसमें यह उल्लेख किया गया है कि enum एक tinyint के विपरीत यह सच/झूठा होने के लिए मजबूर करता है जो 9 की तरह एक मूल्य की अनुमति देगा (जो मुझे लगता है कि अभी भी सच में मूल्यांकन किया गया है)। – Gazillion

+0

'9' का मान 'सत्य' के लिए एक अच्छा प्रतिनिधित्व है, क्योंकि '9'' अपेक्षित के रूप में 'false '' false' है। दूसरी तरफ, 'नहीं' n'' _and_ 'NOT 'y'' _both_' true' हैं, जो कोई समझ नहीं आता है। – lanzz

1

रूप the manual में विस्तार से बताया:

आप एक ENUM में एक अमान्य मान (जो की अनुमति दी मानों की सूची में एक स्ट्रिंग मौजूद नहीं है,) सम्मिलित हैं, तो खाली स्ट्रिंग एक विशेष त्रुटि के रूप में के बजाय डाला जाता है मूल्य। इस स्ट्रिंग को "सामान्य" खाली स्ट्रिंग से इस तथ्य से अलग किया जा सकता है कि इस स्ट्रिंग में संख्यात्मक मान 0 है। गणना मूल्यों के लिए संख्यात्मक अनुक्रमणिका के विवरण के लिए Section 11.4.4, “ Index Values for Enumeration Literals ” देखें।

यदि सख्त SQL मोड सक्षम है, तो अमान्य ENUM मानों को सम्मिलित करने का प्रयास एक त्रुटि में होता है।

इस संबंध में, ENUMBOOLEAN प्रकार के विभिन्न व्यवहार में परिणाम देता है; अन्यथा मैं @lanzz's answer से सहमत होने के इच्छुक हूं कि यह किसी के आवेदन के साथ एकीकरण करता है जो थोड़ा कम प्रत्यक्ष होता है।

0

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

कि कहा के साथ

, enum मामूली MySQL सटीक है, लेकिन कुछ enum के बराबर आसानी से अन्य डीबीएमएस में बनाया जा सकता है:

CREATE TABLE ... 
(
    ... 
    FlagColumn CHAR(1) NOT NULL CHECK(FlagColumn IN ('y', 'n')), 
    ... 
); 

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

तो, मैं enumboolean से अधिक स्वचालित रूप से उपयोग की निंदा नहीं करता, लेकिन यह बूलियन झंडे के लिए boolean का उपयोग करना बेहतर है।

संबंधित मुद्दे