ฉันควรเก็บ False เป็น Null ในฟิลด์ฐานข้อมูลบูลีนหรือไม่


20

สมมติว่าคุณมีโปรแกรมประยุกต์ที่มีสนามบูลีนในของมันตารางเรียกว่าUserInactive

มีอะไรผิดปกติหรือเปล่าที่เพียงแค่เก็บเป็นเท็จเป็นโมฆะ? ถ้าเป็นเช่นนั้นคุณช่วยอธิบายว่าอะไรควรลง? ฉันได้พูดคุยเรื่องนี้กับใครบางคนเมื่อไม่กี่เดือนที่ผ่านมาและเราทั้งคู่เห็นพ้องต้องกันว่ามันไม่สำคัญตราบใดที่คุณทำอย่างสม่ำเสมอตลอดทั้งแอป / ฐานข้อมูล เมื่อเร็ว ๆ นี้บางคนที่ฉันรู้ว่าถูกเน้นว่า "จริง" trueหรือfalseควรจะใช้ แต่พวกเขาไม่ได้ให้คำอธิบายว่าทำไม


25
Wikipedia กล่าวว่า Null is a special marker used in Structured Query Language (SQL) to indicate that a data value does not exist in the databaseนี่เป็นภูมิปัญญาที่เป็นที่ยอมรับและคุณไม่ควรกำหนดว่า Null หมายถึงอะไรในใบสมัครของคุณ มันจะสร้างความสับสนให้กับทุกคนที่ทำงานกับรหัสของคุณ
PersonalNexus

10
ทำไมคุณถึงอยากทำเช่นนี้? ทำไมไม่เพียงแค่ใช้ฟิลด์บิตที่ไม่เป็นโมฆะและตั้งค่าเริ่มต้นเป็นเท็จหากนั่นคือพฤติกรรมที่คุณต้องการแทนที่จะสับสนกับปัญหาด้วยฟิลด์ไตรสถานะ
JohnFx

5
ตัวอย่างโลกแห่งความจริงว่าทำไมมันถึงเป็นความคิดที่แย่มาก: SELECT * FROM foo WHERE bar = FALSEไม่ให้ผลลัพธ์ที่คุณคาดหวัง
Blrfl

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

4
แต่ถ้าคุณเก็บเท็จเป็นโมฆะคุณจะเก็บ FILE_NOT_FOUND อย่างไร! ( thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx )
Ed James

คำตอบ:


50

มีอะไรผิดปกติหรือเปล่าที่เพียงแค่เก็บเป็นเท็จเป็นโมฆะ?

ใช่.

ถ้าเป็นเช่นนั้นคุณช่วยอธิบายว่าอะไรควรลง?

NULL ไม่เหมือนกับ False

ตามคำจำกัดความการเปรียบเทียบ (และตรรกะ) ที่เกี่ยวข้องกับ NULL ควรส่งคืนค่า NULL (ไม่ใช่เท็จ) อย่างไรก็ตามการปรับใช้ SQL อาจแตกต่างกันไป

True and NULL เป็น NULL (ไม่ใช่เท็จ)

True and NULL or False เป็น NULL (ไม่ใช่เท็จ)

http://en.wikipedia.org/wiki/Null_(SQL)#Three-valued_logic_.283VL.29

http://technet.microsoft.com/en-us/library/cc966426.aspx


3
อธิบายโดยละเอียดว่าทำไม NULL คือค่าที่แสดงถึงการไม่มีค่า
maple_shaft

2
วันแรกของการพัฒนาครั้งแรกของฉันเกี่ยวข้องกับการดีบักและแก้ไขข้อผิดพลาดเช่นในคำถาม / คำตอบนี้การระลึกถึง +1
tsundoku

1
โปรดทราบว่าบทความที่คุณเชื่อมโยงกับบอกว่าถ้าnullไม่เกี่ยวข้องกับตรรกะ (เป็นกรณีที่ในwhatever OR TRUEหรือwhatever AND FALSEที่คุ้มค่าไม่whateverสามารถเปลี่ยนแปลงเงื่อนไข) จากนั้นแสดงออกส่งกลับค่า มันไม่ใช่การเพิ่มประสิทธิภาพ มันเป็นวิธีการที่ 3 มูลค่างานตรรกะ DBMS ใด ๆ ที่ยืนยันการส่งคืนUNKNOWN/ NULLสำหรับนิพจน์เหล่านั้นจะถูกทำลายโดยพื้นฐาน
cHao

1
@ S.Lott แต่ไม่ได้จัดเก็บข้อมูลที่เป็นโมฆะแทนที่จะเป็นเท็จประหยัดพื้นที่บางส่วน ??
azerafati

2
@Blream: สำหรับ booleans ฟิลด์ที่สามารถลบล้างได้จริงอาจใช้พื้นที่มากขึ้นขึ้นอยู่กับ DBMS (เป็นจำนวนเล็กน้อยในเกือบทุกกรณี) บูลีนสามารถแสดงในบิตเดียว ... แต่บูลีนnullableมีค่าที่เป็นไปได้สามค่า (จริงเท็จและ null) และต้องการมากกว่าหนึ่งบิต
cHao

15

การอนุญาตให้มีค่า Null ในฟิลด์บูลีนคุณกำลังเปลี่ยนการแสดงไบนารีแบบตั้งใจ (จริง / เท็จ) เป็นการนำเสนอแบบไตรสเตท (จริง, เท็จ, เป็นโมฆะ) ซึ่งรายการ 'โมฆะ' ของคุณไม่มีกำหนด ค่า 'null' ไม่เหมาะสม 'จริง' หรือ 'เท็จ' คุณมีเหตุผลอะไรที่จะต้องเพิ่มการเป็นตัวแทนของคุณให้ไม่ถูกต้อง?

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


5

สิ่งที่คนอื่นพูด 3 ค่าที่เป็นไปได้ไม่ใช่บูลีน

แต่คุณอาจต้องมี 3 ค่าที่ถูกต้องตามกฎหมาย เช่น (จริง, เท็จ, ไม่ทราบ) แม้ว่าจะเป็นกรณีนี้หากคุณเข้าสู่ภาวะปกติขั้นสูงคุณจะไม่อนุญาตให้มีค่า Null ใด ๆ เลย แต่คุณจะเก็บบูลีนที่แท้จริงในตารางอื่นที่มีความสัมพันธ์แบบ 1 ต่อ 1 ค่า Null สามารถสร้างได้ในแบบสอบถามโดยการรวมภายนอกแบบ "ล้มเหลว" ไม่ใช่ค่า null ที่จัดเก็บทางกายภาพ


นอกขอบเขตของคำถามบูลีนของฉันทำไมจะไม่ทราบความจริงเท็จที่ไม่ดีถ้าคุณใช้ null เพื่อทำมัน? นอกเหนือจากคำถามของฉันเป็นโมฆะโดยทั่วไปที่จะหลีกเลี่ยง? ทำไม?
Ominus

3
@Ominus: Nulls มักจะหลีกเลี่ยงถ้าคุณเป็นคนเจ้าระเบียบ หากใช้ตามที่ควรจะใช้ (เช่น "ไม่มีคุณค่าที่นี่" แทนที่จะเป็นของปลอม - ปลอมfalse) แล้วพวกเขาก็มีที่ หากพวกเขาไม่พวกเขาจะไม่อยู่ ทางเลือกดังที่กล่าวมาคือมีตารางอื่นทั้งหมดที่มีเพียงคีย์หลักของแถวของคุณและบูลีนเดียว (หรือ int หรือ varchar หรือสิ่งที่คุณมี) สำหรับแต่ละฟิลด์และทุกฟิลด์ที่คุณต้องการทำให้เป็นโมฆะ ในขณะที่บริสุทธิ์สัมพันธ์มันก็ซับซ้อนเกินไปสำหรับวัตถุประสงค์มากที่สุด
cHao

-3

เป็นbool?ชนิดบูลีน? ไม่มันเป็นประเภทNullable<T>ที่Tบูลีน บูลีน nullable สามารถมี 3 ค่า: true, false และ null ที่จะใช้boolหรือbool?ขึ้นอยู่กับความต้องการของคุณ อาจมีเหตุผลที่ถูกต้องที่คุณอาจต้องใช้ null แต่เป็นประเภทที่มีกลิ่นเหมือนเลขฐานสอง แต่คุณไม่ทราบคำตอบ ในตัวอย่างด้านบนUser.IsActiveดูเหมือนจะชัดเจน ผู้ใช้มีการใช้งานหรือไม่ ในฐานะระบบมันอาจต้องการทราบว่าผู้ใช้มีการใช้งานหรือไม่ ไม่ควรมี 'อาจ' แต่คิดเกี่ยวกับบางสิ่งบางอย่างเช่นธงคุณสมบัติ คุณลักษณะนี้เปิดอยู่หรือไม่ คำตอบอาจเป็นใช่ไม่ใช่หรือไม่แน่ใจ คุณอาจมีกฎธุรกิจที่คาถาแสดงเฉพาะปุ่มเมื่อตั้งค่าสถานะเป็นจริง หนึ่งอาจโต้เถียงบูลโดยค่าเริ่มต้นเป็นเท็จดังนั้นทำไมสร้างบูล nullable? ความต้องการของผกผัน: คุณจะตั้งค่าทั้งหมดในแหล่งข้อมูลเป็นจริงหรือไม่


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