SQL: chuỗi rỗng so với giá trị NULL


72

Tôi biết chủ đề này là một chút tranh cãi và có rất nhiều bài viết / ý kiến ​​khác nhau nổi trên internet. Thật không may, hầu hết trong số họ cho rằng người đó không biết sự khác biệt giữa NULL và chuỗi rỗng là gì. Vì vậy, họ kể những câu chuyện về kết quả đáng ngạc nhiên với các phép nối / tổng hợp và thường làm các bài học SQL nâng cao hơn một chút. Bằng cách này, họ hoàn toàn bỏ lỡ toàn bộ vấn đề và do đó vô dụng đối với tôi. Vì vậy, hy vọng câu hỏi này và tất cả các câu trả lời sẽ di chuyển chủ đề một chút về phía trước.

Giả sử tôi có một bảng chứa thông tin cá nhân (tên, ngày sinh, v.v.) trong đó một trong các cột là địa chỉ email có kiểu varchar. Chúng tôi cho rằng vì một số lý do, một số người có thể không muốn cung cấp địa chỉ email. Khi chèn dữ liệu đó (không có email) vào bảng, có hai lựa chọn khả dụng: đặt ô thành NULL hoặc đặt thành chuỗi trống (''). Giả sử rằng tôi nhận thức được tất cả các ý nghĩa kỹ thuật của việc chọn một giải pháp trên một giải pháp khác và tôi có thể tạo các truy vấn SQL chính xác cho cả hai kịch bản. Vấn đề là ngay cả khi cả hai giá trị khác nhau ở cấp độ kỹ thuật, chúng hoàn toàn giống nhau ở mức logic. Sau khi nhìn vào NULL và '' Tôi đã đi đến một kết luận duy nhất: Tôi không biết địa chỉ email của anh chàng. Ngoài ra, bất kể tôi đã cố gắng thế nào, Tôi đã không thể gửi e-mail bằng cách sử dụng NULL hoặc chuỗi trống, vì vậy rõ ràng hầu hết các máy chủ SMTP ngoài đó đồng ý với logic của tôi. Vì vậy, tôi có xu hướng sử dụng NULL khi tôi không biết giá trị và coi chuỗi rỗng là một điều xấu.

Sau một số cuộc thảo luận căng thẳng với các đồng nghiệp, tôi đã đưa ra hai câu hỏi:

  1. Tôi có đúng không khi cho rằng việc sử dụng chuỗi rỗng cho một giá trị không xác định sẽ khiến cơ sở dữ liệu "nói dối" về các sự kiện? Nói chính xác hơn: sử dụng ý tưởng của SQL về giá trị là gì và không phải là gì, tôi có thể đi đến kết luận: chúng tôi có địa chỉ email, chỉ bằng cách tìm ra nó không phải là null. Nhưng sau đó, khi cố gắng gửi e-mail, tôi sẽ đi đến kết luận mâu thuẫn: không, chúng tôi không có địa chỉ e-mail, rằng cơ sở dữ liệu @! # $ Phải nói dối!

  2. Có kịch bản logic nào trong đó một chuỗi rỗng '' có thể là một nhà cung cấp thông tin quan trọng tốt như vậy (bên cạnh giá trị và không có giá trị), sẽ gây rắc rối / không hiệu quả khi lưu trữ theo bất kỳ cách nào khác (như cột bổ sung). Tôi đã thấy nhiều bài đăng tuyên bố rằng đôi khi sử dụng chuỗi rỗng cùng với các giá trị thực và NULL, nhưng cho đến nay vẫn chưa thấy một kịch bản nào hợp lý (về mặt thiết kế SQL / DB).

Tái bút: Một số người sẽ bị cám dỗ trả lời, rằng đó chỉ là vấn đề sở thích cá nhân. Tôi không đồng ý. Đối với tôi đó là một quyết định thiết kế với những hậu quả quan trọng. Vì vậy, tôi muốn xem câu trả lời trong đó opion về điều này được hỗ trợ bởi một số lý do hợp lý và / hoặc kỹ thuật.


11
Bạn có biết rằng trong Oracle, chuỗi rỗng NULL không?
user281377

8
@ammoQ: Cách xử lý chuỗi không độ dài của Oracle là không chuẩn. Bên cạnh đó, ''ngay cả trong Oracle, cũng không giống như NULL. Ví dụ: việc gán một CHAR(1)cột giá trị ''sẽ dẫn đến ' '(tức là khoảng trắng), chứ không phải NULL. Ngoài ra, nếu Jacek đang sử dụng Oracle, câu hỏi này có thể sẽ không xuất hiện :-)
Dean Harding

2
Trưởng khoa: Bạn nói đúng về ví dụ char (1), nhưng đó là một WTF khác, vì được '' IS NULLđánh giá là truetrong PL / SQL.
user281377

"Tôi có đúng không khi cho rằng việc sử dụng chuỗi rỗng cho một giá trị không xác định sẽ khiến cơ sở dữ liệu" nói dối "về các sự kiện?" nếu người dùng doanh nghiệp của bạn không quan tâm đến việc không biết gì và trống rỗng, liệu lời nói dối có quan trọng không?
Andy

Nếu bạn phải đi theo con đường sử dụng một chuỗi ... xin vui lòng, hãy chắc chắn rằng nó trống. Vì lợi ích của tất cả các nhà phát triển, đừng để một chuỗi có khoảng trắng trong đó đại diện cho giá trị không xác định của bạn. Tôi xin bạn.
Airn5485

Câu trả lời:


83

Tôi muốn nói rằng đó NULLlà lựa chọn chính xác cho "không có địa chỉ email". Có nhiều địa chỉ email "không hợp lệ" và "" (chuỗi trống) chỉ là một. Ví dụ: "foo" không phải là địa chỉ email hợp lệ, "a @ b @ c" không hợp lệ, v.v. Vì vậy, chỉ vì "" không phải là một địa chỉ email hợp lệ là không có lý do để sử dụng nó làm giá trị "không có địa chỉ email".

Tôi nghĩ rằng bạn đã đúng khi nói rằng "" không phải là cách chính xác để nói "Tôi không có giá trị cho cột này". "" một giá trị.

Một ví dụ về nơi "" có thể là một giá trị hợp lệ, riêng biệt NULLcó thể là tên đệm của một người. Không phải ai cũng có tên đệm, vì vậy bạn cần phân biệt giữa "không có tên đệm" ("" - chuỗi trống) và "Tôi không biết người này có tên đệm hay không" ( NULL). Có thể có nhiều ví dụ khác trong đó một chuỗi rỗng vẫn là một giá trị hợp lệ cho một cột.


5
Hoàn toàn đồng ý. NULL là có lý do. CHỌN COUNT (*) TỪ BÊN CỦA BẠN Ở ĐÂU EMAIL [KHÔNG] NULL là cách để làm điều đó, không phải so sánh chuỗi sẽ có xu hướng chậm hơn (ngay cả đối với các chuỗi trống tôi cho rằng nhưng tôi không chắc chắn về điều này :).
LudoMC

5
Tôi nghĩ NULLkhông có nghĩa là không có địa chỉ email, tôi nghĩ nó có nghĩa là địa chỉ email hiện không được biết đến, không được biết là tồn tại hoặc không thể điền vào vì những lý do khác. May mắn thay, có lẽ không có trường hợp nào người ta muốn giữ trong cơ sở dữ liệu thông tin về những người thực sự không có và không có kế hoạch để có bất kỳ địa chỉ email nào, nếu không thì một trường boolean riêng biệt có thể là cần thiết.
Alexey

9
@Alexey - NULL có nghĩa là không có giá trị. Như những người khác đã chỉ ra một chuỗi rỗng là một giá trị.
Ramhound

3
@Ramhound, tôi đồng ý rằng chuỗi trống là một giá trị và NULL mơ hồ có nghĩa là "không có giá trị". Tôi chỉ giải thích cách giải thích của tôi về "không có giá trị". Theo tôi, nó không giống như "người chưa mở bất kỳ tài khoản email nào". Nó khá là "không có địa chỉ email được ghi lại cho người đó".
Alexey

5
@Ramhound NULL có nghĩa là không có giá trị. Một người không có tên đệm không có giá trị ở đó. Do đó, NULL cũng nên được sử dụng trong một cột ban đầu ở giữa ... Điều này hoàn toàn trái ngược với lập luận được trình bày trong câu trả lời này.
Izkata

41

Trong khi đồng ý với các ý kiến ​​trên, tôi sẽ thêm đối số này làm động lực chính:

  1. Rõ ràng đối với bất kỳ lập trình viên nào nhìn vào cơ sở dữ liệu rằng một trường được đánh dấu NULL là một trường Tùy chọn. (tức là bản ghi không yêu cầu dữ liệu cho cột đó)
  2. Nếu bạn đánh dấu một trường KHÔNG NULL, bất kỳ lập trình viên nào nên trực giác cho rằng đó là trường Bắt buộc.
  3. Trong một trường cho phép null, các lập trình viên sẽ mong đợi thấy null hơn là các chuỗi rỗng.

Vì mục đích Tự viết mã hóa trực quan, hãy sử dụng NULL thay vì các chuỗi trống.


4
+1 Đây là đối số "ít ngạc nhiên nhất" đối với các nhà phát triển chống lại các chuỗi trống. Không có nhà phát triển nào đến sau sẽ mong đợi rằng các chuỗi trống sẽ được sử dụng để thể hiện "không có địa chỉ email".
Thomas

6

Trong ví dụ của bạn nếu đó là giá trị trực tiếp từ trường web - tôi sẽ sử dụng chuỗi rỗng. Nếu người dùng có thể tùy chọn chỉ định rằng anh ta không muốn cung cấp email hoặc có thể xóa nó - thì NULL.

Dưới đây là liên kết với các điểm mà bạn có thể xem xét: https://stackoverflow.com/questions/405909/null-vs-empty-when-deals-with-user-input/405945#405945

--- đã chỉnh sửa (Trả lời bình luận của Thomas) ---

Cơ sở dữ liệu không sống mà không có ứng dụng sử dụng chúng. Xác định NULL hoặc '' không có giá trị, nếu ứng dụng không thể sử dụng đúng cách.

Hãy xem xét một ví dụ trong đó người dùng điền vào biểu mẫu LONG và nhấn enter, điều đó sẽ gửi yêu cầu liên tục đến máy chủ. Anh ta có thể đang ở giữa nhập email của mình. Hầu hết có lẽ bạn muốn lưu trữ bất cứ thứ gì anh ta có trong trường email, để sau này anh ta có thể hoàn thành nó. Nếu anh ta chỉ nhập một ký tự thì sao? Điều gì nếu anh ta nhập một ký tự và sau đó xóa nó? Khi email không bắt buộc, đôi khi người dùng muốn xóa nó: cách dễ nhất để xóa trường. Ngoài ra trong trường hợp khi email không bắt buộc, nó đáng để xác nhận nó trước khi gửi.

Một ví dụ khác: người dùng cung cấp email dưới dạng spamto @ [bigcompany] .com - trong trường hợp đó không cần gửi email, ngay cả như vậy nó vẫn tồn tại và hợp lệ (và thậm chí có thể tồn tại). Gửi một cái như vậy có thể rẻ, nhưng nếu có 10K người dùng có email như vậy để đăng ký hàng ngày, thì việc xác thực như vậy có thể tiết kiệm rất nhiều thời gian.


7
-1. Cho dù cơ sở dữ liệu đang lái một trang web hay không là không liên quan. Thiết kế cơ sở dữ liệu là thế giới khác với thiết kế web. Cơ sở dữ liệu nên được thiết kế để nắm bắt sự thật về miền doanh nghiệp độc lập với giao diện được sử dụng để ghi vào nó. Theo logic của bạn, bạn có nên sử dụng null nếu ngẫu nhiên ứng dụng đầu tiên là một thực thi? Điều gì xảy ra nếu ứng dụng đầu tiên là ứng dụng web nhưng ứng dụng tiếp theo là ứng dụng di động? Thiết kế cơ sở dữ liệu để nắm bắt các sự kiện bằng cách sử dụng các quy tắc chuẩn hóa và thiết kế trang web để ghi vào nó.
Thomas

Tôi rất vui vì bạn đã học cách viết và nhận xét trên trang web này :) Tôi vẫn tin rằng DB nên hỗ trợ ứng dụng sử dụng nó. Kiểm tra câu trả lời chỉnh sửa của tôi.
Konstantin Petrukhnov

4
Cơ sở dữ liệu không sống mà không có ứng dụng sử dụng chúng. Theo kinh nghiệm của tôi, điều này chỉ đơn giản là không đúng sự thật và thiển cận. Hầu như luôn luôn cơ sở dữ liệu được sử dụng bên ngoài ứng dụng được thiết kế. Nói chung, cơ sở dữ liệu tồn tại lâu hơn các ứng dụng mà chúng được xây dựng. Cơ sở dữ liệu nên được thiết kế để thu thập thông tin về doanh nghiệp và giao diện người dùng phải được xây dựng để đọc và ghi vào cơ sở dữ liệu theo cách khác. Thiết kế quan hệ là một tư duy hoàn toàn khác so với thiết kế ứng dụng.
Thomas

2
Các ví dụ trong đó cơ sở dữ liệu không chỉ được sử dụng bởi ứng dụng gốc : báo cáo, tích hợp với các hệ thống khác.
Thomas

1
Như Thomas đã chỉ ra các DB có thể và thường được sử dụng bởi nhiều hơn một ứng dụng làm tăng thêm trọng lượng cho ý tưởng giữ sạch dữ liệu DB của bạn. Nếu bạn không muốn / không thể xử lý NULL trong ứng dụng của mình thì bạn chỉ cần thay thế chúng cho "giá trị ma thuật" (mô tả hay Thomas) ở lớp truy cập dữ liệu của bạn. Bằng cách này, bất kỳ ứng dụng nào trong tương lai muốn truy cập DB không cần biết về / tuân thủ các giá trị ma thuật của ứng dụng gốc.
uốn cong

5

Tôi nghĩ rằng câu trả lời của Dean Hardings bao gồm điều này thực sự độc đáo. Điều đó nói rằng tôi muốn đề cập rằng khi nói về NULL và chuỗi trống ở cấp DB, bạn nên suy nghĩ về các loại dữ liệu khác của mình. Bạn sẽ lưu trữ ngày tối thiểu khi không có ngày được cung cấp? hoặc -1 khi không có int được cung cấp? Lưu trữ một giá trị khi bạn không có giá trị nghĩa là bạn phải theo dõi toàn bộ phạm vi của các giá trị không. Ít nhất một cho mỗi loại dữ liệu (có thể nhiều hơn khi bạn gặp trường hợp trong đó -1 là một giá trị thực tế, do đó bạn cần phải có một số thay thế, v.v.). Nếu bạn cần / muốn làm một cái gì đó "mập mờ" ở cấp ứng dụng đó là một điều nhưng họ không cần phải làm ô nhiễm dữ liệu của bạn.


2
+1 - Đây là cái mà tôi gọi là "Giải pháp giá trị ma thuật". Chúng ta phải đưa ra một giá trị ma thuật cho từng loại dữ liệu để thể hiện sự vắng mặt của một giá trị. Ngoài ra, trong một số cột, giá trị ma thuật chung là hoặc trở thành giá trị hợp pháp và do đó cần có giá trị ma thuật mới.
Thomas

5

Thật không may, Oracle đã nhầm lẫn việc biểu diễn chuỗi VARCHAR có độ dài bằng 0 với đại diện của NULL. Cả hai đều được biểu diễn bên trong bởi một byte đơn có giá trị 0. Điều này làm cho cuộc thảo luận khó khăn hơn nhiều.

Rất nhiều sự nhầm lẫn xung quanh NULL xoay quanh logic ba giá trị . Hãy xem xét các mã giả sau đây:

if ZIPCODE = NULL
    print "ZIPCODE is NULL"
else if ZIPCODE <> NULL
    print "ZIPCODE is not NULL"
else print "Something unknown has happened"

Bạn sẽ không mong đợi thông điệp thứ ba, nhưng đó là những gì bạn sẽ nhận được, theo ba logic có giá trị. Ba logic có giá trị dẫn mọi người tới nhiều lỗi.

Một nguồn gây nhầm lẫn khác là rút ra những suy luận từ việc không có dữ liệu, như vẽ một suy luận từ con chó không sủa trong đêm. Thông thường những suy luận này không phải là những gì nhà văn của NULL dự định cnvey.

Phải nói rằng, có rất nhiều tình huống mà NULL xử lý việc không có dữ liệu tốt và tạo ra kết quả chính xác mà bạn muốn. Một ví dụ là khóa ngoại trong các mối quan hệ tùy chọn. Nếu bạn sử dụng NULL để biểu thị không có mối quan hệ nào trong một hàng nhất định, hàng đó sẽ thoát khỏi liên kết bên trong, giống như bạn mong đợi.

Ngoài ra, hãy lưu ý rằng ngay cả khi bạn tránh hoàn toàn NULLS trong dữ liệu được lưu trữ (dạng thông thường thứ sáu), nếu bạn thực hiện bất kỳ phép nối ngoài nào, bạn vẫn sẽ phải đối phó với NULLS.


4

Sử dụng Null.

Không có điểm nào để lưu trữ giá trị '', khi chỉ cần làm cho trường trong bảng không thể thực hiện được. Nó làm cho các truy vấn rõ ràng hơn quá.

Truy vấn SQL nào rõ ràng và dễ đọc hơn nếu bạn muốn tìm người dùng có địa chỉ email?

  1. SELECT * FROM Users WHERE email_address != ''

  2. SELECT * FROM Users WHERE email_address IS NOT NULL

  3. SELECT * FROM Users WHERE email_address != '' and email_address IS NOT NULL

Tôi sẽ nói 2 là. Mặc dù 3 mạnh hơn trong trường hợp dữ liệu xấu được lưu trữ.

Đối với trường hợp địa chỉ email trên biểu mẫu, là tùy chọn, nó cũng sẽ được phản ánh trong bảng. Trong SQL, đó là một trường không thể, có nghĩa là nó không được biết đến.

Tôi không thể nghĩ ra bất kỳ giá trị kinh doanh hợp lý nào trong việc lưu trữ một chuỗi trống trong một bảng khác với thiết kế đơn giản là xấu. Nó giống như lưu trữ một giá trị chuỗi là 'NULL' hoặc 'BLANK' và có các nhà phát triển cho rằng đó là null hoặc chuỗi rỗng. Đối với tôi, đó là thiết kế tồi. Tại sao lưu trữ khi có NULL ??

Chỉ cần sử dụng NULL, và bạn sẽ khiến mọi người hạnh phúc hơn một chút.

THÊM THÔNG TIN:

SQL sử dụng hệ thống logic ba giá trị: Đúng, Sai và Không xác định.

Để giải thích rõ hơn và chi tiết hơn, tôi khuyên các nhà phát triển nên đọc: Truy vấn SQL - ngoài TRUE và FALSE .


3

đối với câu hỏi kỹ thuật cụ thể, vấn đề không phải là null so với chuỗi rỗng, đó là lỗi xác thực . Một chuỗi trống không phải là một địa chỉ email hợp lệ!

đối với câu hỏi triết học, câu trả lời tương tự: xác nhận đầu vào của bạn. Nếu một chuỗi rỗng là một giá trị hợp lệ cho trường được đề cập, thì hãy mong đợi nó và mã cho nó; nếu không, sử dụng null.

Một chuỗi rỗng sẽ là một đầu vào hợp lệ để trả lời câu hỏi: Mime đã nói gì với hươu cao cổ?


Ngay cả với mục đích tốt nhất trên thế giới, xác nhận có thể không giải quyết được vấn đề này - anh ta vẫn có thể phải sử dụng một phương thức xử lý các hàng trong đó tất cả các cột phải được cung cấp với một loại giá trị nào đó. Trong trường hợp đó, câu hỏi sẽ vẫn còn - nên sử dụng giá trị nào khi không có giá trị? Và câu trả lời tất nhiên sẽ là: giá trị chỉ ra không có giá trị. Trong DB này thường là NULL.
jmoreno

2

Tôi có thể nghĩ ra một lý do để có NULL và chuỗi trống:

  • Bạn có địa chỉ email hợp lệ: me@example.com
  • Bạn không có ai (và có lẽ nên yêu cầu một): NULL
  • Bạn biết rằng người này không có địa chỉ email: Empty String.

Tuy nhiên tôi sẽ không khuyến nghị điều đó và sử dụng một trường riêng cho việc hỏi xem bạn có biết rằng không có gì tồn tại hay không.


1

Câu hỏi theo tôi hiểu là, nên chọn cách giải thích nào về NULL và chuỗi rỗng. Điều này phụ thuộc vào số lượng trạng thái của trường particualar.

Việc giải thích phụ thuộc vào cách cơ sở dữ liệu đang được truy cập. Nếu có một lớp trong mã tóm tắt hoàn toàn cơ sở dữ liệu, thì việc chọn bất kỳ chính sách nào (bao gồm cả hai coulmn) hoạt động là hoàn toàn chấp nhận được. (Tuy nhiên, rõ ràng tài liệu chính sách là quan trọng). Tuy nhiên, nếu cơ sở dữ liệu đang được truy cập ở một số nơi, thì bạn nên sử dụng một sơ đồ rất đơn giản, vì mã sẽ khó bảo trì hơn và có thể bị lỗi trong trường hợp này.


1

Về cơ bản, ở mức logic, không có sự khác biệt giữa giá trị "không hợp lệ" và "không có đầu vào của người dùng", hầu hết chúng chỉ là "trường hợp đặc biệt". Trường hợp lỗi.

Có null mất không gian bổ sung: ceil (Cột_with_null / 8) tính bằng byte / mỗi hàng.

Ô trống và null đều là cách để đánh dấu một cái gì đó sai / nên được mặc định. Tại sao bạn cần 2 trạng thái "sai"? Tại sao sử dụng NULL nếu chúng chiếm không gian bổ sung và có nghĩa chính xác giống như chuỗi trống? Điều đó sẽ chỉ gây ra sự nhầm lẫn và dư thừa khi bạn có hai ý nghĩa (có thể có nghĩa) giống hệt nhau, thật dễ dàng để quên rằng bạn nên sử dụng NULL thay vì chuỗi rỗng (ví dụ: người dùng sử dụng một số trường).

Và dữ liệu của bạn có thể trở thành một mớ hỗn độn. Trong một thế giới hoàn hảo, bạn sẽ nói "dữ liệu sẽ luôn chính xác và tôi sẽ nhớ" ... nhưng khi mọi người phải làm việc trong một nhóm và không phải ai cũng chính xác ở cấp độ của bạn thì không có gì lạ khi thấy WHERE (aa. xx <> '' VÀ bb.zz KHÔNG PHẢI)

Vì vậy, thay vì sửa các thành viên trong nhóm của tôi mỗi ngày, tôi chỉ thực thi quy tắc đơn giản. Không có giá trị null, KHÔNG BAO GIỜ!

Đếm các giá trị NON-NULL nhanh hơn ... câu hỏi đơn giản là bạn cần làm điều đó để làm gì?


Tôi mơ hồ nhớ lại việc đọc ở đâu đó rằng sử dụng NULL thực sự là một chi phí (cả về tính toán và lưu trữ) cho cơ sở dữ liệu. Vì vậy, điểm tốt trong việc đưa công thức đó lên.
Jacek Prucia

Đừng quên rằng một VARCHARcột sẽ mất ít nhất 1 byte để lưu trữ độ dài của chuỗi, ngay cả khi nó bằng không.
dan04

Ô trống và null đều là cách để đánh dấu một cái gì đó sai . Không đúng. Null là một cách để chỉ sự vắng mặt của một giá trị. Tôi đặt cược hầu hết RDBMS sử dụng một mảng bit trên mỗi hàng để chỉ ra cột nào là null. Do đó, không gian bổ sung rất nhỏ đến mức không liên quan. Lo lắng về việc xử lý bổ sung là tối ưu hóa sớm và sẽ không là gì so với các cú va chạm tốc độ được tạo ra để các nhà phát triển khác "khám phá" rằng bạn đã cố tình sử dụng các chuỗi trống.
Thomas

3
Không có giá trị null . Đây là cách tiếp cận đà điểu. "Chúng tôi sẽ cắm đầu vào cát và tuyên bố rằng các giá trị vắng mặt không tồn tại". Điều đó thường dẫn đến Giải pháp giá trị ma thuật nơi bạn phải đưa ra một giá trị ma thuật cho từng loại dữ liệu để thể hiện sự vắng mặt của một giá trị.
Thomas

1

Tôi có xu hướng xem nó không phải từ góc độ DB mà từ góc độ chương trình. Tôi biết rằng câu hỏi này dành cho nhấp chuột SQL nhưng thực sự, có bao nhiêu người dùng truy cập dữ liệu trực tiếp nữa?

Trong một chương trình tôi không thích null / không có gì. Có một vài ngoại lệ nhưng chúng chỉ có vậy. Và những ngoại lệ đó thực sự chỉ là những triển khai tồi.

Vì vậy, nếu người dùng không gửi email, cần có một cái gì đó xác định xem điều này có hợp lệ hay không. Nếu một email trống là tốt thì nó sẽ hiển thị một chuỗi trống. Nếu người dùng không đặt email và vi phạm quy tắc, đối tượng sẽ chỉ ra điều này.

Ý tưởng về null có ý nghĩa là trường học cũ và là thứ mà các lập trình viên hiện đại phải làm việc xung quanh.

Ngay cả trong thiết kế DB, tại sao trường email không thể cho phép null và có chuỗi có độ dài bằng 0 và có trường khác cho biết người dùng có nhập gì không? Là một bit mà nhiều để hỏi về một DBMS? Theo tôi, DB không nên xử lý logic nghiệp vụ cũng như logic hiển thị. Nó không được chế tạo cho điều đó và do đó làm rất kém công việc xử lý nó.


tại sao trường email không thể cho phép null và có chuỗi có độ dài bằng không - Nói một cách đơn giản: bởi vì bất kỳ nhà phát triển nào biết bất cứ điều gì về cơ sở dữ liệu sẽ không bao giờ mong đợi rằng chuỗi rỗng có ý nghĩa kỳ diệu. Bạn đang cố gắng tạo ra giá trị ma thuật của riêng mình để thể hiện những gì về cơ bản đã tồn tại trong mọi cơ sở dữ liệu: một khái niệm để thể hiện sự vắng mặt của một giá trị. Tại sao phải phát minh lại bánh xe? Ngoài ra, ý tưởng về NULLS là rất xa, rất xa so với trường học cũ. Nulls là chìa khóa để hiểu thiết kế cơ sở dữ liệu quan hệ.
Thomas

CƯỜI NGẢ NGHIÊNG. Giống như tôi đã nói từ góc độ lập trình viên, hầu như luôn luôn là một nỗi đau ở mông và hầu như không bao giờ cần thiết cho KINH DOANH LOGIC. Cá nhân tôi, là một nhà phát triển, không quan tâm nhiều đến thiết kế quan hệ. Nếu tôi làm tôi sẽ là một anh chàng DB. Nếu tôi nhận được null từ DB, tôi hầu như luôn chuyển đổi nó thành thứ gì đó hợp lý, giống như một chuỗi rỗng, sau đó hãy để thiết kế OOP vinh quang của tôi làm điều đó thật kỳ diệu. Khung này quan tâm đến những lực lượng DBA ngớ ngẩn trên thế giới. Tôi biết DB dudes phải đối phó với nó và tôi cảm thấy cho bạn. Nhưng là một lập trình viên, tôi không phải làm thế. Tôi có giải pháp tốt hơn.
ElGringoGrande

Bạn "không bao giờ" phải đối phó với null. Vì vậy, những gì bạn mô tả là giải pháp đà điểu kết hợp với giải pháp giá trị kỳ diệu. "Tôi sẽ bỏ qua thực tế là các giá trị vắng mặt tồn tại và tôi sẽ chuyển đổi tất cả các số nguyên null thành -1". Cho đến ngày đến khi -1 là một giá trị thực. Cần lưu ý rằng một trong những lý do MS thêm tướng vào .NET là để giải quyết sự không phù hợp trở kháng lớn giữa cơ sở dữ liệu và mã ứng dụng và chủ yếu xoay quanh việc thể hiện null trong mã trung cấp. Những "null ngớ ngẩn" đó cũng tồn tại trong logic kinh doanh.
Thomas

Việc một số nguyên không có trong db (hoặc là null) không có nghĩa là tôi phải biểu diễn nó bằng -1 hoặc evan một nullable (int). Nếu bạn nghĩ rằng đó là cách duy nhất để đối phó với null thì bạn không hiểu lập trình rất tốt. Hãy nhớ null không giống như không có gì. Giống như bạn đã nói, null đại diện cho một người giữ chỗ cho các giá trị vắng mặt trong một số loại cấu trúc dữ liệu. Nó có nghĩa là một cái gì đó. Logic kinh doanh hiếm khi (không giống như không bao giờ) cần khái niệm này bởi vì nó là về beahvior, không phải dữ liệu. Và khi nó null thì hiếm khi là cách tốt nhất để thể hiện điều này.
ElGringoGrande

Ngay cả logic kinh doanh cũng phải tính đến (có nghĩa là đại diện) các giá trị vắng mặt và điều đó đúng với kinh nghiệm của tôi, trong hầu hết mọi hệ thống tôi đã thấy hoặc xây dựng trong 20 năm qua. Cơ sở dữ liệu đang mô hình hóa các sự kiện kinh doanh sẽ được nắm bắt và lưu trữ. Nếu logic nghiệp vụ muốn có thể tương tác với cơ sở dữ liệu thì nó phải biết cách xử lý null. Cho dù đó là một cấu trúc tùy chỉnh, giá trị ma thuật hoặc chung chung là không liên quan. Logic nghiệp vụ cần khả năng xử lý việc nhận một giá trị vắng mặt từ cơ sở dữ liệu và khả năng đánh dấu một giá trị là không có trong cơ sở dữ liệu.
Thomas

-1

Tôi không nghĩ nó quan trọng lắm, nhưng tôi thích nó hơn khi có NULL ở đó.

Khi tôi xem dữ liệu được hiển thị trong một bảng (như trong SQL Server Management Studio), tôi có thể phân biệt tốt hơn một giá trị bị thiếu nếu nó nói NULL và nền có màu khác nhau.

Nếu tôi thấy một khoảng trống, tôi luôn tự hỏi liệu nó có thực sự trống không hoặc có một số khoảng trắng hoặc một số ký tự vô hình. Với NULL, nó được đảm bảo trống ngay từ cái nhìn đầu tiên.

nhập mô tả hình ảnh ở đây

Tôi thường không phân biệt các giá trị trong ứng dụng, bởi vì thật bất ngờ và kỳ lạ khi NULL và chuỗi rỗng có nghĩa là một cái gì đó khác nhau. Và hầu hết thời gian, tôi thực hiện một phương pháp phòng thủ và chỉ đối phó với cả hai tiểu bang. Nhưng đối với tôi là một con người, NULL dễ xử lý hơn khi xem dữ liệu.


điều này dường như không cung cấp bất cứ điều gì đáng kể qua các điểm được thực hiện và giải thích trong 12 câu trả lời trước
gnat

@gnat: Tôi không đồng ý, chưa có ai trong câu trả lời đề cập đến khía cạnh con người xem dữ liệu. Chỉ có một giá trị NULL duy nhất, nhưng có thể có nhiều giá trị trông giống như một chuỗi rỗng (không chỉ là khoảng trắng, mà còn có rất nhiều ký tự unicode có hành vi kỳ lạ). Tôi không thể thấy bất kỳ câu trả lời nào khác đề cập đến khía cạnh này của vấn đề.
Tom Pažourek

như xa như tôi có thể nói điều này là khá tốt đặt ra trong câu trả lời đầu thứ hai mà đã được đăng cách đây 5 năm: "Rõ ràng cho bất kỳ lập trình viên nhìn vào một cơ sở dữ liệu ..." vv
một loại muôi

@gnat: Tôi thấy quan điểm của bạn, mặc dù tôi nghĩ rằng tác giả không có ý nghĩa tương tự. Tôi tin rằng anh ta nói nhiều hơn về NULL ngụ ý các trường tùy chọn, nhưng chuỗi trống cũng có thể được sử dụng cho các trường bắt buộc, do đó NULL hợp lý hơn cho giá trị bị thiếu. Tôi đồng ý với anh ấy. Nhưng câu trả lời của tôi chỉ ra thực tế là chuỗi rỗng không rõ ràng như giá trị NULL, bởi vì nhiều thứ có thể trông giống như chuỗi rỗng ngay từ cái nhìn đầu tiên trong khi thực tế không phải là chuỗi rỗng.
Tom Pažourek
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.