Tôi có nên lưu trữ Sai là Null trong trường cơ sở dữ liệu boolean không?


20

Giả sử bạn có một ứng dụng có trường boolean trong Userbảng được gọi Inactive.

Có bất cứ điều gì vốn đã sai khi chỉ lưu trữ sai là null? Nếu vậy bạn có thể vui lòng giải thích những gì xuống phía dưới? Tôi đã thảo luận điều này với ai đó vài tháng trước và cả hai chúng tôi đều đồng ý rằng điều đó không quan trọng miễn là bạn làm điều đó một cách nhất quán trong toàn bộ ứng dụng / cơ sở dữ liệu. Gần đây, một người mà tôi biết đã nhấn mạnh rằng "đúng" truehoặc falsenên được sử dụng, nhưng họ không thực sự đưa ra lời giải thích về lý do tại sao.


25
Wikipedia nói rằng Null is a special marker used in Structured Query Language (SQL) to indicate that a data value does not exist in the database đây là sự khôn ngoan được chấp nhận và bạn không nên xác định lại ý nghĩa của Null trong ứng dụng của bạn. Nó sẽ gây nhầm lẫn cho mọi người khác làm việc với mã của bạn.
PersonalNexus

10
Tại sao bạn thậm chí muốn làm điều này? Tại sao không sử dụng trường bit không null và đặt mặc định thành false nếu đó là hành vi bạn muốn thay vì nhầm lẫn vấn đề với trường ba trạng thái?
JohnFx

5
Ví dụ trong thế giới thực về lý do tại sao đó là một ý tưởng rất tồi: SELECT * FROM foo WHERE bar = FALSEkhông đưa ra kết quả mà bạn mong đợi.
Blrfl

2
Xem xét sử dụng một cột int với mặc định là 0 thay vì boolean. Bằng cách này, nếu điều kiện mới phát sinh (ví dụ như trạng thái 'đang chờ xử lý'), bạn không phải thay đổi cấu trúc cơ sở dữ liệu.
GrandmasterB

4
Nhưng nếu bạn lưu trữ sai thành null thì bạn sẽ lưu trữ FILE_NOT_FOUND như thế nào?! ( thed Dailywtf.com/Articles/What_Is_Truth_0x3f_.aspx )
Ed James

Câu trả lời:


51

Có bất cứ điều gì vốn đã sai khi chỉ lưu trữ sai là null?

Vâng.

Nếu vậy bạn có thể vui lòng giải thích những gì xuống phía dưới?

NULL không giống như Sai.

Theo định nghĩa, so sánh (và logic) liên quan đến NULL sẽ trả về giá trị của NULL (không sai). Tuy nhiên, việc triển khai SQL có thể khác nhau.

True and NULL là NULL (không sai).

True and NULL or False là NULL (không sai).

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

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


3
Giải thích về lý do tại sao NULL là giá trị đại diện cho sự vắng mặt của giá trị.
maple_shaft

2
ngày đầu tiên trong công việc phát triển đầu tiên của tôi liên quan đến gỡ lỗi và sửa lỗi như trong câu hỏi / câu trả lời này, hồi tưởng +1
tsundoku

1
Lưu ý rằng chính bài viết bạn liên kết để nói rằng nếu điều đó nullkhông liên quan đến logic (như trường hợp trong whatever OR TRUEhoặc whatever AND FALSE, trong đó không có giá trị nào whatevercó thể thay đổi điều kiện), thì biểu thức trả về một giá trị. Đó không phải là một sự tối ưu hóa; đó là cách logic 3 giá trị hoạt động . Bất kỳ DBMS nào khăng khăng đòi trả lại UNKNOWN/ NULLcho các biểu thức đó đều bị phá vỡ cơ bản.
cHao

1
@ S.Lott, nhưng không lưu trữ null thay vì sai lưu một số không gian ??
azerafati

2
@Bludream: Đối với booleans, trường nullable thực sự có thể chiếm nhiều dung lượng hơn , tùy thuộc vào DBMS. (Đó là một số lượng không đáng kể trong hầu hết các trường hợp, mặc dù.) Một boolean thể được biểu diễn trong một chút duy nhất ... nhưng một nullable boolean có ba giá trị có thể (true, false, và null), và do đó cần nhiều hơn một chút.
cHao

15

Bằng cách cho phép null trong trường boolean, bạn đang biến một biểu diễn nhị phân dự định (đúng / sai) thành biểu diễn ba trạng thái (đúng, sai, null) trong đó các mục 'null' của bạn không xác định. Giá trị 'null' không phù hợp 'đúng' hoặc 'sai'. Lý do nào bạn sẽ phải tăng đại diện của bạn là không chính xác?

Ngay cả khi bạn quyết định một mẫu như thế này và thực hiện nó một cách nhất quán trong toàn bộ ứng dụng của mình, điều đó cũng không ổn. Bạn sẽ kết thúc trong một tình huống không rõ ràng với đôi mắt mới tại sao mô hình đó được đặt ra hoặc, nhiều khả năng, bạn sẽ kết thúc trong một tình huống mà mô hình đó vô tình bị phá vỡ.


5

Những gì người khác đã nói. 3 giá trị có thể không phải là một boolean.

Nhưng bạn có thể có một nhu cầu chính đáng cho 3 giá trị. Chẳng hạn như (đúng, sai, không rõ). Ngay cả khi đây là trường hợp, nếu bạn đang ở trạng thái cực kỳ chuẩn hóa, bạn sẽ không cho phép bất kỳ giá trị null nào cả. Thay vào đó, bạn sẽ lưu trữ một boolean thực sự trong một bảng khác có mối quan hệ 1-1. Một giá trị null có thể được tạo ra trong một truy vấn bởi phép nối ngoài "không thành công", không phải bởi giá trị null được lưu trữ vật lý.


bên ngoài lĩnh vực của câu hỏi boolean của tôi tại sao đúng sai không biết là xấu nếu bạn sử dụng null để làm điều đó? Ngoài câu hỏi của tôi là null thường được tránh? Tại sao?
Ominus

3
@Ominus: Nói chung là không nên tránh nếu bạn là người theo chủ nghĩa thuần túy. Nếu được sử dụng như chúng được sử dụng (như "không có giá trị ở đây" chứ không phải là giả-giả false), thì chúng có vị trí của chúng. Nếu họ không, họ sẽ không tồn tại. Sự thay thế, như đã đề cập, về cơ bản là có một bảng hoàn toàn khác chỉ với khóa chính của hàng của bạn và một boolean duy nhất (hoặc int, hoặc varchar, hoặc những gì có bạn). Đối với mỗi và mọi lĩnh vực mà bạn muốn làm cho không thể. Trong khi tương đối thuần túy, nó quá phức tạp cho hầu hết các mục đích.
cHao

-3

bool?một loại boolean? Số Nó là loại Nullable<T>Tlà boolean. Một boolean nullable có thể có 3 giá trị: true, false và null. Để sử dụng boolhoặc bool?phụ thuộc vào yêu cầu của bạn. Có thể có lý do chính đáng khi bạn có thể cần sử dụng null nhưng một loại có mùi như nhị phân nhưng bạn không biết câu trả lời. Trong ví dụ trên,User.IsActivedường như cắt rõ ràng. Người dùng có hoạt động hay không. Là một hệ thống, nó có thể muốn biết người dùng có hoạt động hay không. Không nên có "có thể". Nhưng hãy nghĩ về một cái gì đó như một lá cờ tính năng. Là tính năng được bật? Các câu trả lời có thể là có, không, hoặc không chắc chắn. Bạn có thể có một quy tắc kinh doanh đánh vần chỉ hiển thị nút khi cờ được đặt thành đúng. Theo mặc định, người ta có thể lập luận bool là sai, vậy tại sao lại tạo bool nullable? Nghịch đảo yêu cầu: bạn sẽ đặt tất cả các giá trị trong nguồn dữ liệu thành đúng không?


2
bài này khá khó đọc (tường văn bản). Bạn có phiền chỉnh sửa ing nó thành một hình dạng tốt hơn?
gnat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.