INT या CHAR एक प्रकार के क्षेत्र के लिए


19

एक मेज के लिए सबसे अच्छा डिजाइन क्या है, एक Typeक्षेत्र जो intया का है char(1)? दूसरे शब्दों में, यह स्कीमा दिया गया है:

create table Car
(
    Name varchar(100) not null,
    Description varchar(100) not null,
    VehType .... not null
)

यह VehTypeएक intया एक होने के लिए अधिक कुशल (प्रदर्शन वार) है char(1)? कहो कि आपके पास पाँच प्रकार की कारें हैं, क्या आपको प्रकारों के लिए 0 -> 4, या वर्णों का उपयोग करना चाहिए (जैसे? 'V', 's', 'c', 't', 'm')?

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

मुझे लगता है कि sys.objectsसूची दृश्य typeक्षेत्र के लिए एक चरित्र का उपयोग करता है । क्या इसका कोई कारण है? क्या मैं यहाँ सिर्फ पतली हवा में हूँ, और क्या यह वह है जिसके साथ मैं अधिक सहज हूँ?

जवाबों:


20

आप आमतौर पर छोटे बाइट का उपयोग करते हैं जो कि 1 बाइट भी है

  • चार (1) थोड़ा धीमा होगा क्योंकि तुलना करने से टकराव का उपयोग होता है

  • भ्रम: एस क्या है: एसयूवी या सैलून या सेडान या स्पोर्ट्स?

  • जब आप अधिक प्रकार जोड़ते हैं तो पत्र का उपयोग करना आपको सीमित कर देता है। अंतिम बिंदु देखें

  • मैंने देखा है कि हर प्रणाली में एक और ग्राहक है, जैसे रिपोर्टिंग। V, S को "Van", "SUV" आदि में बदलने के तर्क को दोहराया जाना चाहिए। लुकअप टेबल का उपयोग करने का मतलब है कि यह एक सरल जॉय है

  • विस्तार क्षमता: " फ्लाइंग कार " के लिए एक और प्रकार ("एफ" जोड़ें ) आप एक लुकअप टेबल पर एक पंक्ति या बहुत सारे कोड और बाधाओं को बदल सकते हैं। और आपका क्लाइंट कोड भी क्योंकि यह जानना होगा कि वी, एस, एफ आदि क्या हैं

  • रखरखाव: तर्क 3 स्थानों पर है: डेटाबेस की कमी, डेटाबेस कोड और क्लाइंट कोड। एक खोज और विदेशी कुंजी के साथ, यह एक ही स्थान पर हो सकता है

एक अक्षर का उपयोग करने के साथ-साथ ... एर, कोई भी नहीं देखें

नोट: Enums के बारे में एक संबंधित MySQL सवाल है । सिफारिश यह है कि वहां लुकअप टेबल का भी इस्तेमाल किया जाए।


2
महान बिंदु। यह मुझे आश्चर्यचकित करता है कि क्यों लोग चार (1) (जैसे sys.objects) का उपयोग करते हैं।
थॉमस स्ट्रिंगर

2
sys.objects में Sybase और SQL Server के शुरुआती संस्करणों में जाने वाली एक विरासत है। en.wikipedia.org/wiki/Microsoft_SQL_Server#Genesis यदि आप सिस्टम ऑब्जेक्ट को देखते हैं तो आप उन सभी कोडों को देख सकते हैं: जो नए डीएमवी में आईडी को कम करते हैं। एमएस को छोड़कर अन्य लोक के लिए के रूप में? RDBMS के बारे में सोचें न कि OO / Enums और यह लुकअप का उपयोग करने के लिए समझ में आता है।
gbn

1
ठीक है मुझे स्वीकार है। स्पष्ट करने के लिए धन्यवाद। तो क्या यह एक बहुत सटीक कथन है कि संबंधपरक अखंडता और लुकअप टेबल के साथ कोई वास्तविक ओवर-इंजीनियरिंग नहीं है? मेरा मतलब है, इस मामले में एक लुकअप तालिका में एक मुट्ठी भर रिकॉर्ड रखने और उन्हें एक उपभोग्य तालिका में संदर्भित करने से, क्या पिछला कथन सही होगा?
थॉमस स्ट्रिंजर

1
@onedaywhen: यह एक अंतर बनाता है कि आप विभिन्न प्रकारों को डेटा के रूप में या मूल्यों के स्थिर सेट के रूप में देखते हैं जो कभी नहीं बदलेंगे। यदि आप एक प्रकार की तालिका का उपयोग करते हैं, तो आप डेटाबेस में और एप्लिकेशन में व्यावसायिक नियमों को बदलने की आवश्यकता के बिना तालिका में एक और प्रकार जोड़ सकते हैं।
गुफ़ा २०'११

1
@ माइकलकॉर्जलिंग: सही है, अगर यह सिर्फ एक कुंजी थी। लेकिन ओपी ने इसका मतलब "v" या "s" जैसा कुछ बताया। ध्यान दें, हम मुद्रा कोड (EUR, USD, GBP, CHF इत्यादि) की तरह प्राकृतिक वर्णन और पूर्ण प्राकृतिक कुंजियों के बारे में नहीं हैं।
gbn

3

महान gbn के जवाब के पूरक के रूप में ।

शायद आप ऐसा कुछ बना सकते हैं:

create table dbo.VehicleType
(
    VehicleTypeId int not null primary key,
    Name varchar(50) not null,
    Code char(3) null
) 
go 

create table Car
(
    Name varchar(100) not null,
    Description varchar(100) not null,
    VehTypeId int not null ,
    foreign key FKTypeOfCar(VehTypeId) referenctes dbo.VehicleType (VehicleTypeId) 
)
go 

तो आप कर सकते हैं जैसा कि आप अपने ईनम के साथ संबंधपरक अखंडता (एक विदेशी कुंजी का उपयोग करते हुए) की नकल करते हुए करते हैं। codeकॉलम के साथ आप अपने चार कोड का उपयोग कर सकते हैं, इसलिए यह डेटाबेस पर दस्तावेज बन जाएगा (और आप सिस्टम एकीकरण के लिए एप्लिकेशन कोड पर एक जटिल परिवर्तन के बिना, DB से सीधे कोड जानकारी निकाल सकते हैं)।


क्या आपको nullकोड की अनुमति देने का मतलब है ?
जैक डगलस

हाँ, कोड एक वाहन प्रकार का प्रतिनिधित्व करने की अनुमति देने के लिए वैकल्पिक है जो अभी तक संहिताबद्ध नहीं है।
फैब्रिकियो अरुजो

लोग टिप्पणी हटाना क्यों पसंद करते हैं? बहुत कष्टप्रद है।
फैब्रिकियो अरुजो

@FabricioAraujo - यदि कोई टिप्पणी अप्रचलित है (उदाहरण के लिए "मैं अपने उत्तर में संपादित करूँगा" और फिर आप वास्तव में ऐसा करते हैं) तो उन टिप्पणियों को साफ़ करना अच्छा है जो अब लागू नहीं होती हैं।
निक चम्मास

1
मैं आपके प्रकार तालिका में एक "अवर्गीकृत" प्रकार जोड़ने का सुझाव दूंगा और आपके व्हीकल्सटाइप फ़ील्ड का डिफ़ॉल्ट मान जो कि अवर्गीकृत मूल्य है, बजाय विदेशी कुंजी फ़ील्ड में एक शून्य मान की अनुमति के। आम तौर पर "अशक्त" बनाने के लिए यह एक बुरा व्यवसाय है जिसका एक वैध व्यवसाय अर्थ है।
माइकल ब्लैकबर्न
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.