Có phải là một thực tế xấu khi có một vài mối quan hệ độc quyền lẫn nhau?


38

Say, một bảng carcó one-to-one mối quan hệ cho các bảng electric_car, gas_carhybrid_car. Nếu một carelectric_car, nó không còn có thể xuất hiện trong gas_carhoặc hybrid_carvv

Có điều gì sai với thiết kế như vậy? Một số vấn đề có thể xảy ra xuống đường?

Câu trả lời:


59

Các loại ô tô khác nhau là một ví dụ của một vấn đề chung xuất hiện nhiều lần trong mô hình dữ liệu. Nó được gọi là "khái quát hóa / chuyên môn hóa" trong mô hình ER và "siêu lớp / lớp con" trong mô hình đối tượng.

Một người lập mô hình đối tượng sử dụng các tính năng kế thừa được tích hợp trong mô hình đối tượng để giải quyết vấn đề khá dễ dàng. Các lớp con chỉ đơn giản là mở rộng siêu lớp.

Người lập mô hình quan hệ phải đối mặt với một vấn đề. Làm thế nào để thiết kế các bảng sao cho mô phỏng những lợi ích mà người ta sẽ nhận được từ thừa kế?

Kỹ thuật đơn giản nhất được gọi là kế thừa bảng đơn . Dữ liệu về tất cả các loại ô tô được nhóm thành một bảng duy nhất cho ô tô. Có một cột, car_type, nhóm tất cả các xe cùng một loại. Không có chiếc xe có thể thuộc nhiều hơn một loại. Nếu một cột không liên quan đến ô tô điện, nó sẽ bị bỏ lại NULL trong các hàng liên quan đến ô tô điện.

Giải pháp đơn giản này hoạt động tốt cho các trường hợp nhỏ hơn và đơn giản hơn. Sự hiện diện của rất nhiều NULL thêm một chút nhỏ vào chi phí lưu trữ và một chút cho chi phí truy xuất. Nhà phát triển có thể phải học logic ba giá trị SQL nếu các bài kiểm tra boolean được thực hiện trên các cột không thể. Điều này có thể gây trở ngại lúc đầu, nhưng người ta đã quen với nó.

Có một kỹ thuật khác, được gọi là kế thừa bảng lớp . Trong thiết kế này, có các bảng riêng biệt cho gas_car, Electric_car và hybrid_car, ngoài ra còn có một bảng kết hợp, xe hơi, cho tất cả chúng. Khi bạn muốn tất cả các dữ liệu về một loại xe cụ thể, bạn tham gia bảng xe với bảng chuyên dụng phù hợp. Có ít NULL hơn trong thiết kế này, nhưng bạn tham gia nhiều hơn. Kỹ thuật này hoạt động tốt hơn trong các trường hợp lớn hơn và phức tạp hơn.

Có một kỹ thuật thứ ba được gọi là khóa chính được chia sẻ. Kỹ thuật này thường được sử dụng kết hợp với kế thừa bảng lớp. Các bảng chuyên biệt cho các lớp con có, như là khóa chính của chúng, một bản sao của khóa chính của mục tương ứng trong bảng ô tô. Cột id này có thể được khai báo là cả khóa chính và khóa ngoại.

Điều này liên quan đến việc lập trình thêm một chút khi những chiếc xe mới được thêm vào, nhưng nó làm cho việc tham gia trở nên đơn giản, dễ dàng và nhanh chóng.

Các siêu lớp và các lớp con xảy ra mọi lúc trong thế giới thực. Đừng sợ. Nhưng hãy kiểm tra thiết kế ban đầu của bạn để thực hiện. Nếu lần thử đầu tiên của bạn đơn giản và âm thanh, bạn sẽ có thể điều chỉnh nó để tăng tốc nó.


3
Ồ, cảm ơn bạn! Đó là điểm mà tôi đang cố gắng tìm ra. Kế thừa bảng lớp dường như là chính xác những gì tôi cần. Tôi đã thay đổi câu trả lời được chấp nhận của mình cho câu hỏi này cho độc giả trong tương lai vì tôi nghĩ nó hoàn toàn bao gồm câu hỏi, không chỉ trường hợp của tôi.
Arthur Tarasov

6
Câu trả lời xuất sắc ở đây. Một mẹo: Tài liệu kỹ lưỡng các quyết định thiết kế. Bất kỳ tuyến đường nào bạn đi, sẽ không rõ ràng khi ai đó đang kiểm tra cấu trúc cơ sở dữ liệu. Một số cơ sở dữ liệu như Postgres cho phép bạn liên kết một nhận xét cùng với dữ liệu meta của các cột, bảng, v.v.
Basil Bourque

Bạn không giải quyết các hạn chế trong việc giữ cho xe điện cũng không phải là xe hybrid. Bạn cần một bảng riêng biệt cho điều đó.
jmoreno

2
Bạn đúng rồi. Nếu bạn thêm trường car_type vào bảng ô tô, bạn có thể giới hạn ô tô chỉ thuộc về một loại, với chi phí sai lệch so với chuẩn hóa hoàn toàn. Một DBMS tốt sẽ cho phép bạn xác định một ràng buộc kiểm tra sẽ ngăn không cho xe vào trong nhiều bảng chuyên biệt. Có một số chi phí trong đó, bạn đi thêm xe mới.
Walter Mitty

@WalterMitty nhưng không có car_typetrường, làm thế nào bạn biết bảng nào cần tìm chi tiết khi lấy dữ liệu? Bạn có phải đọc cả ba bảng để xem bảng nào có dữ liệu về carbản ghi cụ thể đó không?
Josh Phần

12

Không có gì sai khi có càng nhiều loại phụ thực thể trong mô hình của bạn là cần thiết để phản ánh thực tế của dữ liệu mà bạn đang cố gắng mô hình hóa. Câu hỏi không phải là liệu các loại phụ có phải là một thực tiễn xấu hay không. Vấn đề thể là một mô hình tốt ?

Ví dụ, dưới ví dụ của bạn, bạn sẽ làm gì với một cái gì đó giống như một chiếc Audi A4 eTron - vốn là một chiếc hybrid cắm điện? Đó có phải là "xe điện" hay là "xe hybrid"?

Một câu hỏi khác bạn phải tự hỏi mình là tại sao bạn lại gõ phụ? Bạn có bao nhiêu vị từ riêng biệt trong các loại phụ của bạn? Có bất kỳ vị từ nào được chia sẻ giữa các loại phụ không? Tình hình có thể trở nên phức tạp.

Gõ phụ không được sử dụng trong thiết kế cơ sở dữ liệu để phân loại. Bạn có thể thực hiện phân loại với mã, khóa ngoại cho bảng mã hoặc bằng cờ. Gõ phụ được sử dụng để mô hình các bộ vị ngữ riêng biệt cho các loại khác nhau của một điều quan tâm. Nếu bạn đang sử dụng các loại phụ chỉ để phân loại thì đó là một thực tế tồi.

Nếu các kiểu con của bạn mô hình rõ ràng và rõ ràng các bộ vị ngữ khác nhau cho những thứ mà cơ sở dữ liệu của bạn quan tâm, thì đó là một cách thực hành hoàn toàn tốt, bất kể bạn cần bao nhiêu loại phụ.


Cảm ơn, tôi sợ rằng tôi đã đặt ra một cái bẫy cho chính mình. Vấn đề của tôi là mỗi một kiểu con sẽ có rất nhiều cột. Một số sẽ chồng lên nhau và tôi sẽ đặt chúng vào một carbảng, nhưng nhiều cái sẽ không và sẽ được đặt trong một bảng phụ. Ví dụ, nó sẽ giống như lưu trữ các bộ phận cơ bản của các loại xe hơi. Động cơ xe điện có thể có 100 phần, động cơ xăng 75 phần, và hybrid 125 phần. 50 phần sẽ được phổ biến và lưu trữ trong cars, trong khi 50, 25, và 75 sẽ được trong electric_car, gas_carhybrid_carbảng
Arthur Tarasov
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.