Vòng cung độc quyền trong cơ sở dữ liệu là gì và tại sao nó xấu?


10

Tôi đã đọc hầu hết các lỗi thiết kế cơ sở dữ liệu phổ biến do nhà phát triển Q & A thực hiện trên stackoverflow. Ở câu trả lời đầu tiên có cụm từ về cung độc quyền:

Một cung độc quyền là một lỗi phổ biến trong đó một bảng được tạo bằng hai hoặc nhiều khóa ngoại trong đó một và chỉ một trong số chúng có thể là không rỗng. Sai lầm lớn. Đối với một điều, nó trở nên khó khăn hơn nhiều để duy trì tính toàn vẹn dữ liệu. Rốt cuộc, ngay cả với tính toàn vẹn tham chiếu, không có gì ngăn cản hai hoặc nhiều khóa ngoại này được đặt (các ràng buộc kiểm tra phức tạp mặc dù).

Tôi thực sự không hiểu tại sao hồ quang độc quyền là xấu xa. Có lẽ tôi đã không hiểu những điều cơ bản của nó. Có bất kỳ lời giải thích tốt về các cung độc quyền?

Câu trả lời:


8

Theo như tôi đã hiểu từ lâu, trong một vòng cung độc quyền, một bảng chứa một số cột là khóa ngoại đối với các bảng khác, nhưng chỉ một trong số đó có thể được đặt tại một thời điểm (do một số ràng buộc logic trên miền theo sau từ thế giới thực). Vì quy tắc này không thể được thi hành trên cơ sở dữ liệu, một bản ghi bị hỏng có thể được tạo trong đó có nhiều hơn một trong các khóa ngoại này có giá trị.

Tôi sẽ làm một ví dụ. Hãy xem xét một ứng dụng trong đó một công ty theo dõi các xe tải mà nó sử dụng để giao hàng. Một chiếc xe tải chỉ có thể ở một trong ba nơi cùng một lúc: nó có thể là với một nhân viên, nó có thể ở trong một bãi đậu xe hoặc nó có thể ở trong một cửa hàng bảo trì. Điều này có thể được mô hình hóa bằng cách có một bảng Xe tải với workerId, parkGarageId và bảo trìShopId, tham khảo các bảng Nhân viên, Bãi đỗ xe và Bảo trì. Không có cách nào để thực thi quy tắc rằng chỉ có một trong các trường này được điền vào cấp độ của cơ sở dữ liệu. Mã xấu hoặc ai đó có quyền truy cập trực tiếp vào cơ sở dữ liệu có thể chèn một bản ghi có hai hoặc ba trường được điền, điều này dẫn đến tham nhũng dữ liệu trong cơ sở dữ liệu.


4
Ba vị trí xe tải có thể là các lớp con của một siêu lớp, "vị trí xe tải". Có nhiều trường hợp các lớp con là loại trừ lẫn nhau. Thách thức trở thành làm thế nào để mô hình hóa các lớp và các lớp con trong các bảng quan hệ.
Walter Mitty

Tôi đồng ý rằng có những trường hợp sử dụng thiết kế này là hợp lý. Tuy nhiên, tôi cũng có thể đồng ý với bài viết gốc rằng mẫu này được sử dụng RẤT NHIỀU hơn mức cần thiết. Nó cũng có một số nhược điểm rất lớn ...
JDT

6
Không thể sử dụng một ràng buộc kiểm tra? Ví dụ alter table mytable add constraint myconstraint check ((col1 is not null and col2 is null and col3 is null) or (col1 is null and col2 is not null and col3 is null) or (col1 is null and col2 is null and col3 is not null)). Tôi không thích các cung độc quyền nhưng chúng có thể được thi hành với một ràng buộc kiểm tra. Tất nhiên ràng buộc FK cũng phải có mặt.
Tulains Córdova

1
Do đó, "các ràng buộc kiểm tra phức tạp mặc dù" từ bài viết được trích dẫn ở trên. Bạn có thể thực hiện xác nhận thực sự tinh vi với các ràng buộc kiểm tra hoặc quái, thậm chí kích hoạt, điều đó không làm cho nó trở thành một ý tưởng tốt hoặc mã thông báo của thiết kế tốt. Hãy tưởng tượng thực hiện các ràng buộc kiểm tra trên các cung độc quyền với bốn hoặc năm cột ... Ngoài ra, tôi khá chắc chắn rằng không phải tất cả các công cụ cơ sở dữ liệu đều hỗ trợ ràng buộc CHECK . MySQL tuyên bố rõ ràng trong các tài liệu rằng các mệnh đề CHECK được phân tích cú pháp, nhưng bị bỏ qua ...
JDT

Nguồn này khuyến nghị cung độc quyền. Suy nghĩ?
Alex Moore-Niemi

4

Không có gì xấu về vòng cung độc quyền. Đơn giản chỉ cần thực thi quy tắc kinh doanh tương ứng bằng cách sử dụng một ràng buộc kiểm tra. Hầu hết các hệ thống quản lý cơ sở dữ liệu chính đều hỗ trợ các ràng buộc kiểm tra (Oracle, SQL Server, PostgreSQL). Nếu bạn đang sử dụng một công cụ mô hình hóa dữ liệu thì rất có thể công cụ của bạn sẽ tự động tạo mã để thực hiện ràng buộc kiểm tra.


-1

Vòng cung độc quyền rất hữu ích trong thiết kế Khái niệm hoặc Logic. Điều đó không có nghĩa là bạn phải thực hiện theo cách đó. Trong ví dụ trước, người thiết kế có thể quyết định thực hiện thiết kế với ba bảng. Một cho vị trí đỗ xe, một cho nhân viên và một cho cửa hàng bảo trì.

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.