2009-06-23 27 views
17

Tôi chỉ đang bước vào một dự án và nó có một cơ sở dữ liệu khá lớn. Tôi đã bắt đầu đào bới thông qua cơ sở dữ liệu này và 95% các trường là vô giá trị.Có phải lạm dụng các cột không có giá trị trong cơ sở dữ liệu là "mã ngửi" không?

Thực tiễn này có bình thường trong thế giới cơ sở dữ liệu không? Tôi chỉ là một lập trình viên thấp, không phải là một DBA, nhưng tôi nghĩ bạn sẽ muốn giữ các trường rỗng ở mức tối thiểu, chỉ khi chúng có ý nghĩa.

Đây có phải là "mã ngửi" nếu hầu hết các cột không có giá trị không?

+1

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. –

Trả lời

1

Thực hành tốt nhất, nếu cột không được rỗng, thì cột phải được đánh dấu như vậy. Tuy nhiên, tôi không tin vào việc hoàn toàn điên rồ với những thứ như thế này.

1

Tôi nghĩ vậy. Nếu bạn không cần dữ liệu thì điều đó không quan trọng đối với doanh nghiệp của bạn. Nếu điều quan trọng đối với doanh nghiệp của bạn, điều đó là bắt buộc.

+0

Chắc chắn, số thẻ tín dụng là bắt buộc trước khi người dùng có thể mua bất kỳ thứ gì (ví dụ) nhưng họ vẫn được phép lưu các thuộc tính khác và sau đó thêm số thẻ tín dụng sau đó. Nếu bạn chặn họ nhập dữ liệu * any * vì họ không có các trường bắt buộc, điều đó sẽ khiến họ thất vọng. –

+1

Đó là lý do tại sao những thứ đó không thuộc về cùng một bảng, không phải lý do tại sao số thẻ tín dụng phải được vô hiệu hóa trong bảng thẻ tín dụng, đúng không? –

+0

Nó chỉ là một ví dụ. Vấn đề là có thể có các thuộc tính của một bảng đã cho quan trọng đối với doanh nghiệp của bạn, nhưng không phải là cho toàn vẹn dữ liệu. –

16

Giá trị mặc định thường là ngoại lệ và NULL là tiêu chuẩn, theo kinh nghiệm của tôi.

True, nulls gây phiền nhiễu.

Nó cũng cực kỳ hữu ích vì null là chỉ báo tốt nhất của "NO VALUE". Giá trị mặc định cụ thể là rất gây hiểu lầm và bạn có thể mất thông tin hoặc giới thiệu nhầm lẫn trên đường.

+1

OP không nói nếu chúng đang sử dụng MySQL. Hướng dẫn sử dụng MySQL cho biết: "Khai báo các cột thành NOT NULL nếu có thể. Nó làm cho các hoạt động SQL nhanh hơn, bằng cách cho phép sử dụng các chỉ mục tốt hơn và loại bỏ chi phí để kiểm tra xem mỗi giá trị có phải NULL hay không. ... "http://dev.mysql.com/doc/refman/5.5/en/data-size.html –

7

Không biết nếu tôi coi nó luôn luôn là một điều xấu, nhưng nếu các cột đang được thêm vì một bản ghi (hoặc có thể một vài) cần phải có giá trị trong khi hầu hết không, sau đó nó chỉ ra một căn hộ khá cấu trúc bảng. Nếu bạn thấy các tên cột như "addr1", "addr2", "addr3", thì nó sẽ bốc mùi!

Tôi sẽ đặt cược rằng hầu hết các cột bạn có thể bị xóa và được trình bày trong các bảng khác. Bạn có thể tìm thấy những cái "không rỗng" thông qua một mối quan hệ khóa ngoại. Điều này sẽ làm tăng sự tham gia mà bạn sẽ làm, nhưng nó có thể là preformant hơn mà làm một "nơi không col1 là null".

+1

Làm cách nào bạn lưu trữ các dòng khác nhau của một địa chỉ ngoài các cột có tên là addr1, addr2, addr3? (HOẶC bạn đang đề cập đến 3 địa chỉ đầy đủ riêng biệt?) Địa chỉ là một trong những trường hợp ví dụ tiêu chuẩn cho các giá trị rỗng. Một số địa chỉ có 2 dòng, một số có 6. – jmucchiello

+2

Tôi diễn giải Addr1 thông qua AddrX để giữ chỗ cho gửi thưThêm, vật lýThêm, làm việcĐịa chỉ, xmasAddress, vv Nếu không, nó sẽ là AddrLine1, AddrLine2. –

+0

Vâng, có thể địa chỉ là một ví dụ tồi - có lẽ nên sử dụng số điện thoại. Những gì thường hiển thị (trong lược đồ xấu) là "homeaddr", "workaddr", "vacationaddr", "otheraddr", "otheraddr2", v.v., tất cả vì một bản ghi cần "workaddr", một bản ghi khác cần "vacationaddr" (không có " workaddr "), v.v. AddrLine1 và AddrLine2 là tốt. –

1

Điều này hoàn toàn phụ thuộc vào phạm vi và yêu cầu của dự án. Tôi sẽ không sử dụng số lượng các trường nullable một mình như một số liệu cho mã kém hoặc được thiết kế. Có một cái nhìn tại các lĩnh vực kinh doanh, nếu có nhiều trường không nullable đại diện ở đó có nullable trong cơ sở dữ liệu, sau đó bạn có một số vấn đề.

2

Không, có hay không một trường nên là rỗng là một khái niệm dữ liệu và không thể là một mùi mã. Có hoặc không NULLs gây phiền nhiễu cho mã không có gì để làm với sự hữu ích của việc có các trường dữ liệu nullable.

2

Chúng là mùi (rất phổ biến), tôi sợ. Tra cứu C.J. Viết các bài viết về chủ đề.

+0

Thật sao? C. J. Date nghĩ rằng NULL không phải là một phần hợp pháp của mô hình quan hệ, và thậm chí nếu chúng được, được thực hiện sai trong SQL. Vì vậy, tác phẩm của ông về chủ đề này có thể được coi là một ý kiến ​​cực đoan. –

+3

Chúng có thể được coi là một ý kiến ​​cực đoan nếu nó không phải vì thực tế là anh ta đúng, và có một trường hợp kín đáo khá nhiều cho lý do tại sao anh ta đúng (ít nhất là "[nulls] được thực hiện sai trong SQL" đi). Một trình tạo kiểu như Tùy chọn hoặc Có thể (hoặc bất kỳ thứ gì bạn muốn gọi nó) là một điều hữu ích, nhưng khi Thiếu = Thiếu đánh giá thành một boolean thứ ba được gọi là Không biết với tất cả các thuộc tính bất thường và không nhất quán, đó là một vấn đề đối với mọi người (bao gồm trình tối ưu hóa). –

13

Bất kỳ ai đã phát triển ứng dụng nhập dữ liệu đều biết mức độ phổ biến của một số trường không được biết tại thời điểm nhập - ngay cả đối với các cột quan trọng về kinh doanh, để giải quyết câu trả lời của @Chris McCall.

Tuy nhiên, "mã ngửi" chỉ là một chỉ báo cho thấy một số thứ có thể được mã hóa theo cách cẩu thả. Bạn sử dụng mùi để xác định những thứ cần điều tra nhiều hơn, không nhất thiết là những thứ phải được thay đổi.

Vì vậy, có, nếu bạn thấy các cột có thể vô hiệu hóa một cách nhất quán, bạn có quyền nghi ngờ. Nó có thể cho biết rằng ai đó đang lười biếng hoặc sợ tuyên bố NOT NULL cột một cách rõ ràng. Bạn có thể biện minh cho việc phân tích của riêng mình.

5

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 CommentNOT 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:

  1. NULL s yêu cầu logic đặc biệt trong SQL và kỹ thuật này tránh điều đó.
  2. 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.

+5

Tôi phải không đồng ý. NULL có nghĩa là không xác định, bất kể kiểu dữ liệu của cột. Nó luôn luôn nên được sử dụng để có nghĩa là không rõ, và các giá trị ma thuật như chuỗi rỗng không bao giờ nên được sử dụng để có nghĩa là không rõ. –

+0

Mặt khác, nếu chúng ta biết rằng người dùng đã chọn không để lại nhận xét, tại sao chúng ta sẽ sử dụng cái gì đó có nghĩa là "không rõ" để biểu thị kiến ​​thức đó? –

+0

@ john-saunders Tùy thuộc vào miền. Một chuỗi có độ dài bằng không trong một trường nhận xét có thể đại diện cho một giá trị rất rõ ràng, được xác định rất rõ ràng: "không có bình luận". Điều này hoàn toàn khác với "không xác định". Tuy nhiên, đây là những trò chơi ngữ nghĩa mà ngay cả Tiến sĩ Codd cũng đã chơi. Sau đó ông đã đưa ra một số lựa chọn thay thế để NULL để chỉ ra những thứ như không rõ, mất tích, vv Điều quan trọng ở đây là * nhất quán *. –

1

Theo kinh nghiệm của tôi, đó là vấn đề khi Null và Not Null không khớp với trường bắt buộc/trường bắt buộc.

Đó là trong lĩnh vực khả năng rằng những người thực sự là tất cả các lĩnh vực tùy chọn. Nếu bạn tìm thấy trong tầng kinh doanh hoặc tầng UI mà các trường đó là bắt buộc, thì tôi nghĩ điều này có nghĩa là mô hình dữ liệu đã trôi khỏi mô hình đối tượng nghiệp vụ và là dấu hiệu của các chính sách thay đổi DB hoặc giám sát quá mức.

Nếu bạn chạy trình tạo dữ liệu mẫu trên dữ liệu của mình và sau đó thử tải dữ liệu hợp lệ theo SQL, bạn sẽ tìm ra ngay lập tức nếu các quy tắc phù hợp.

0

Điều đó có vẻ như rất nhiều, điều đó có thể có nghĩa là bạn ít nhất nên điều tra. Lưu ý rằng nếu đây là sản phẩm trưởng thành với rất nhiều dữ liệu, thuyết phục mọi người thay đổi cấu trúc có thể khó khăn. Trước đó trong giai đoạn thiết kế bạn nắm bắt một cái gì đó như thế này dễ dàng hơn là để sửa chữa lên tất cả các mã có liên quan để điều chỉnh cho sự thay đổi.

Cho dù có xấu hay không, phụ thuộc vào việc các cột có cho phép null giống như các bảng có liên quan (điện thoại nhà, điện thoại di động, điện thoại doanh nghiệp, vv) hay không. trông giống như những thứ có thể không áp dụng được cho tất cả các bản ghi (có thể có thể liên quan đến bảng có quan hệ một-một) hoặc có thể không được biết tại thời điểm nhập dữ liệu (có thể là ok). Tôi cũng sẽ kiểm tra xem liệu chúng có thực sự alwAys không có giá trị (sau đó bạn có thể thay đổi thành không null nếu thông tin được yêu cầu thực sự bởi logic busniess). Nếu bạn có một vài bản ghi có null

0

Theo kinh nghiệm của tôi, một trường vô giá trị lớn trong cơ sở dữ liệu lớn như bạn có là rất bình thường. Xem xét nó có lẽ được sử dụng bởi rất nhiều ứng dụng được viết bởi những người khác nhau. Làm cho các cột nullable là gây phiền nhiễu nhưng nó có lẽ là cách tốt nhất để giữ cho ứng dụng mạnh mẽ.

+1

Nó rất trầm trọng; nó không tốt, và nói chung không làm cho ứng dụng trở nên mạnh mẽ. –

0

Một trong nhiều cách để ánh xạ thừa kế (ví dụ C# objects) vào cơ sở dữ liệu là tạo bảng cho lớp ở đầu hệ thống phân cấp, sau đó thêm các cột cho tất cả các lớp khác. Các cột phải được vô hiệu hóa khi một đối tượng của một lớp con khác được lưu trữ trong cơ sở dữ liệu. Điều này được gọi là Single-table inheritance mapping (hoặc Map Hierarchy To A Single Table) và là mẫu thiết kế chuẩn.

Một hiệu ứng phụ của ánh xạ thừa kế một bảng là hầu hết các cột đều không có giá trị.


Cũng trong Oracle một chuỗi rỗng (0 độ dài) được coi là rỗng, do đó trong một số công ty, tất cả các cột chuỗi đều được tạo vô hiệu ngay cả trên SqlServer. (chỉ vì khách hàng đầu tiên muốn phần mềm trên SqlServer không có nghĩa là khách hàng thứ 2 không có một DBA Oracle mà sẽ không cho phép SqlServer lên mạng đó)

+0

Tuy nhiên, khi đến giai đoạn mà hầu hết các cột đều là rỗng, tôi nghĩ đã đến lúc xem xét ánh xạ tới nhiều bảng. Điều đó sẽ làm cho nó có thể thực thi một số ràng buộc trên các bảng dẫn xuất. –

+0

Nhưng thay đổi hệ thống ORM, ứng dụng sử dụng có thể là một rủi ro lớn. Cuối cùng, cơ sở dữ liệu là có để phục vụ các ứng dụng không phải là cách khác tròn.(Tôi là một lập trình viên C# không phải là một DBA sau khi tất cả) –

+0

Ai nói bất cứ điều gì về việc thay đổi hệ thống ORM? Chỉ cần thay đổi cách ORM ánh xạ tới cơ sở dữ liệu bên dưới. Bên cạnh đó, điều này có thể cho phép các ràng buộc bổ sung được thực thi, nâng cao chất lượng của toàn bộ hệ thống. –

8

Tôi thuộc trại Extreme NO: Tôi tránh tất cả các NULL thời gian. Bỏ qua những cân nhắc cơ bản về những gì chúng thực sự có ý nghĩa (bởi vì nói chuyện với những người khác nhau, bạn sẽ nhận được những câu trả lời khác nhau như "không có giá trị", "giá trị không rõ", "mất tích", "con mèo gừng của tôi gọi là Null") Nguyên nhân NULL là chúng thường làm hỏng truy vấn của bạn theo những cách bí ẩn.

Tôi đã mất số lần tôi phải gỡ lỗi truy vấn của ai đó (được, có thể là 9) và truy vấn sự cố để tham gia vào NULL. Nếu mã của bạn cần ISNULL để sửa chữa tham gia thì cơ hội là bạn cũng đã mất khả năng áp dụng chỉ mục và hiệu suất với nó.

Nếu bạn do phải lưu trữ giá trị "thiếu/không xác định/null/cat" (và đó là điều tôi muốn tránh), tốt hơn là nên rõ ràng về điều đó.

Những người có kỹ năng tại NULL có thể không đồng ý. NULL sử dụng có xu hướng chia SQL đám đông xuống giữa.

Theo kinh nghiệm của tôi, sử dụng NULL nặng có tương quan thuận với việc lạm dụng cơ sở dữ liệu nhưng tôi sẽ không khắc nó vào máy tính bảng đá như một số luật tự nhiên. Kinh nghiệm của tôi chỉ là kinh nghiệm của tôi.

CHỈNH SỬA: Ý tưởng bổ sung.Có thể là những người chống phân biệt chủng tộc chống null như bản thân mình càng vui mừng hơn khi bình thường hóa hơn những người ủng hộ NULL. Tôi không nghĩ rằng những người bình thường dại dột sẽ quá hạnh phúc với các cạnh rách rưới trên bàn của họ có thể lấy NULL. Rất nhiều null có thể chỉ ra rằng các nhà phát triển cơ sở dữ liệu không phải là bình thường hóa nặng. Vì vậy, thay vì mã đề xuất NULL là "xấu", nó có thể thay thế cho thấy vị trí triết học của các nhà phát triển về bình thường hóa. Có lẽ đây là đạt. Chỉ là một ý nghĩ.

+1

Bạn cảm thấy thế nào về giá trị số nguyên không, kết quả là lỗi chia theo số không khi được sử dụng không đúng cách? Điều này có nghĩa là chúng ta không nên cho phép sử dụng số không? –

+1

Ngoài ra, ví dụ mèo của bạn là giả mạo. Chuỗi 'Null' không giống như một NULL NULL. Nhưng nó làm cho tôi tự hỏi làm thế nào bạn muốn làm cho một poster tìm kiếm con mèo đó nếu nó bị mất tích. ;-) –

+0

Nếu đó là con mèo của Schrodinger, thì nó có thể còn sống hoặc đã chết, do đó, nó có liên quan trong một loại "nó là gì?" way =) Div bởi zero lỗi là nhất quán, trong khuôn mặt của bạn và khá rõ ràng; đó là một vấn đề số học cơ bản mà bạn phải sống cùng. NULL có xu hướng lén lút như một ninja, bạn không chắc chắn bạn đã có một vấn đề NULL cho đến khi bạn đã có - cộng với hành vi tham gia NULL có thể không phù hợp trên nền tảng. Tôi cho rằng nó không phải là một khái niệm cơ bản với ý nghĩa dứt khoát và tập hợp các hành vi tiêu chuẩn, không giống như div bằng không. (Và 'Null'! = SQL NULL đã bắt được nhiều dev ra) –

4

Tóm lại, tôi sẽ nói có, đây có lẽ là một mùi mã.

Cho dù cột có thể vô hiệu hóa hay không là rất quan trọng và cần được xác định cẩn thận. Câu hỏi nên được đánh giá cho mỗi cột. Tôi không phải là người tin tưởng vào một "thực hành tốt nhất" mặc định cho NULL. Các "thực hành tốt nhất" cho tôi là để giải quyết triệt để triệt để trong thiết kế và/hoặc tái cấu trúc của bảng.

Để bắt đầu, không cột nào trong số các cột chính của bạn sẽ bị vô hiệu. Sau đó, tôi mạnh mẽ nghiêng về phía NOT NULL cho bất cứ điều gì đó là một chìa khóa nước ngoài.

Một số điều khác tôi xem xét:

Tiêu chuẩn nơi NULL nên tránh mạnh: money cột - là có thực sự một khả năng rằng số tiền này sẽ chưa biết?

Tiêu chuẩn nơi NULL có thể được biện minh thường xuyên nhất: datetime cột - không có ngày dành riêng, vì vậy NULL là một cách hiệu quả lựa chọn tốt nhất của bạn

kiểu dữ liệu khác: char/varchar cột - cho mã/số nhận dạng - NOT NULL hầu như độc quyền int cột - chủ yếu là NOT NULL trừ khi nó giống như "số lượng trẻ em" nơi bạn muốn phân biệt phản hồi không xác định.

0

Để ném ý kiến ​​trái ngược ở ngoài đó. Mỗi trường đơn lẻ trong cơ sở dữ liệu nên vô hiệu. Không có gì bực bội hơn là làm việc với một cơ sở dữ liệu mà trên mỗi chèn đơn ném một ngoại lệ về yêu cầu này hoặc yêu cầu đó. Không cần gì cả.

Có một ngoại lệ đối với khóa đó. Rõ ràng tất cả các khóa chính và khóa ngoài nên được thực thi để tồn tại.

Công việc của ứng dụng phải xác thực dữ liệu và cơ sở dữ liệu đơn giản là lưu trữ và truy xuất những gì bạn cung cấp. Có quá trình xử lý logic hợp lệ, thậm chí đơn giản như null hoặc không null làm cho một dự án phức tạp hơn để duy trì các quy tắc khác nhau trải rộng trên mọi thứ.

Các vấn đề liên quan