डेटाबेस में स्टोरिंग लिंग (लिंग)


130

मैं डेटाबेस में उपयोगकर्ता के लिंग को यथासंभव कम (आकार / प्रदर्शन) लागत के साथ संग्रहीत करना चाहता हूं।

अब तक, 3 परिदृश्य दिमाग में आते हैं

  1. इंट - कोड में एनम के साथ संरेखित (1 = पुरुष, 2 = महिला, 3 = ...)
  2. चार (1) - स्टोर मी , एफ या एक और एकल चरित्र पहचानकर्ता
  3. बिट (बूलियन) - क्या इस विकल्प के लिए एक उपयुक्त फ़ील्ड नाम है?

मेरे द्वारा पूछे जाने वाले कारण इस उत्तर के कारण है जिसमें उल्लेख किया गया है कि चार्ट बुलियन से छोटे हैं ।

मैं स्पष्ट करना चाहिए कि मैं एमएस एसक्यूएल 2008, जो उपयोग कर रहा हूँ करता है वास्तव में थोड़ा डेटाप्रकार है।


1
FWIW, जो SO प्रश्न आपने संदर्भित किया है, यह बताता है कि .NET इन प्रकारों को मेमोरी में कैसे दर्शाता है। इसका SQL सर्वर से प्रतिनिधित्व कैसे होता है, इससे कोई लेना-देना नहीं है। बिट <= चार। msdn.microsoft.com/en-us/library/ms177603.aspx
मैट

1
क्या आप के लिए लिंग क्षेत्र का उपयोग कर रहे हैं? क्या यह सिर्फ एक तार हो सकता है, इसलिए लोग जो चाहें उसे दर्ज कर सकते हैं? इस सवाल पर सभी संभावित प्रतिक्रियाओं को मानने की कोशिश मुश्किल होने वाली है।
shogged

@ ThePassenger: मुझे लगता है कि सामान्य विकल्प मूल रूप से m / f / अन्य है, इसलिए हाँ जैसा कि आपको सुझाव है ठीक है। आप "अनिर्दिष्ट" से "अन्य" को अलग करना चाह सकते हैं (जैसा कि "मैं नहीं बता रहा हूं", और / या "हमने उपयोगकर्ता से अभी तक नहीं पूछा है")। मुझे लिंग-द्रव के बारे में पता नहीं है, जो एक स्लाइडर के साथ फ्लोटिंग-पॉइंट मूल्य चाहते हैं जो वे हर दिन सेट कर सकते हैं; मेरा अनुमान है कि उनमें से अधिकांश (और अन्य गैर-पारंपरिक रूप से लिंग वाले लोग) लगभग किसी भी वेबसाइट पर "अन्य" या "अनिर्दिष्ट" लेने के लिए खुश होंगे। लेकिन नहीं, मुझे नहीं लगता कि "लिंग" के बजाय "सेक्स" के लिए पूछना एक अच्छा विचार होगा।
पीटर कॉर्ड्स

1
@PeterCordes मुझे "लिंग-द्रव" के बारे में अच्छी तरह से जानकारी नहीं है, मेरे गाँव में आपके पुरुष, महिला या गाय हैं। यदि शैली अब तरल है, तो कंप्यूटर की आवाज़ के लिए मान का एक पैमाना बनाना थोड़ा बहुत अधिक लगता है। मेरे देश में हम सेक्स के लिए कहते हैं, यह कम जटिल है। ओह, विश्वास नहीं करते कि हम पाषाण युग में हैं अब तक, एह! हमने पहले से ही भगवान की खोज कर ली है और हम पिछले उपनिवेश के बाद से सबसे अधिक भाग के लिए एकेश्वरवादी हैं।
मोनिका

2
@PeterCordes: वर्तमान राजनीतिक माहौल में ऐसी चीजों की मांग करना लोगों को दूसरों पर प्रभुत्व प्रदान करने से लाभ देगा, जैसे ही आप एक फ्लोट-वैल्यू स्लाइडर शामिल करते हैं, कोई बहुआयामी की मांग करते हुए आगे आएगा। "सिर्फ एक स्लाइडर? क्या आप पाषाण युग में हैं?"
vsz

जवाबों:


82

मैं कॉलम को "लिंग" कहूंगा।

Data Type   Bytes Taken          Number/Range of Values
------------------------------------------------
TinyINT     1                    255 (zero to 255)
INT         4            -       2,147,483,648 to 2,147,483,647
BIT         1 (2 if 9+ columns)  2 (0 and 1)
CHAR(1)     1                    26 if case insensitive, 52 otherwise

बीआईटी डेटा प्रकार की संभावना से इनकार किया जा सकता है क्योंकि यह केवल दो संभव लिंगों जो अपर्याप्त है समर्थन करता है। जबकि INT दो से अधिक विकल्पों का समर्थन करता है, यह 4 बाइट्स लेता है - एक छोटे / अधिक संकीर्ण डेटा प्रकार के साथ प्रदर्शन बेहतर होगा।

CHAR(1)TinyINT पर बढ़त है - दोनों समान संख्या में बाइट्स लेते हैं, लेकिन CHAR मानों की अधिक संकीर्ण संख्या प्रदान करता है। उपयोग CHAR(1)करने से "m", "f", आदि प्राकृतिक कुंजियों का उपयोग होता है, जो कि संख्यात्मक डेटा का उपयोग बनाम जिसे सरोगेट (कृत्रिम कुंजी) कहा जाता है। CHAR(1)किसी भी डेटाबेस पर भी समर्थित है, क्या पोर्ट की आवश्यकता होनी चाहिए।

निष्कर्ष

मैं विकल्प 2: CHAR (1) का उपयोग करूंगा।

परिशिष्ट

लिंग स्तंभ पर एक अनुक्रमणिका संभवत: मदद नहीं करेगी क्योंकि कम हृदय स्तंभ पर एक सूचकांक में कोई मूल्य नहीं है। मतलब, किसी भी मूल्य को प्रदान करने के लिए सूचकांक के मूल्यों में पर्याप्त विविधता नहीं है।


प्रदर्शन का कोई संदर्भ? मुझे पता है कि यह लगभग सूक्ष्म-अनुकूलन है जो मुझे नहीं करना चाहिए, लेकिन यह मेरे जिज्ञासु दिमाग का भोजन है।
मार्को

धन्यवाद @OMG पॉनीज़, प्रदर्शन के बारे में क्या? क्या इस मामले में एक बिट की तुलना में एक चार्ट सबसे महंगा होगा?
मार्को

4
@ मार्को: जैसे मैंने पहले कहा था, वे बराबर हैं। लेकिन एक इंडेक्स संभावना की मदद नहीं करेगा क्योंकि कम कार्डिनैलिटी कॉलम पर एक इंडेक्स में कोई मूल्य नहीं है। मतलब, किसी भी मूल्य को प्रदान करने के लिए सूचकांक के मूल्यों में पर्याप्त विविधता नहीं है।
ओएमजी पोनीज

1
प्रदर्शन कितना बेहतर है वास्तव में , 64-बिट प्लेटफ़ॉर्म पर 4 बाइट डेटा प्रकार का उपयोग करने वाला है? बस कह रहा हूँ; ;-)
क्रेग

1
मैं थोड़ा के साथ रहना होगा, क्योंकि केवल दो लिंग हैं। हालाँकि, ओपी का प्रारंभिक प्रश्न यह है: स्तंभ नाम क्या होगा? "इस्माले" या "इस्फ़ेबेल" थोड़ा अजीब है ...
फेलिप

180

इसके लिए पहले से ही एक आईएसओ मानक है; अपनी खुद की योजना का आविष्कार करने की आवश्यकता नहीं है:

http://en.wikipedia.org/wiki/ISO_5218

मानक के अनुसार, कॉलम को "सेक्स" कहा जाना चाहिए और 'निकटतम' डेटा प्रकार एक CHECK बाधा या लुकअप तालिका के साथ उपयुक्त होगा।


4
यह 'लागू नहीं' के लिए 9 पर क्यों छोड़ता है? 3-8 के बारे में क्या?
केनमोर

4
यह सेक्स के लिए है। ओपी ने विशेष रूप से लिंग के लिए कहा। लिंग और लिंग के अलग-अलग संभावित मूल्य हैं जिन्हें पकड़ने की आवश्यकता हो सकती है।
इंडिगोचाइल्ड

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

1
यह स्वीकृत उत्तर होना चाहिए। यह अनुकूलन के बजाय डेटा अखंडता (जो हमेशा के लिए ~ है) पर केंद्रित है (जो स्थितिजन्य है)।
पॉल कैंटरेल

1
इसका उत्तर निश्चित रूप से होना चाहिए। @PeterCordes इस ISO का उपयोग सेक्स के लिए किया जाता है (जैविक सेक्स) और न ही लिंग (जिसे आप पहचानते हैं) - यहाँ स्पष्टीकरण । मैं लिंग को स्टोर करने की इच्छा के मामले में अनुमान लगाता हूं (जो, मुझे नहीं पता होगा कि आप इसका क्या उपयोग कर रहे हैं), एक छोटा सा इंट अभी भी काफी अच्छा है जब तक आप 255 से कम लिंग को स्टोर करना चाहते हैं (fe 0 कह कर) = अज्ञात / घोषित करने की इच्छा नहीं, 1 = पुरुष, 2 = महिला, 3 = पुरुष महिला के रूप में पहचान, आदि)
सॉलिडटायर

43

चिकित्सा में चार लिंग हैं: पुरुष, महिला, अनिश्चित, और अज्ञात। आपको सभी चार की आवश्यकता नहीं हो सकती है, लेकिन आपको निश्चित रूप से 1, 2, और 4 की आवश्यकता है। इस डेटाटाइप के लिए डिफ़ॉल्ट मान होना उचित नहीं है। यहां तक ​​कि इसे बूलियन के रूप में 'इज़' है और 'इज़ नॉट' स्टेट्स।


1
@ ईजेपी, दिलचस्प। क्या आपके पास इसका संदर्भ है?
मार्को

11
मेरे पिता, एमडी बीएस FRACP।
लोर्ने

इस जानकारी के आधार पर, मैं TinyIntएक एनम के साथ गठबंधन करूंगा (जैसा कि ह्यूगो सुझाव देता है) और कम से कम 1, 2, और 3 (अन्य) के साथ जाना होगा।
आइएब्रेटी

1
@ ईजेपी, हालांकि आपका उत्तर शायद सही है, लेकिन यह नहीं कहता कि मुझे क्या डेटाटाइप का उपयोग करना चाहिए, बल्कि - तकनीकी रूप से सही लिंग क्या हैं।
मार्को

17
यूके नेशनल हेल्थ सर्विस (एनएचएस) डेटा शब्दकोश चार मूल्यों को परिभाषित करता है: 0 = Not Known, 1 = Male, 2 = Female, 9 = Not Specified, जो आईएसओ 5218 मूल्यों को मिटा देता है । ध्यान दें कि दो प्रकार हैं : पंजीकरण के समय लिंग (आमतौर पर जन्म के कुछ समय बाद) और वर्तमान।
onedaywhen

3

एक Int(या TinyInt) एक Enumक्षेत्र के लिए गठबंधन मेरी पद्धति होगी।

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

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

तीसरा, संदर्भात्मक अखंडता को लागू करने के लिए, के लिए एक लुकअप तालिका बनाने के लिए एक संख्यात्मक मान बहुत आसान (और बेहतर अभ्यास) है, और एक एनम के साथ 1-टू -1 को सहसंबंधित कर सकता है, इसलिए स्मृति में मान को संग्रहीत करने में समानता है आवेदन या डेटाबेस में।


2

मैं char 'f', 'm' और 'u' का उपयोग करता हूं क्योंकि मैं लिंग का नाम, आवाज और बातचीत से पता लगाता हूं, और कभी-कभी लिंग को नहीं जानता। अंतिम निर्धारण उनकी राय है।

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


विषय पर नहीं। इसका जवाब नहीं है।
विभागाध्यक्ष

1

विकल्प 3 आपका सबसे अच्छा दांव है, लेकिन सभी DB इंजन में "बिट" प्रकार नहीं है। यदि आपके पास एक बिट नहीं है, तो टाइनीनेट आपका सबसे अच्छा दांव होगा।


-5
CREATE TABLE Admission (
    Rno INT PRIMARY KEY AUTO_INCREMENT,
    Name VARCHAR(25) NOT NULL,
    Gender ENUM('M','F'),
    Boolean_Valu boolean,
    Dob Date,
    Fees numeric(7,2) NOT NULL
);




insert into Admission (Name,Gender,Boolean_Valu,Dob,Fees)values('Raj','M',true,'1990-07-12',50000);
insert into Admission (Name,Gender,Boolean_Valu,Dob,Fees)values('Rani','F',false,'1994-05-10',15000);
select * from admission;

यहाँ लिंक विवरण दर्ज करें


-5

मैं विकल्प 3 के साथ जाऊंगा, लेकिन एक के बजाय कई गैर पूर्ण बिट कॉलम। इस्माले (1 = हाँ / 0 = नहीं) इसफ़ेबेलियन (1 = हाँ / 0 = नहीं)

यदि पुन: दावा किया जाता है: IsUnognGender (1 = हां / 0 = नहीं) और इसी तरह ...

यह परिभाषाओं की आसान रीडिंग, आसान एक्स्टेंसिबिलिटी, आसान प्रोग्रामबिलिटी, डोमेन के बाहर के मूल्यों का उपयोग करने की कोई संभावना नहीं बनाता है और मूल्यों को लॉक करने के लिए दूसरी लुकअप टेबल + FK या CHECK बाधाओं की कोई आवश्यकता नहीं है।

संपादित करें: सुधार, सेट झंडे मान्य हैं यह सुनिश्चित करने के लिए आपको कम से कम एक बाधा की आवश्यकता है।


यह सुनकर अच्छा लगेगा कि मेरा जवाब क्यों कम हो जाता है?
हंसलेंडग्रेन

बाधाओं के बिना, कुछ भी सभी स्तंभों को 1 होने से रोकता है, या उन सभी को 0. होने से रोकता है।
जे कोमिनेक

हां, आप सही हैं कि आपको यह जांचने के लिए एक बाधा की आवश्यकता है कि सही संख्या में झंडे 'चेक' किए गए हैं। मुझे नहीं लगता कि सभी वोट उस चूक के लिए हैं ...
हंसलेंडग्रेन

यह एक बहुत बड़ा दौरा किया गया सवाल है (कुछ अन्य उत्तरों के लिए upvotes पर गौर करें!), और आप वर्षों बाद साथ आए और एक जवाब मिला कि एक-एक गर्म एन्कोडिंग की मात्रा, एक व्यापक रूप से सिखाई गई तकनीक है, जिसका कोई मतलब भी नहीं है। कुछ ठोस गुण जो आप इसका श्रेय देते हैं। मुझे नहीं लगता कि आपको 0 से नीचे वोट देना सही था, लेकिन मुझे आश्चर्य नहीं है कि ऐसा हुआ।
Jay Kominek
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.