Saya ingin menyimpan jenis kelamin pengguna dalam database dengan biaya (ukuran / kinerja) sesedikit mungkin.
Sejauh ini, 3 skenario muncul dalam pikiran
- Int - sejajar dengan Enum dalam kode (1 = Pria, 2 = Wanita, 3 = ...)
- char (1) - Simpan m , f atau pengenal karakter tunggal lainnya
- 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.
sql
database-design
Marko
sumber
sumber
Jawaban:
Saya akan menyebut kolom "gender".
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. MenggunakanCHAR(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.
sumber
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.
sumber
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'.
sumber
TinyInt
menyelaraskan dengan enum (seperti yang disarankan Hugo) dan pergi dengan setidaknya 1, 2, dan 3 (Lainnya).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.Sebuah
Int
(atauTinyInt
) selaras keEnum
lapangan akan metodologi saya.Pertama, jika Anda memiliki satu
bit
bidang dalam database, baris masih akan menggunakan byte penuh, sehingga sejauh penghematan ruang, itu hanya terbayar jika Anda memiliki beberapabit
bidang.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.
sumber
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.
sumber
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.
sumber
masukkan deskripsi tautan di sini
sumber
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.
sumber