Thực tiễn không tốt là cung cấp cho mọi bảng khác một mối quan hệ (dư thừa) vào bảng Công ty để đơn giản hóa các truy vấn sql của tôi?
Vâng, hoàn toàn, vì nó có nghĩa là cập nhật mỗi mối quan hệ không cần thiết khi bạn cập nhật các quan hệ khách hàng cho công ty hoặc phần cho công ty - và nếu bạn bỏ lỡ bất kỳ bản cập nhật như vậy, bây giờ bạn có một cơ sở dữ liệu đầy đủ các dữ liệu không cần thiết. Đó là một sự không chuẩn hóa xấu.
Nếu điểm của bạn là đơn giản hóa SQL, hãy xem xét sử dụng chế độ xem để "mang theo" dữ liệu gốc. Dưới đây là chế độ xem hợp đồng company_id thành hợp đồng, bằng cách tham gia thông qua khách hàng:
create view contract_customer as
select
a.*,
b.contract_id, b.company_id
from
contract a
join customer b on (a.customer_id = b.customer_id);
Tham gia này rất đơn giản, nhưng tại sao lại lặp đi lặp lại? Viết nó một lần, và sau đó sử dụng quan điểm trong các truy vấn khác.
Nhiều (nhưng không phải tất cả) RDBMS thậm chí có thể tối ưu hóa tham gia nếu bạn không đặt bất kỳ cột nào từ khách hàng trong danh sách lựa chọn hoặc mệnh đề của truy vấn dựa trên chế độ xem, miễn là bạn thực hiện contract.customer_id có ràng buộc toàn vẹn tham chiếu khóa ngoài trên customer.customer_id. (Trong trường hợp không có ràng buộc như vậy, không thể bỏ qua phép nối, vì nó sẽ có thể cho một contract.customer_id tồn tại mà không tồn tại trong khách hàng. Vì bạn sẽ không bao giờ muốn rằng, bạn sẽ thêm ràng buộc khóa ngoài.)
Sử dụng chế độ xem đạt được những gì bạn muốn, mà không cần phải cập nhật bảng con, mà không cần làm cho hàng con rộng hơn bằng cách thêm cột dư thừa (và điều này thực sự bắt đầu quan trọng khi bạn có nhiều hàng, vì hàng càng rộng, hàng càng ít có thể vừa với bộ nhớ cùng một lúc), và quan trọng nhất, không có khả năng dữ liệu không nhất quán khi phụ huynh được cập nhật nhưng các con thì không.
Từ "quan hệ" không có nghĩa là ý của bạn là ý nghĩa của nó. Quan hệ * * trong mô hình cơ sở dữ liệu quan hệ tương ứng với hầu hết mọi người gọi một bảng. Nó không liên quan gì đến mối quan hệ giữa dữ liệu trong các bảng khác nhau. – sqlvogel
Vâng, bạn nói đúng. Tôi đã sửa nó. – svenwltr
@SvenWalter vui lòng cập nhật câu hỏi bằng bảng trong khối mã ('
') vì tệp hình ảnh bên ngoài không còn khả dụng nữa. Tôi chia sẻ nỗi đau khi không có các bảng thích hợp trong SE (các nhà phát triển khó có thể làm cho nó có sẵn), nhưng ít nhất chúng ta có thể mô phỏng chúng bằng các khối mã thay vì dựa vào các công cụ bên ngoài. – ADTC