Đầu tiên - ngừng sử dụng cụm từ "Giá trị không", nó sẽ khiến bạn lạc lối. Thay vào đó, hãy sử dụng cụm từ "null mark" - một điểm đánh dấu trong một cột chỉ ra rằng giá trị thực trong cột này bị thiếu hoặc không thể áp dụng (nhưng lưu ý rằng điểm đánh dấu không cho biết lựa chọn nào trong số đó thực sự là trường hợp¹).
Bây giờ, hãy tưởng tượng như sau (nơi cơ sở dữ liệu không có kiến thức đầy đủ về tình huống được mô hình hóa).
Situation Database
ID Code ID Code
-- ----- -- -----
1 A 1 A
2 B 2 (null)
3 C 3 C
4 B 4 (null)
Quy tắc toàn vẹn mà chúng tôi đang lập mô hình là "Mã phải là duy nhất". Tình huống trong thế giới thực vi phạm điều này, vì vậy cơ sở dữ liệu không nên cho phép cả hai mục 2 và 4 ở trong bảng cùng một lúc.
Cách tiếp cận an toàn nhất và linh hoạt nhất sẽ là không cho phép các điểm đánh dấu null trong trường Mã, do đó không có khả năng dữ liệu không nhất quán. Cách tiếp cận linh hoạt nhất sẽ là cho phép nhiều điểm đánh dấu null và lo lắng về tính duy nhất khi các giá trị được nhập.
Các lập trình viên Sybase đã đi theo cách tiếp cận có phần an toàn, không linh hoạt khi chỉ cho phép một điểm đánh dấu null trong bảng - điều mà các nhà bình luận đã phàn nàn kể từ đó. Microsoft đã tiếp tục hành vi này, tôi đoán để tương thích ngược.
Tôi chắc chắn rằng tôi đã đọc ở đâu đó rằng Codd đã cân nhắc việc thực hiện hai điểm đánh dấu null - một là không xác định, một là không thể áp dụng - nhưng đã từ chối nó, nhưng tôi không thể tìm thấy tài liệu tham khảo. Tôi có nhớ chính xác không?
PS Câu nói yêu thích của tôi về null: Louis Davidson, "Thiết kế cơ sở dữ liệu SQL Server 2000 chuyên nghiệp", Nhà xuất bản Digitx, 2001, trang 52. "Luộc xuống một câu duy nhất: NULL là xấu xa."