Tôi nghĩ rằng các cột không thể tránh được nên tránh. Bất cứ nơi nào ngữ nghĩa của tên miền làm cho nó có thể sử dụng một giá trị cho biết rõ ràng dữ liệu bị thiếu, nó nên được sử dụng thay cho NULL.
Ví dụ: hãy tưởng tượng một bảng có chứa trường Comment
. Hầu hết các nhà phát triển sẽ đặt một NULL ở đây để chỉ ra rằng không có dữ liệu trong cột. (Và, hy vọng, một ràng buộc kiểm tra mà không cho phép các chuỗi có độ dài bằng 0 để chúng ta có một "giá trị" nổi tiếng để chỉ ra sự thiếu giá trị.) Cách tiếp cận của tôi thường ngược lại. Cột Comment
là NOT NULL
và chuỗi có độ dài bằng 0 cho biết thiếu giá trị. (Tôi sử dụng ràng buộc kiểm tra để đảm bảo rằng chuỗi có độ dài bằng không thực sự là một chuỗi có độ dài bằng 0 và không phải khoảng trắng.)
Vì vậy, tại sao tôi làm điều này? Hai lý do:
NULL
s yêu cầu logic đặc biệt trong SQL và kỹ thuật này tránh điều đó.
- Nhiều thư viện phía máy khách có các giá trị đặc biệt để biểu thị
NULL
. Ví dụ, nếu bạn sử dụng ADO.NET của Microsoft, hằng số DBNull.Value
chỉ ra một NULL và bạn phải kiểm tra điều đó. Sử dụng chuỗi có độ dài bằng không trên cột NOT NULL
sẽ làm giảm nhu cầu.
Mặc dù tất cả điều này, có nhiều trường hợp trong đó NULL
s là tốt. Trong thực tế, tôi không phản đối việc sử dụng chúng trong kịch bản trên, mặc dù nó không phải là cách ưa thích của tôi.
Dù bạn làm gì, hãy tử tế với những người sẽ sử dụng các bảng của bạn. Hãy nhất quán. Cho phép họ tự tin vào số SELECT
. Hãy để tôi giải thích ý tôi là gì. Gần đây tôi đã làm việc trên một dự án có cơ sở dữ liệu không được thiết kế bởi tôi. Gần như mọi cột đều không có giá trị và không có ràng buộc. Không có sự nhất quán về những gì đại diện cho sự vắng mặt của một giá trị. Nó có thể là NULL
, một chuỗi có độ dài bằng không hoặc thậm chí là một dải không gian và thường là. (Làm thế nào mà súp của các giá trị đến đó, tôi không biết.)
Imagine mã xấu xí một nhà phát triển phải viết thư cho tất cả các hồ sơ với một Comment
lĩnh vực thiếu trong kịch bản này:
SELECT * FROM Foo WHERE LEN(ISNULL(Comment, '')) = 0
Thật ngạc nhiên là có những nhà phát triển quan tâm đến điều này là hoàn toàn có thể chấp nhận được, thậm chí bình thường, mặc dù có thể có những tác động hiệu quả. Tốt hơn sẽ là:
SELECT * FROM Foo WHERE Comment IS NULL
Hoặc
SELECT * FROM Foo WHERE Comment = ''
Nếu bảng của bạn được thiết kế phù hợp, hai câu lệnh SQL ở trên có thể được dựa vào để tạo ra dữ liệu có chất lượng.
Nếu lược đồ DB vẫn đang phát triển và cột mới đang được thêm vào, có thể dễ dàng hơn để tạo cột mới null ngay từ đầu có thể có nghĩa là nhiều null nếu có nhiều cột được thêm vào bảng trong DB . Đó dường như là nơi tôi thấy chúng xuất hiện. –