Katakanlah Anda memiliki aplikasi yang memiliki bidang boolean dalam User
tabelnya yang disebut Inactive
.
Apakah ada yang salah dengan menyimpan palsu sebagai nol? Jika demikian, bisakah Anda menjelaskan apa sisi buruknya? Saya telah membahas hal ini dengan seseorang beberapa bulan yang lalu dan kami berdua sepakat bahwa itu tidak masalah selama Anda melakukannya secara konsisten di seluruh aplikasi / database. Baru-baru ini, seseorang yang saya kenal tegas bahwa "benar" true
atau false
harus digunakan, tetapi mereka tidak benar-benar memberikan penjelasan mengapa.
database-design
null
Ominus
sumber
sumber
Null is a special marker used in Structured Query Language (SQL) to indicate that a data value does not exist in the database
Ini adalah kebijaksanaan yang diterima dan Anda tidak boleh mendefinisikan kembali apa yang Null berarti dalam aplikasi Anda. Ini akan membingungkan semua orang yang bekerja dengan kode Anda.SELECT * FROM foo WHERE bar = FALSE
tidak memberikan hasil yang Anda harapkan.Jawaban:
Iya.
NULL tidak sama dengan False.
Menurut definisi, perbandingan (dan logika) yang melibatkan NULL harus mengembalikan nilai NULL (bukan False). Namun, implementasi SQL dapat bervariasi.
True and NULL
adalah NULL (bukan False).True and NULL or False
adalah NULL (bukan False).http://en.wikipedia.org/wiki/Null_(SQL)#Three-valued_logic_.283VL.29
http://technet.microsoft.com/en-us/library/cc966426.aspx
sumber
null
tidak relevan dengan logika (seperti halnya diwhatever OR TRUE
atauwhatever AND FALSE
, di mana tidak ada nilaiwhatever
dapat mengubah kondisi), maka ekspresi mengembalikan nilai. Ini bukan optimasi; itulah cara kerja logika 3-nilai . Setiap DBMS yang bersikeras untuk mengembalikanUNKNOWN
/NULL
untuk ekspresi itu pada dasarnya rusak.Dengan membolehkan nulls dalam bidang boolean, Anda mengubah representasi biner yang dimaksud (benar / salah) menjadi representasi tri-state (true, false, null) di mana entri 'null' Anda tidak pasti. Nilai 'nol' tidak tepat 'benar' atau 'salah.' Apa alasan Anda harus menambah representasi Anda menjadi tidak akurat?
Bahkan jika Anda memutuskan pola seperti ini dan melakukannya secara konsisten di seluruh aplikasi Anda, itu tidak membuatnya baik-baik saja. Anda akan berakhir dalam situasi di mana tidak jelas bagi mata yang segar mengapa pola itu ada atau, lebih mungkin, Anda akan berakhir dalam situasi di mana pola itu secara tidak sengaja rusak.
sumber
Apa yang orang lain katakan. 3 nilai yang mungkin bukan boolean.
Tetapi Anda mungkin memiliki kebutuhan sah untuk 3 nilai. Seperti (benar, salah, tidak diketahui). Bahkan jika ini masalahnya, jika Anda masuk ke dalam ultra-normalisasi, Anda tidak akan mengizinkan nilai nol sama sekali. Sebagai gantinya Anda akan menyimpan boolean sejati di tabel lain dengan relasi 1 ke 1. Nilai nol dapat dihasilkan dalam kueri oleh gabungan luar "gagal", bukan oleh nilai nol yang disimpan secara fisik.
sumber
false
), maka mereka memiliki tempat mereka. Jika tidak, mereka tidak akan ada. Alternatifnya, seperti yang disebutkan, pada dasarnya memiliki seluruh tabel lain hanya dengan kunci utama dari baris Anda dan satu boolean (atau int, atau varchar, atau apa pun). Untuk setiap dan setiap bidang yang seharusnya Anda buat nullable. Meskipun secara relasional murni, itu terlalu berbelit-belit untuk sebagian besar tujuan.Apakah
bool?
tipe boolean? Tidak. Itu adalah tipe diNullable<T>
manaT
boolean. Boolean yang dapat dibatalkan dapat memiliki 3 nilai: true, false dan null. Untuk menggunakanbool
ataubool?
tergantung pada kebutuhan Anda. Mungkin ada alasan yang sah di mana Anda mungkin perlu menggunakan null tetapi jenis yang berbau seperti biner tetapi Anda tidak tahu jawabannya. Dalam contoh di atas,User.IsActive
tampak jelas. Pengguna aktif atau tidak. Sebagai suatu sistem, ia mungkin ingin tahu apakah pengguna aktif atau tidak. Seharusnya tidak ada 'mungkin'. Tetapi pikirkan tentang sesuatu seperti bendera fitur. Apakah fitur dihidupkan? Jawabannya bisa ya, tidak, atau tidak yakin. Anda mungkin memiliki aturan bisnis yang menjabarkan hanya menampilkan tombol ketika flag disetel ke true. Orang mungkin berpendapat bool secara default salah jadi mengapa membuat bool nullable? Inverse the requirement: apakah Anda akan mengatur semua nilai dalam sumber data menjadi true?sumber