Menyimpan jenis kelamin (gender) dalam basis data


130

Saya ingin menyimpan jenis kelamin pengguna dalam database dengan biaya (ukuran / kinerja) sesedikit mungkin.

Sejauh ini, 3 skenario muncul dalam pikiran

  1. Int - sejajar dengan Enum dalam kode (1 = Pria, 2 = Wanita, 3 = ...)
  2. char (1) - Simpan m , f atau pengenal karakter tunggal lainnya
  3. Bit (boolean) - apakah ada nama bidang yang sesuai untuk opsi ini?

Alasan saya bertanya adalah karena jawaban ini yang menyebutkan bahwa karakter lebih kecil daripada boolean .

Saya harus menjelaskan bahwa saya menggunakan MS SQL 2008, yang TIDAK memiliki datatype bit.


1
FWIW, pertanyaan SO yang Anda referensikan mengacu pada bagaimana .NET mewakili tipe-tipe ini dalam memori. Itu tidak ada hubungannya dengan bagaimana SQL Server mewakili mereka. bit <= char. msdn.microsoft.com/en-us/library/ms177603.aspx
Matt

1
Untuk apa Anda menggunakan bidang gender? Mungkinkah itu hanya string, sehingga orang dapat memasukkan apa yang mereka suka? Mencoba menghitung semua tanggapan yang mungkin untuk pertanyaan ini akan sulit.
Shogged

@ThePassenger: Saya pikir opsi yang biasa pada dasarnya adalah m / f / lainnya, jadi ya ternary seperti yang Anda sarankan baik-baik saja. Anda mungkin ingin membedakan "lain" dari "tidak ditentukan" (seperti dalam "Saya tidak memberi tahu", dan / atau "kami belum meminta pengguna"). Saya tidak mengetahui orang yang jender-cair yang menginginkan nilai titik-mengambang dengan penggeser yang dapat mereka atur setiap hari; Dugaan saya adalah bahwa kebanyakan dari mereka (dan orang-orang non-tradisional lainnya) akan dengan senang hati memilih "orang lain" atau "tidak ditentukan" di hampir semua situs web. Tapi tidak, saya tidak berpikir meminta "seks" daripada "jenis kelamin" adalah ide yang bagus.
Peter Cordes

1
@PeterCordes Saya tidak begitu menyadari "gender-fluid", di desa saya Anda baik pria, wanita ... atau sapi. Jika genre sekarang cair, menciptakan skala nilai untuk suara komputer tampaknya agak terlalu banyak untuk ditanyakan. Di negara saya, kami lebih memilih untuk berhubungan seks, itu tidak terlalu rumit. Oh, jangan percaya kita berada di Zaman Batu sejauh ini, eh! Kami telah menemukan Tuhan dan kami adalah monoteis untuk sebagian besar sejak penjajahan terakhir.
Revolusi untuk Monica

2
@PeterCordes: karena menuntut hal-hal seperti itu dalam iklim politik saat ini akan memberi manfaat kepada orang-orang dengan memberikan mereka dominasi atas yang lain, segera setelah Anda memasukkan bilah geser nilai mengambang, seseorang akan maju meminta multidimensi. "Hanya satu slider? Apakah kamu di zaman batu?"
vsz

Jawaban:


82

Saya akan menyebut kolom "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

The BIT tipe data dapat dikesampingkan karena hanya mendukung dua jenis kelamin mungkin yang tidak memadai. Sementara INT mendukung lebih dari dua opsi, dibutuhkan 4 byte - kinerja akan lebih baik dengan tipe data yang lebih kecil / lebih sempit.

CHAR(1)memiliki keunggulan atas TinyINT - keduanya mengambil jumlah byte yang sama, tetapi CHAR menyediakan jumlah nilai yang lebih sempit. Menggunakan CHAR(1)akan membuat menggunakan "m", "f", dll kunci alam, vs penggunaan data numerik yang disebut sebagai kunci pengganti / buatan. CHAR(1)juga didukung pada basis data apa pun, jika perlu ada port.

Kesimpulan

Saya akan menggunakan Opsi 2: CHAR (1).

Tambahan

Indeks pada kolom gender kemungkinan tidak akan membantu karena tidak ada nilai dalam indeks pada kolom kardinalitas rendah. Artinya, tidak ada cukup variasi dalam nilai untuk indeks untuk memberikan nilai apa pun.


Ada referensi untuk kinerja? Saya tahu hampir mengoptimalkan mikro yang seharusnya tidak saya lakukan, tetapi ini makanan untuk pikiran penasaran saya.
Marko

Terima kasih @OMG Ponies, bagaimana dengan kinerja? Apakah arang paling mahal daripada sedikit dalam kasus ini?
Marko

4
@ Marko: Seperti yang saya katakan sebelumnya, mereka sama. Tetapi indeks kemungkinan tidak akan membantu karena tidak ada nilai dalam indeks pada kolom kardinalitas rendah. Artinya, tidak ada cukup variasi dalam nilai untuk indeks untuk memberikan nilai apa pun.
OMG Ponies

1
Berapa banyak lebih baik adalah kinerja benar-benar akan menggunakan, katakanlah, tipe data 4 byte pada platform 64-bit? Hanya mengatakan ... ;-)
Craig

1
Saya akan tetap dengan sedikit, karena hanya ada dua jenis kelamin. Namun, pertanyaan awal OP tetap: apa nama kolom itu? "IsMale" atau "IsFemale" sedikit aneh ...
Mateus Felipe

180

Sudah ada standar ISO untuk ini; tidak perlu menemukan skema Anda sendiri:

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

Sesuai standar, kolom harus disebut "Jenis Kelamin" dan tipe data 'terdekat' akan menjadi lebih kecil dengan batasan PERIKSA atau tabel pencarian yang sesuai.


4
Mengapa lompat ke 9 karena 'tidak berlaku'? Bagaimana dengan 3-8?
Kenmore

4
Ini untuk seks. OP secara khusus meminta gender. Jenis kelamin dan gender kemungkinan memiliki nilai yang berbeda yang mungkin perlu ditangkap.
indigochild

2
@indigochild OP menggunakan kedua kata dalam judul pertanyaan dan dengan jelas menganggap mereka setara, setidaknya untuk kasus penggunaannya (YMMV). Maksud saya hanyalah bahwa standar ISO ada di bidang ini dan Anda tidak boleh membuang waktu untuk merancang skema Anda sendiri ketika standar resmi ada. Kecuali tentu saja standar itu tidak mencakup kasus khusus Anda, yang sepenuhnya mungkin.
Pondlife

1
Ini harus menjadi jawaban yang diterima. Ini berfokus pada integritas data (yang ~ selamanya) daripada optimasi (yang situasional).
Paul Cantrell

1
Ini pasti jawabannya. @PeterCordes ISO ini digunakan untuk Jenis Kelamin (jenis kelamin biologis) dan bukan Jenis Kelamin (apa yang Anda identifikasi) - penjelasan di sini . Saya kira dalam hal ingin menyimpan jenis kelamin (yang, saya tidak akan tahu yang menggunakan Anda melakukan ini), int kecil masih cukup baik selama Anda ingin menyimpan kurang dari 255 jenis kelamin (dengan mengatakan fe 0 = tidak diketahui / tidak ingin menyatakan, 1 = pria, 2 = wanita, 3 = pria yang mengidentifikasi sebagai wanita, dll.)
SolidTerre

43

Dalam kedokteran ada empat jenis kelamin: pria, wanita, tak tentu, dan tidak diketahui. Anda mungkin tidak membutuhkan keempatnya, tetapi tentu saja Anda membutuhkan 1, 2, dan 4. Tidak tepat untuk memiliki nilai default untuk tipe data ini. Bahkan lebih sedikit memperlakukannya sebagai Boolean dengan status 'adalah' dan 'tidak'.


1
@ EJP, menarik. Apakah Anda memiliki referensi untuk ini?
Marko

11
Ayah saya, MD BS FRACP.
Marquis of Lorne

Berdasarkan informasi ini, saya akan pergi dengan TinyIntmenyelaraskan dengan enum (seperti yang disarankan Hugo) dan pergi dengan setidaknya 1, 2, dan 3 (Lainnya).
IAbstract

1
@ EJP, meskipun jawaban Anda mungkin benar, itu TIDAK mengatakan tipe data apa yang harus saya gunakan, tetapi - apa jenis kelamin (secara teknis) yang benar.
Marko

17
Kamus data National National Service (NHS) UK mendefinisikan empat nilai: 0 = Not Known, 1 = Male, 2 = Female, 9 = Not Specified, yang menyihir nilai ISO 5218 . Perhatikan ada dua jenis : jenis kelamin saat pendaftaran (biasanya segera setelah kelahiran) dan saat ini.
onedaywhen

3

Sebuah Int(atau TinyInt) selaras ke Enumlapangan akan metodologi saya.

Pertama, jika Anda memiliki satu bitbidang dalam database, baris masih akan menggunakan byte penuh, sehingga sejauh penghematan ruang, itu hanya terbayar jika Anda memiliki beberapa bitbidang.

Kedua, string / karakter memiliki perasaan "nilai magis" bagi mereka, terlepas dari seberapa jelas mereka tampak pada waktu desain. Belum lagi, itu memungkinkan orang menyimpan hampir semua nilai yang mereka belum tentu memetakan ke sesuatu yang jelas.

Ketiga, nilai numerik jauh lebih mudah (dan praktik yang lebih baik) untuk membuat tabel pencarian, untuk menegakkan integritas referensial, dan dapat mengkorelasikan 1-ke-1 dengan enum, sehingga ada paritas dalam menyimpan nilai dalam memori dalam aplikasi atau dalam database.


2

Saya menggunakan char 'f', 'm' dan 'u' karena saya menduga jenis kelamin dari nama, suara dan percakapan, dan kadang-kadang tidak tahu jenis kelaminnya. Penentuan akhir adalah pendapat mereka.

Itu sangat tergantung seberapa baik Anda mengenal orang itu dan apakah kriteria Anda adalah bentuk fisik atau identitas pribadi. Seorang psikolog mungkin perlu opsi tambahan - menyeberang ke wanita, menyeberang ke pria, trans ke wanita, trans ke pria, hermafrodit dan ragu-ragu. Dengan 9 opsi, tidak didefinisikan dengan jelas oleh satu karakter, saya mungkin pergi dengan saran Hugo tentang integer kecil.


Bukan pada topik. Itu bukan jawaban.
hod

1

Opsi 3 adalah taruhan terbaik Anda, tetapi tidak semua mesin DB memiliki tipe "bit". Jika Anda tidak memiliki sedikit pun, maka TinyINT akan menjadi taruhan terbaik Anda.


-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;

masukkan deskripsi tautan di sini


-5

Saya akan pergi dengan Opsi 3 tetapi beberapa kolom bit NON NULLABLE bukan satu. IsMale (1 = Ya / 0 = Tidak) IsFemale (1 = Ya / 0 = Tidak)

jika requried: IsUnknownGender (1 = Ya / 0 = Tidak) dan seterusnya ...

Ini memudahkan pembacaan definisi, ekstensibilitas yang mudah, programabilitas yang mudah, tidak ada kemungkinan menggunakan nilai di luar domain dan tidak ada persyaratan tabel pencarian kedua + FK atau PERIKSA kendala untuk mengunci nilai-nilai.

EDIT: Koreksi, Anda perlu setidaknya satu kendala untuk memastikan flag yang ditetapkan valid.


Alangkah baiknya mendengar mengapa jawaban saya tidak dipilih?
HansLindgren

Tanpa kendala, tidak ada yang mencegah semua kolom menjadi 1, atau semuanya menjadi 0. Yang tidak masuk akal, sehingga skema Anda tidak memenuhi salah satu klaim Anda.
Jay Kominek

Ya, Anda benar bahwa Anda perlu satu kendala untuk memeriksa bahwa jumlah bendera yang benar telah 'diperiksa'. Saya tidak berpikir semua suara turun untuk kelalaian itu ...
HansLindgren

Ini adalah pertanyaan yang banyak dikunjungi (lihat upvotes untuk beberapa jawaban lain!), Dan Anda datang bertahun-tahun kemudian dan menambahkan jawaban yang sama dengan pengkodean satu-panas, teknik yang diajarkan secara luas, yang bahkan tidak memiliki beberapa sifat konkret yang Anda atributkan padanya. Saya rasa tidak tepat untuk memilih Anda di bawah 0, tapi saya tidak terkejut itu terjadi juga.
Jay Kominek
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.