Ngoài đối số về việc có nên sử dụng NULL hay không: Tôi chịu trách nhiệm về cơ sở dữ liệu hiện có sử dụng NULL có nghĩa là dữ liệu "bị thiếu hoặc không bao giờ được nhập". Nó khác với chuỗi rỗng, có nghĩa là "người dùng đặt giá trị này và họ đã chọn 'trống'."
Một nhà thầu khác trong dự án chắc chắn về quan điểm "NULL không tồn tại đối với tôi; tôi không bao giờ sử dụng NULL và không ai khác nên". Tuy nhiên, điều khiến tôi bối rối là vì nhóm của nhà thầu KHÔNG thừa nhận sự khác biệt giữa "thiếu / không bao giờ nhập" và "cố ý để trống hoặc được người dùng chỉ ra là không xác định", họ sử dụng một ký tự duy nhất 'Z' trong suốt mã của họ và các thủ tục được lưu trữ để đại diện cho "bị thiếu / không bao giờ được nhập" với cùng ý nghĩa với NULL trong suốt phần còn lại của cơ sở dữ liệu.
Mặc dù khách hàng được chia sẻ của chúng tôi đã yêu cầu thay đổi điều này và tôi đã ủng hộ yêu cầu này, nhóm nghiên cứu cho rằng đây là "thông lệ tiêu chuẩn" giữa các DBA cao cấp hơn nhiều so với tôi; họ miễn cưỡng thay đổi để sử dụng NULL chỉ dựa trên yêu cầu thiếu hiểu biết của tôi. Vì vậy, có ai có thể giúp tôi vượt qua sự thiếu hiểu biết của tôi? Có tiêu chuẩn nào, hoặc một nhóm nhỏ cá nhân, hoặc thậm chí một giọng nói lớn giữa các chuyên gia SQL ủng hộ việc sử dụng 'Z' thay cho NULL không?
Cập nhật
Tôi có phản hồi từ nhà thầu để bổ sung. Đây là những gì anh ấy nói khi khách hàng yêu cầu xóa các giá trị đặc biệt để cho phép NULL trong các cột không có dữ liệu:
Về cơ bản, tôi đã thiết kế cơ sở dữ liệu để tránh NULL bất cứ khi nào có thể. Đây là lý do:
• Một NULL trong trường chuỗi [VARCHAR] không bao giờ cần thiết vì một chuỗi rỗng (độ dài bằng 0) cung cấp cùng một thông tin.
• Một NULL trong trường số nguyên (ví dụ: giá trị ID) có thể được xử lý bằng cách sử dụng một giá trị sẽ không bao giờ xuất hiện trong dữ liệu (ví dụ: -1 cho trường IDENTITY số nguyên).
• NULL trong trường ngày tháng có thể dễ dàng gây ra các biến chứng trong việc tính toán ngày tháng. Ví dụ: trong logic tính toán sự khác biệt về ngày tháng, chẳng hạn như sự khác biệt về số ngày giữa [RecoveryDate] và [OnsetDate], logic sẽ bị phá hủy nếu một hoặc cả hai ngày là NULL - trừ khi có sự cho phép rõ ràng cho cả hai ngày là NULL. Đó là công việc bổ sung và xử lý thêm. Nếu ngày "mặc định" hoặc "giữ chỗ" được sử dụng cho [RecoveryDate] và [OnsetDate] (ví dụ: "1/1/1900"), các phép tính toán học có thể hiển thị các giá trị "bất thường" - nhưng logic ngày sẽ không xuất hiện.
Xử lý NULL theo truyền thống là một lĩnh vực mà các nhà phát triển mắc lỗi trong các thủ tục được lưu trữ.
Trong 15 năm làm DBA, tôi thấy tốt nhất là nên tránh NULL khi có thể.
Điều này dường như xác thực phản ứng tiêu cực cho câu hỏi này. Thay vì áp dụng cách tiếp cận 6NF được chấp nhận để thiết kế các NULL, các giá trị đặc biệt được sử dụng để "tránh NULL khi có thể." Tôi đã đăng câu hỏi này với tinh thần cởi mở và tôi rất vui vì tôi đã biết thêm về cuộc tranh luận "NULL là hữu ích / NULL là xấu", nhưng hiện tại tôi khá thoải mái khi gắn nhãn cách tiếp cận 'giá trị đặc biệt' là hoàn toàn vô nghĩa.
một chuỗi rỗng (độ dài bằng không) cung cấp cùng một thông tin.
Không, nó không; trong cơ sở dữ liệu hiện có mà chúng tôi đang sửa đổi, NULL có nghĩa là "không bao giờ được nhập" và chuỗi trống có nghĩa là "được nhập dưới dạng trống".
Xử lý NULL theo truyền thống là một lĩnh vực mà các nhà phát triển mắc lỗi trong các thủ tục được lưu trữ.
Đúng, nhưng những sai lầm đó đã được hàng nghìn lần bởi hàng nghìn nhà phát triển, và các bài học và lưu ý để tránh những sai lầm đó đã được biết đến và ghi lại. Như đã được đề cập ở đây: cho dù bạn chấp nhận hay từ chối NULL, việc biểu diễn các giá trị bị thiếu là một vấn đề đã được giải quyết . Không cần thiết phải phát minh ra một giải pháp mới chỉ vì các nhà phát triển tiếp tục mắc những lỗi dễ khắc phục (và dễ xác định).
Như một chú thích cuối trang: Tôi đã là một nhà phát triển và DBE trong hơn 20 năm (đó là thời gian đủ để tôi biết sự khác biệt giữa một kỹ sư cơ sở dữ liệu và một quản trị viên cơ sở dữ liệu). Trong suốt sự nghiệp của mình, tôi luôn ở trong trại "NULLs có ích", mặc dù tôi biết rằng một số người rất thông minh đã không đồng ý. Tôi cực kỳ nghi ngờ về phương pháp tiếp cận "giá trị đặc biệt", nhưng không đủ thông thạo về học thuật "Làm thế nào để tránh NULL con đường đúng" để tạo lập một chỗ đứng vững chắc. Tôi luôn thích học những điều mới — và tôi vẫn còn nhiều điều để học sau 20 năm. Cảm ơn tất cả những người đã đóng góp để làm cho cuộc thảo luận này trở nên hữu ích.