Một bảng một cột có thiết kế tốt không? [đóng cửa]


111

Có ổn không khi có một bảng chỉ với một cột? Tôi biết nó không phải là bất hợp pháp về mặt kỹ thuật, nhưng nó có bị coi là thiết kế kém không?

BIÊN TẬP:

Đây là vài ví dụ:

  • Bạn có một bảng với 50 mã tiểu bang hợp lệ của Hoa Kỳ, nhưng bạn không cần phải lưu trữ các tên tiểu bang dài dòng.
  • Một danh sách đen email.

Ai đó đã đề cập đến việc thêm một trường chính. Theo cách tôi thấy, cột đơn này SẼ là khóa chính.


Tôi gặp một chút khó khăn khi hình dung ca sử dụng cho một bảng chỉ có một cột duy nhất. Bạn có thể đưa ra một ví dụ không?
Paul Morie

nhưng ít nhất không tạo Chỉ mục cho nó!
Sathya

3
Mã tiểu bang của Hoa Kỳ là ví dụ cổ điển về việc xác định miền
Quassnoi

3
Tôi đã thấy một bảng cơ sở dữ liệu được sử dụng để giữ giá trị khóa cho một ứng dụng trước đây
Russ Cam

Việc sử dụng của tôi cho mẫu này là tạo các tập hợp dữ liệu. Mỗi bản ghi trong bảng chính có một trường SET. Các bản ghi có cùng SET được kết nối. Làm thế nào để bạn chèn nhiều bản ghi với cùng một SET? 'INSERT INTO đặt VALUES ()' và sau đó sử dụng ID chèn cuối cùng làm ID SET của bạn để đính kèm vào các bản ghi. Sau đó, một lần nữa, có thể tôi đã sử dụng UUID, nhưng có điều gì đó không ổn về điều đó.
William Entriken

Câu trả lời:


87

Vâng, chắc chắn là thiết kế tốt để thiết kế một cái bàn sao cho hiệu quả nhất. "Thiết kế RDBMS tồi" thường tập trung vào sự kém hiệu quả.

Tuy nhiên, tôi nhận thấy rằng hầu hết các trường hợp thiết kế một cột có thể được hưởng lợi từ một cột bổ sung. Ví dụ: Mã tiểu bang thường có thể có tên Tiểu bang đầy đủ được viết trong cột thứ hai. Hoặc một danh sách đen có thể có các ghi chú liên quan. Nhưng, nếu thiết kế của bạn thực sự không cần thông tin đó, thì bạn hoàn toàn có thể có cột đơn.


168

Về mặt điều relational algebranày sẽ là quan hệ một ngôi, có nghĩa là " thứ này tồn tại "

Có, sẽ tốt nếu có một bảng xác định mối quan hệ như vậy: ví dụ, để xác định một miền.

Các giá trị của một bảng như vậy tất nhiên phải là khóa chính tự nhiên.

Bảng tra cứu prime numberslà thứ xuất hiện trong đầu tôi.


3
+1: Bảng là một tập hợp các giá trị xảy ra là các loại RDBMS nguyên thủy của bạn.
S.Lott

4
+1 để cung cấp câu trả lời dựa trên lý thuyết quan hệ.
lubos hasko 02/09/09

Dưới đây là một ví dụ tốt về một sơ đồ có một bảng 1 cột đó không phải là một chìa khóa tự nhiên, bảng Chủ đề trong một hệ thống tin nhắn ... stackoverflow.com/a/6542556/45767
JeremyWeir

29

Tôi đã sử dụng chúng trong quá khứ. Một khách hàng của tôi muốn tự động chặn bất kỳ ai cố gắng đăng ký bằng số điện thoại trong danh sách lớn này mà anh ta có nên đó chỉ là một danh sách đen lớn.


19

Nếu có nhu cầu hợp lệ cho nó, thì tôi không thấy vấn đề gì. Có thể bạn chỉ muốn một danh sách các khả năng hiển thị vì lý do nào đó và bạn muốn có thể thay đổi động nó, nhưng không cần phải liên kết nó với một bảng khác.


+1 - Tóm lại, đây là câu trả lời đúng trong cuốn sách của tôi
Mark Brittingham

+1 cho câu trả lời ngắn gọn, rõ ràng.
Matthew Jones

3
Tại sao một bảng một cột không thể được liên kết với một bảng khác?
Aheho

2
Tại sao không? Lấy bảng mã tiểu bang làm ví dụ. Tại sao bạn không sử dụng nó như một ràng buộc khóa foriegn chống lại một bảng khác có các trường địa chỉ?
Aheho

1
Đó là một ví dụ tuyệt vời về thời điểm mà nó sẽ là một ý tưởng hay.
Kevin

11

Một trường hợp mà đôi khi tôi phát hiện ra là như thế này:

Bảng countries_id , chỉ chứa một cột với ID số cho mỗi quốc gia.

Bảng countries_description , chứa các cột với ID đất nước, một cột Với ngôn ngữ ID và một cột với tên nước cục bộ.

Bảng company_factories , chứa thông tin về từng nhà máy của công ty, bao gồm cả quốc gia tại Wich đang đặt.

Vì vậy, để duy trì tính thống nhất của dữ liệu và dữ liệu độc lập với ngôn ngữ trong các bảng, cơ sở dữ liệu sử dụng lược đồ này với các bảng chỉ có một cột để cho phép các khóa ngoại không có phụ thuộc ngôn ngữ.

Trong trường hợp này, tôi nghĩ rằng sự tồn tại của một bảng cột là hợp lý.

Đã chỉnh sửa để trả lời bình luận bởi: Quassnoi


(nguồn: ggpht.com )

Trong lược đồ này, tôi có thể xác định khóa ngoại trong bảng company_factories mà không yêu cầu tôi bao gồm cột Ngôn ngữ trên bảng, nhưng nếu tôi không có bảng country_id, tôi phải bao gồm cột Ngôn ngữ trên bảng để xác định khóa ngoại .


2
Tại sao có country_id? Để chèn một quốc gia, bạn cần biết tên của quốc gia đó bằng ít nhất một ngôn ngữ và điều này sẽ dẫn đến country_id xuất hiện trong country_description. Một country_id mà không có mục nhập country_description là vô nghĩa. "Ông Barack Obama, Chủ tịch COALESCE (14243, country_name) ĐÃ TRẢ LẠI GIÁ TRỊ ĐẦY ĐỦ, hôm nay đã gặp Dmitry Medvedev, Chủ tịch của Россия"
Quassnoi

4
@Doliveras: OK, tôi thấy bây giờ, +1. Tuy nhiên, tôi muốn sử dụng ISO 3166-1 cho coutry_code. Không giống như id số, mã quốc gia gồm 3 chữ cái cung cấp ý tưởng về quốc gia nào được nhắc đến với hầu hết mọi người trên thế giới, những người có thể đọc bảng chữ cái Latinh.
Quassnoi

Đây là một cách khác mà tôi đã triển khai để chứa các bản dịch ngôn ngữ tự nhiên trong cùng một bảng. Do đó, nhiều trường có thể vô hiệu hóa, nhưng bạn có thể tải toàn vẹn dữ liệu xuống trình kích hoạt tùy chỉnh. CREATE TABLE "DBA" "myLocalisedTable" ( "entry_id" INTEGER NOT NULL DEFAULT autoincrement, "master_entry_id" INTEGER NULL, "master_entry_label" VARCHAR (200) NULL, INTEGER NULL, "localised_entry_label" VARCHAR (300) NULL "language_id",.
Vincent Buck

7

Sẽ có những trường hợp hiếm hoi mà bảng một cột có ý nghĩa. Tôi đã làm một cơ sở dữ liệu trong đó danh sách các mã ngôn ngữ hợp lệ là một bảng một cột được sử dụng làm khóa ngoại. Không có ích gì khi có một khóa khác, vì bản thân mã là chìa khóa. Và không có mô tả cố định vì các mô tả mã ngôn ngữ sẽ khác nhau tùy theo ngôn ngữ đối với một số ngữ cảnh.

Nói chung, bất kỳ trường hợp nào bạn cần danh sách giá trị có thẩm quyền mà không có bất kỳ thuộc tính bổ sung nào đều là ứng cử viên tốt cho bảng một cột.


5

Tôi sử dụng bảng một cột mọi lúc - tất nhiên, tùy thuộc vào việc thiết kế ứng dụng đã sử dụng cơ sở dữ liệu hay chưa. Khi tôi đã chịu đựng được chi phí thiết kế trong việc thiết lập kết nối cơ sở dữ liệu, tôi đặt tất cả dữ liệu có thể thay đổi vào các bảng nếu có thể.

Tôi có thể nghĩ về hai cách sử dụng bảng một cột OTMH:

1) Mục dữ liệu tồn tại. Thường được sử dụng trong danh sách thả xuống. Cũng được sử dụng cho các bài kiểm tra tính hợp pháp đơn giản.

Ví dụ. hai chữ cái viết tắt của tiểu bang Hoa Kỳ; Mã zip mà chúng tôi gửi đến; từ hợp pháp trong Scrabble; Vân vân.

2) Thuộc tính nhị phân thưa thớt, tức là, trong một bảng lớn, một thuộc tính nhị phân sẽ chỉ đúng với một số rất ít bản ghi. Thay vì thêm một cột boolean mới, tôi có thể tạo một bảng riêng chứa các khóa của các bản ghi mà thuộc tính là true.

Ví dụ. nhân viên mắc bệnh nan y; ngân hàng có thời hạn 360 ngày trong năm (hầu hết sử dụng 365); Vân vân.

-Al.


4

Không có vấn đề gì miễn là nó chứa các giá trị duy nhất.


4

Hầu hết tôi đã thấy điều này trong các bảng loại tra cứu như bảng trạng thái mà bạn đã mô tả. Tuy nhiên, nếu bạn làm điều này, hãy chắc chắn đặt cột làm khóa chính để buộc tính duy nhất. Nếu bạn không thể đặt giá trị này là duy nhất, thì bạn không nên sử dụng một cột.


Mặc dù sử dụng một cột duy nhất ở đây có lẽ là tốt, nhưng hãy nhớ rằng bạn cũng có thể thiết lập các ràng buộc về tính duy nhất trên các cột khác.
Stealth Rabbi

2

Tôi sẽ nói chung chung, có. Không chắc tại sao bạn chỉ cần một cột. Có một số ngoại lệ cho điều này mà tôi đã thấy được sử dụng hiệu quả. Nó phụ thuộc vào những gì bạn đang cố gắng đạt được.

Chúng không thực sự là thiết kế tốt khi bạn nghĩ đến lược đồ của cơ sở dữ liệu, nhưng thực sự chỉ nên được sử dụng như các bảng tiện ích.

Tôi đã thấy các bảng số được sử dụng hiệu quả trong quá khứ.


1

Mục đích của cơ sở dữ liệu là liên kết các phần thông tin với nhau. Làm thế nào bạn có thể làm điều đó khi không có dữ liệu để liên quan?

Có thể đây là một loại bảng tổng hợp nào đó (tức là FirstName + LastName + Birthdate), mặc dù tôi vẫn không chắc tại sao bạn lại muốn làm như vậy.

CHỈNH SỬA: Tôi có thể thấy bằng cách sử dụng loại bảng này cho một danh sách đơn giản của một số loại. Đó có phải là những gì bạn đang sử dụng nó cho?


9
Không, mục đích chính của cơ sở dữ liệu là lưu trữ thông tin.
Spencer Ruport

Nhưng một bảng tính có thể lưu trữ thông tin. Và làm thế nào thông tin hữu ích nếu nó chỉ là một loạt các con số và chữ cái rời rạc không có mối tương quan giữa chúng?
Matthew Jones

Thông tin có thể hữu ích vì ứng dụng sử dụng cơ sở dữ liệu cần nó và nó không phải là một tập hợp cố định. Nghĩa là, DB đơn giản là nơi thuận tiện nhất để đưa thông tin vào ứng dụng cơ sở dữ liệu - quan hệ hoặc cách khác. Tôi khá chắc rằng bạn đồng ý rằng chúng tôi không xây dựng ứng dụng để chứng minh sự trong sạch của chúng tôi đối với lý tưởng quan hệ. Thay vào đó, chúng tôi xây dựng các ứng dụng để trở nên hữu ích.
Mark Brittingham

@Mark - Đó là ý của tôi về một danh sách đơn giản. Đoán rằng tôi đã không giải thích bản thân mình rất tốt.
Matthew Jones

1
@SR - Không, mục đích chính của cơ sở dữ liệu là truy xuất thông tin. Vì các hàng quan tâm thường xuyên hơn không phụ thuộc vào các phần dữ liệu khác, tôi nghĩ rằng bình luận ban đầu của MJ là đúng.
CurtainDog

1

Có, miễn là trường là khóa chính như bạn đã nói. Lý do là vì nếu bạn chèn dữ liệu trùng lặp thì các hàng đó sẽ chỉ được đọc. Nếu bạn cố gắng xóa một trong các hàng bị trùng lặp. nó sẽ không hoạt động vì máy chủ sẽ không biết hàng nào để xóa.


2
Thật nực cười. Thao tác xóa không có khóa chính hoặc ràng buộc sẽ xóa tất cả các hàng phù hợp, không bỏ qua chúng.
Erik Funkenbusch

1
"Không hoạt động", anh ấy có thể có nghĩa là "không hoạt động như mong đợi", bao gồm tình trạng "này, tôi đã xóa một hàng nhưng cả hai đều biến mất".
GWLlosa

Hoặc, nếu bạn cố gắng xóa một kỷ lục trong SSMS từ quan điểm "Open Table", nó sẽ thực sự ném lên một hộp thoại rằng hồ sơ không thể được xác định duy nhất và sau đó không làm gì cả ...
Michael Fredrickson

-1

Trường hợp sử dụng duy nhất mà tôi có thể nghĩ đến là một bảng từ có lẽ cho trò chơi chữ. Bạn truy cập bảng chỉ để xác minh rằng một chuỗi là một từ: chọn từ từ các từ mà từ =?. Nhưng có nhiều cấu trúc dữ liệu tốt hơn để chứa một danh sách các từ hơn là một cơ sở dữ liệu quan hệ .

Nếu không, dữ liệu trong cơ sở dữ liệu thường được đặt trong cơ sở dữ liệu để tận dụng các mối quan hệ giữa các thuộc tính khác nhau của dữ liệu. Nếu dữ liệu của bạn không có thuộc tính nào ngoài giá trị của nó thì mối quan hệ này sẽ được phát triển như thế nào?

Vì vậy, mặc dù không phải là bất hợp pháp, nhưng nói chung, bạn có thể không nên có một bảng chỉ có một cột.


Tương tự với bảng này là bảng số rất tiện dụng để dừng lặp lại.
u07ch

-1

Tất cả các bảng của tôi có ít nhất bốn trường công nghệ, khóa chính nối tiếp, dấu thời gian tạo và sửa đổi, và boolean xóa mềm. Trong bất kỳ danh sách đen nào, bạn cũng sẽ muốn biết ai đã thêm mục nhập. Vì vậy, đối với tôi, câu trả lời là không, một bảng chỉ có một cột sẽ không có ý nghĩa gì ngoại trừ khi tạo mẫu một cái gì đó.


1
Có vẻ như bạn đang trộn một bảng dữ liệu với một bảng giao dịch. Theo tôi, đây nên là hai việc riêng biệt.
Josh Noe

-2

Vâng, điều đó là hoàn toàn tốt. nhưng một trường ID không thể làm tổn hại nó phải không?


7
Trên thực tế, nó có thể. Khi bạn có một danh sách xác định các giá trị hợp lệ, điều cuối cùng bạn muốn là trường ID vì nó ngụ ý rằng các giá trị không phải là duy nhất. Nếu 'Lightblue' là chìa khóa, sau đó bạn không muốn một ai đó suy nghĩ rằng 'Lightblue' với id 1 có thể khác nhau từ 'Lightblue' với id 4.
Jeremy Bourque

Ai nói Id phải là danh tính? Hay một phần của chìa khóa?
Eric

3
Nó có thể là một khóa tổng hợp và trường gốc có thể có một ràng buộc duy nhất đối với nó.
Mark Canlas
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.