Haruskah saya menyimpan False as Null di bidang basis data boolean?

20

Katakanlah Anda memiliki aplikasi yang memiliki bidang boolean dalam Usertabelnya 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" trueatau falseharus digunakan, tetapi mereka tidak benar-benar memberikan penjelasan mengapa.

Ominus
sumber
25
Wikipedia mengatakan 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.
PersonalNexus
10
Mengapa Anda bahkan ingin melakukan ini? Mengapa tidak hanya menggunakan bidang bit yang tidak dapat dibatalkan dan menetapkan standar ke false jika itu adalah perilaku yang Anda inginkan alih-alih membingungkan masalah dengan bidang tri-state?
JohnFx
5
Contoh dunia nyata mengapa itu ide yang sangat buruk: SELECT * FROM foo WHERE bar = FALSEtidak memberikan hasil yang Anda harapkan.
Blrfl
2
Pertimbangkan untuk menggunakan kolom int dengan default 0 daripada boolean. Dengan cara ini jika kondisi baru muncul (mungkin keadaan 'pending', misalnya), Anda tidak perlu mengubah struktur basis data.
GrandmasterB
4
Tetapi jika Anda menyimpan false sebagai null, bagaimana Anda akan menyimpan FILE_NOT_FOUND ?! ( thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx )
Ed James

Jawaban:

50

Apakah ada yang salah dengan menyimpan palsu sebagai nol?

Iya.

Jika demikian dapatkah Anda menjelaskan apa sisi buruknya?

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

S.Lott
sumber
3
Penjelasan Succint tentang mengapa NULL adalah nilai yang mewakili tidak adanya nilai.
maple_shaft
2
hari pertama pekerjaan pengembangan pertama saya melibatkan debugging dan memperbaiki kesalahan seperti dalam pertanyaan / jawaban ini, mengingatkan +1
tsundoku
1
Perhatikan bahwa artikel yang Anda tautkan mengatakan bahwa jika nulltidak relevan dengan logika (seperti halnya di whatever OR TRUEatau whatever AND FALSE, di mana tidak ada nilai whateverdapat mengubah kondisi), maka ekspresi mengembalikan nilai. Ini bukan optimasi; itulah cara kerja logika 3-nilai . Setiap DBMS yang bersikeras untuk mengembalikan UNKNOWN/ NULLuntuk ekspresi itu pada dasarnya rusak.
cHao
1
@ S.Lott, tetapi tidak menyimpan null bukannya false menghemat ruang ??
azerafati
2
@Bludream: Untuk booleans, bidang nullable sebenarnya dapat mengambil lebih banyak ruang, tergantung pada DBMS. (Namun, jumlah yang dapat diabaikan dalam hampir semua kasus.) Boolean dapat direpresentasikan dalam bit tunggal ... tetapi boolean yang dapat dibatalkan memiliki tiga nilai yang mungkin (benar, salah, dan nol), dan karenanya membutuhkan lebih dari satu bit.
cao
15

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.

Jacob Maristany
sumber
5

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.

Tuan Tydus
sumber
di luar bidang pertanyaan boolean saya mengapa benar palsu tidak diketahui menjadi buruk jika Anda menggunakan nol untuk melakukannya? Di luar pertanyaan saya, apakah nol pada umumnya harus dihindari? Mengapa?
Ominus
3
@Minus: Null umumnya harus dihindari jika Anda seorang purist. Jika digunakan sebagaimana mereka dimaksudkan untuk digunakan (sebagai "tidak ada nilai di sini" daripada sebagai palsu-palsu 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.
cHao
-3

Apakah bool?tipe boolean? Tidak. Itu adalah tipe di Nullable<T>mana Tboolean. Boolean yang dapat dibatalkan dapat memiliki 3 nilai: true, false dan null. Untuk menggunakanbool atau bool?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.IsActivetampak 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?

nullableTypes
sumber
2
posting ini agak sulit dibaca (dinding teks). Maukah Anda mengeditnya menjadi bentuk yang lebih baik?
nyamuk