การจัดเก็บเพศ (เพศ) ในฐานข้อมูล


130

ฉันต้องการจัดเก็บเพศของผู้ใช้ในฐานข้อมูลโดยมีต้นทุน (ขนาด / ประสิทธิภาพ) น้อยที่สุด

จนถึงตอนนี้มี 3 สถานการณ์อยู่ในใจ

  1. Int - สอดคล้องกับ Enum ในรหัส (1 = ชาย, 2 = หญิง, 3 = ... )
  2. ถ่าน (1) - เก็บm , fหรือตัวระบุอักขระเดี่ยวอื่น
  3. บิต (บูลีน) - มีชื่อฟิลด์ที่เหมาะสมสำหรับตัวเลือกนี้หรือไม่?

เหตุผลที่ฉันถามเป็นเพราะคำตอบนี้ซึ่งระบุว่าตัวอักษรมีขนาดเล็กกว่าบูลี

ฉันควรจะชี้แจงว่าฉันใช้ MS SQL 2008 ซึ่งไมในความเป็นจริงมีประเภทข้อมูลบิต


1
FWIW คำถามที่คุณอ้างถึงนั้นอ้างถึงว่า. NET แสดงถึงประเภทเหล่านี้ในหน่วยความจำอย่างไร ไม่มีส่วนเกี่ยวข้องกับการที่ SQL Server แสดงถึงสิ่งเหล่านี้ บิต <= ถ่าน msdn.microsoft.com/en-us/library/ms177603.aspx
Matt

1
คุณใช้ช่องเพศเพื่ออะไร มันเป็นเพียงสตริงเพื่อให้ผู้คนป้อนสิ่งที่พวกเขาชอบ การพยายามระบุคำตอบที่เป็นไปได้ทั้งหมดสำหรับคำถามนี้จะเป็นเรื่องยุ่งยาก
โยกย้าย

@ThePassenger: ฉันคิดว่าตัวเลือกปกติโดยทั่วไปคือ m / f / other ดังนั้นใช่ ternary อย่างที่คุณแนะนำก็ดี คุณอาจต้องการแยก "อื่น ๆ " ออกจาก "ไม่ระบุ" (เช่น "ฉันไม่ได้บอก" และ / หรือ "เรายังไม่ได้ถามผู้ใช้") ฉันไม่ทราบว่าคนเพศสภาพต้องการค่าทศนิยมที่มีแถบเลื่อนที่สามารถตั้งค่าได้ทุกวัน ฉันเดาว่าพวกเขาส่วนใหญ่ (และคนอื่น ๆ ที่ไม่ได้เพศตามประเพณี) ยินดีที่จะเลือก "อื่น ๆ " หรือ "ไม่ระบุ" ในเกือบทุกเว็บไซต์ แต่เปล่าเลยฉันไม่คิดว่าการขอ "sex" แทน "gender" จะเป็นความคิดที่ดี
Peter Cordes

1
@PeterCordes ฉันไม่รู้จัก "เพศ - ของเหลว" ในหมู่บ้านของฉันทั้งชายหญิง ... หรือวัว หากแนวเพลงตอนนี้ลื่นไหลการสร้างขนาดของมูลค่าสำหรับเสียงของคอมพิวเตอร์ดูเหมือนจะน้อยเกินไปที่จะถาม ในประเทศของฉันเราค่อนข้างขอเรื่องเซ็กส์มันซับซ้อนน้อยกว่า โอ้ไม่น่าเชื่อว่าเราอยู่ในยุคหินแล้วเอ๊ะ! เราได้ค้นพบพระเจ้าแล้วและเราเป็นผู้ที่มีความคิดเชิงเดี่ยวเป็นส่วนใหญ่นับตั้งแต่การล่าอาณานิคมครั้งสุดท้าย
Revolucion for Monica

2
@PeterCordes: เนื่องจากการเรียกร้องสิ่งต่างๆเช่นนี้ในบรรยากาศทางการเมืองในปัจจุบันจะทำให้ผู้คนได้เปรียบโดยให้พวกเขามีอำนาจเหนือผู้อื่นทันทีที่คุณใส่แถบเลื่อนที่มีค่าลอยตัวจะมีคนออกมาเรียกร้องให้มีหลายมิติ "แค่สไลเดอร์ตัวเดียวเหรอคุณอยู่ในยุคหิน"
vsz

คำตอบ:


83

ฉันเรียกคอลัมน์นี้ว่า "gender"

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

BITชนิดข้อมูลสามารถปกครองออกเพราะสนับสนุนเพียงสองเพศที่เป็นไปได้ที่ไม่เพียงพอ แม้ว่าINTรองรับมากกว่าสองตัวเลือก แต่ก็ใช้เวลา 4 ไบต์ - ประสิทธิภาพจะดีขึ้นเมื่อใช้ประเภทข้อมูลที่เล็กลง / แคบกว่า

CHAR(1)มีขอบเหนือTinyINT - ทั้งสองใช้จำนวนไบต์เท่ากัน แต่ CHAR ให้จำนวนค่าที่แคบกว่า การใช้CHAR(1)จะทำให้ใช้ "m", "f" ฯลฯ คีย์ธรรมชาติเทียบกับการใช้ข้อมูลตัวเลขซึ่งเรียกว่าคีย์แทน / คีย์เทียม CHAR(1)ได้รับการสนับสนุนบนฐานข้อมูลใด ๆ หากจำเป็นต้องพอร์ต

ข้อสรุป

ฉันจะใช้ตัวเลือกที่ 2: CHAR (1)

ภาคผนวก

ดัชนีในคอลัมน์เพศน่าจะไม่ช่วยได้เนื่องจากไม่มีค่าในดัชนีในคอลัมน์คาร์ดินาลลิตี้ต่ำ ความหมายมีค่าไม่หลากหลายเพียงพอสำหรับดัชนีที่จะให้ค่าใด ๆ


มีการอ้างอิงถึงประสิทธิภาพหรือไม่? ฉันรู้ว่ามันเกือบจะเป็นการเพิ่มประสิทธิภาพระดับไมโครซึ่งฉันไม่ควรทำ แต่มันเป็นอาหารสำหรับจิตใจที่อยากรู้อยากเห็นของฉัน
Marko

ขอบคุณ @OMG Ponies แล้วการแสดงล่ะ? ถ่านจะมีราคาแพงที่สุดในกรณีนี้หรือไม่?
Marko

4
@Marko: อย่างที่เคยบอกไปว่ามันเท่ากัน แต่ดัชนีไม่น่าจะช่วยได้เนื่องจากไม่มีค่าในดัชนีในคอลัมน์ที่มีจำนวนสมาชิกต่ำ ความหมายมีค่าไม่หลากหลายเพียงพอสำหรับดัชนีที่จะให้ค่าใด ๆ
OMG Ponies

1
วิธีที่ดีมากเป็นผลการดำเนินงานจริงจะต้องใช้การพูด, 4 ไบต์ชนิดข้อมูลบนแพลตฟอร์ม 64 บิต? แค่บอกว่า ... ;-)
Craig

1
ฉันจะยึดติดกับบิตเพราะมีเพียงสองเพศ อย่างไรก็ตามคำถามเริ่มต้นของ OP ยังคงอยู่: ชื่อคอลัมน์คืออะไร? "IsMale" หรือ "IsFemale" ค่อนข้างแปลก ...
Mateus Felipe

180

มีมาตรฐาน ISO สำหรับสิ่งนี้อยู่แล้ว ไม่จำเป็นต้องคิดค้นโครงร่างของคุณเอง:

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

ตามมาตรฐานคอลัมน์ควรมีชื่อว่า "Sex" และประเภทข้อมูลที่ "ใกล้เคียงที่สุด" จะมีขนาดเล็กโดยมีข้อ จำกัด ในการตรวจสอบหรือตารางการค้นหาตามความเหมาะสม


4
เหตุใดจึงข้ามไปที่ 9 เพราะ "ใช้ไม่ได้" แล้ว 3-8 ล่ะ?
Kenmore

4
นี่คือเรื่องเซ็กส์ OP ถามเฉพาะเพศ เพศและเพศมีแนวโน้มที่จะมีค่านิยมที่แตกต่างกันซึ่งอาจจำเป็นต้องได้รับการยอมรับ
indigochild

2
@indigochild OP ใช้ทั้งสองคำในชื่อคำถามและเห็นได้ชัดว่าคำเหล่านี้เทียบเท่ากันอย่างน้อยก็สำหรับกรณีการใช้งานของเขา (YMMV) ประเด็นของฉันก็คือมาตรฐาน ISO มีอยู่ในพื้นที่นี้และคุณไม่ควรเสียเวลาไปกับการวางแผนโครงการของคุณเองเมื่อมีมาตรฐานอย่างเป็นทางการ เว้นแต่ว่ามาตรฐานนั้นไม่ครอบคลุมกรณีเฉพาะของคุณซึ่งเป็นไปได้ทั้งหมด
Pondlife

1
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ เน้นที่ความสมบูรณ์ของข้อมูล (ซึ่งเป็น ~ ตลอดไป) แทนที่จะเป็นการเพิ่มประสิทธิภาพ (ซึ่งเป็นสถานการณ์)
Paul Cantrell

1
นี่น่าจะเป็นคำตอบแน่นอน @PeterCordes ISO นี้จะใช้สำหรับเพศ (เพศสัมพันธ์ทางชีวภาพ) และไม่ใช่เพศ (สิ่งที่คุณระบุได้ว่าเป็น) - คำอธิบายที่นี่ ฉันเดาว่าในกรณีที่ต้องการจัดเก็บเพศ (ซึ่งฉันไม่รู้ว่าคุณใช้วิธีใด) int เล็ก ๆ ยังดีพอตราบเท่าที่คุณต้องการจัดเก็บเพศน้อยกว่า 255 (โดยพูดว่า fe 0 = ไม่ทราบ / ไม่ต้องการประกาศ 1 = ชาย 2 = หญิง 3 = ผู้ชายระบุว่าเป็นผู้หญิง ฯลฯ )
SolidTerre

43

ในยามีสี่เพศ: ชายหญิงไม่ทราบแน่ชัดและไม่ทราบสาเหตุ คุณอาจไม่ต้องการทั้งสี่ แต่คุณต้องการ 1, 2 และ 4 อย่างแน่นอนไม่เหมาะสมที่จะมีค่าเริ่มต้นสำหรับประเภทข้อมูลนี้ แม้แต่น้อยที่จะถือว่าเป็นบูลีนด้วยสถานะ 'is' และ 'not'


1
@EJP น่าสนใจ คุณมีการอ้างอิงถึงสิ่งนี้หรือไม่?
Marko

11
พ่อของฉัน MD BS FRACP
Marquis of Lorne

จากข้อมูลนี้ฉันจะTinyIntจัดให้สอดคล้องกับ enum (ตามที่ Hugo แนะนำ) และไปกับอย่างน้อย 1, 2, และ 3 (อื่น ๆ )
IAbstract

1
@EJP แม้ว่าคำตอบของคุณอาจจะถูกต้อง แต่ก็ไม่ได้บอกว่าฉันควรใช้ประเภทข้อมูลใด แต่ - เพศที่ถูกต้อง (ทางเทคนิค) คืออะไร
Marko

17
สหราชอาณาจักรบริการสุขภาพแห่งชาติ (NHS) พจนานุกรมข้อมูลกำหนดสี่ค่า: 0 = Not Known1 = Male2 = Female9 = Not Specifiedซึ่ง mirrow ISO 5218ค่า โปรดทราบว่ามีสองประเภท : เพศที่จดทะเบียน (โดยปกติไม่นานหลังจากเกิด) และปัจจุบัน
onedaywhen

3

Int(หรือTinyInt) สอดคล้องไปยังEnumสนามจะเป็นวิธีการของฉัน

อันดับแรกหากคุณมีbitฟิลด์เดียวในฐานข้อมูลแถวจะยังคงใช้ไบต์เต็มดังนั้นเท่าที่ประหยัดพื้นที่จะจ่ายก็ต่อเมื่อคุณมีหลายbitฟิลด์

ประการที่สองสตริง / ตัวอักษรมีความรู้สึก "มหัศจรรย์" สำหรับพวกเขาไม่ว่าจะดูชัดเจนเพียงใดในเวลาออกแบบ ไม่ต้องพูดถึงมันช่วยให้ผู้คนสามารถจัดเก็บมูลค่าใด ๆ ที่พวกเขาไม่จำเป็นต้องจับคู่กับสิ่งที่ชัดเจน

ประการที่สามค่าตัวเลขนั้นง่ายกว่ามาก (และแนวทางปฏิบัติที่ดีกว่า) ในการสร้างตารางการค้นหาเพื่อบังคับใช้ความสมบูรณ์ของการอ้างอิงและสามารถเชื่อมโยง 1 ต่อ 1 กับ enum ได้ดังนั้นจึงมีความเท่าเทียมกันในการจัดเก็บค่าในหน่วยความจำภายใน แอปพลิเคชันหรือในฐานข้อมูล


2

ฉันใช้ถ่าน 'f', 'm' และ 'u' เพราะฉันคาดเดาเพศจากชื่อเสียงและบทสนทนาและบางครั้งก็ไม่รู้เพศ ความมุ่งมั่นสุดท้ายคือความคิดเห็นของพวกเขา

ขึ้นอยู่กับว่าคุณรู้จักบุคคลนั้นดีเพียงใดและเกณฑ์ของคุณเป็นรูปแบบทางกายภาพหรือเอกลักษณ์ส่วนบุคคล นักจิตวิทยาอาจต้องการตัวเลือกเพิ่มเติมเช่นข้ามเป็นหญิงข้ามเพศชายแปลงเพศเป็นหญิงเปลี่ยนเพศเป็นชายกระเทยและยังไม่แน่ใจ ด้วยตัวเลือก 9 ตัวที่ไม่ได้กำหนดไว้อย่างชัดเจนด้วยอักขระตัวเดียวฉันอาจใช้คำแนะนำของ Hugo เกี่ยวกับจำนวนเต็มเล็ก ๆ


ไม่อยู่ในหัวข้อ มันไม่ใช่คำตอบ
ฮอด

1

ตัวเลือกที่ 3 เป็นทางออกที่ดีที่สุดของคุณ แต่เครื่องมือ DB บางตัวอาจไม่มีประเภท "บิต" หากคุณไม่มีบิต TinyINT จะเป็นทางออกที่ดีที่สุดของคุณ


-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 แต่มีคอลัมน์บิตที่ไม่เป็นโมฆะหลายคอลัมน์แทนที่จะเป็นคอลัมน์เดียว IsMale (1 = ใช่ / 0 = ไม่ใช่) IsFemale (1 = ใช่ / 0 = ไม่ใช่)

ถ้า requried: IsUnknownGender (1 = Yes / 0 = No) และอื่น ๆ ...

ทำให้ง่ายต่อการอ่านคำจำกัดความความสามารถในการขยายที่ง่ายความสามารถในการตั้งโปรแกรมที่ง่ายไม่มีความเป็นไปได้ในการใช้ค่าภายนอกโดเมนและไม่จำเป็นต้องมีตารางการค้นหาที่สอง + ข้อ จำกัด FK หรือ CHECK เพื่อล็อกค่า

แก้ไข: การแก้ไขคุณต้องมีข้อ จำกัด อย่างน้อยหนึ่งข้อเพื่อให้แน่ใจว่าแฟล็กชุดนั้นถูกต้อง


คงจะดีไม่น้อยเมื่อได้ยินว่าทำไมคำตอบของฉันจึงถูกโหวตลง?
HansLindgren

หากไม่มีข้อ จำกัด ไม่มีสิ่งใดที่ป้องกันไม่ให้คอลัมน์ทั้งหมดเป็น 1 หรือทั้งหมดไม่ให้เป็น 0 ซึ่งจะไร้สาระดังนั้นโครงการของคุณจึงไม่เป็นไปตามข้อเรียกร้องของคุณ
Jay Kominek

ใช่คุณคิดถูกที่คุณต้องมีข้อ จำกัด อย่างหนึ่งเพื่อตรวจสอบว่า 'ตรวจสอบจำนวนแฟล็ก' ที่ถูกต้องแล้ว ฉันไม่คิดว่าการโหวตลงทั้งหมดเป็นไปเพื่อการละเว้นนั้น ...
HansLindgren

เป็นคำถามที่เข้าชมเป็นจำนวนมาก (ดูการโหวตเพิ่มสำหรับคำตอบอื่น ๆ !) และคุณมาหลายปีต่อมาและเพิ่มคำตอบที่มีการเข้ารหัสเพียงครั้งเดียวซึ่งเป็นเทคนิคที่สอนกันอย่างแพร่หลายซึ่งไม่มีแม้แต่ คุณสมบัติที่เป็นรูปธรรมเพียงไม่กี่อย่างที่คุณอ้างถึง ฉันไม่คิดว่าถูกต้องที่จะโหวตให้คุณต่ำกว่า 0 แต่ฉันก็ไม่แปลกใจที่มันเกิดขึ้นเช่นกัน
Jay Kominek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.