Hai mối quan hệ với cùng một bảng


7

Tôi có một bảng giao dịch, mỗi giao dịch có 5-6 liên hệ liên quan. mỗi liên hệ có cùng các trường như tên, địa chỉ, ô, email, v.v.

Vì vậy, điều tốt nhất tôi đoán là sử dụng cùng một bảng liên hệ và liên kết nó 5 lần với bảng giao dịch .. Vì vậy, tôi không cần phải thực hiện cùng một loại bảng 5 lần.

Vấn đề bắt đầu khi tôi kết nối với khung thực thể, điều này chỉ mất một mối quan hệ.

Câu hỏi của tôi là tôi có nên tạo 6 bản sao liên lạc cho mỗi loại liên hệ không hoặc tôi sẽ tốt hơn với 6 bảng tham gia (Một bảng chỉ có 2 id để tôi có thể tham gia)?

Tôi nghĩ đó là một vấn đề rất phổ biến nhưng tôi không thể tìm thấy thông tin rõ ràng cách tốt nhất là gì.

BIÊN TẬP: Mẫu bàn

Câu trả lời:


5

Điều tốt nhất là bình thường hóa các bảng. Tạo bảng contact_type với một bản ghi cho từng loại liên hệ. Sau đó tạo bảng nối contact_type_xref có chứa mã định danh từ bảng liên hệ và mã định danh từ bảng contact_type. Sau đó tải các loại liên hệ được liên kết với từng liên hệ vào contact_type_xref và xóa các bản ghi liên hệ trùng lặp khỏi liên hệ. Đây là một ví dụ : Ví dụ lược đồ. Khi bạn sửa thiết kế cơ sở dữ liệu, bạn có thể giải quyết vấn đề khung thực thể (có thể sẽ biến mất).


1
Tôi đang tạo cơ sở dữ liệu ngay bây giờ ... vì vậy không có dữ liệu để hợp nhất / di chuyển. Tôi cố gắng thực hiện đúng vào lần thứ 1 vì vậy tôi không nên hỏi cách khắc phục sau ...
Ezi

Vì vậy, bạn nói tôi nên sử dụng 1 bảng liên lạc và sau đó thực hiện 6 bảng nhảy chỉ với các id?
Ezi

@Ezi, tại sao sáu bàn nhảy? Một bảng contact_type, một bảng liên hệ, một bảng contact_type_xref để liên hệ các liên hệ với các loại. Một bản ghi cho mỗi liên hệ trong bảng liên hệ, 6 bản ghi cho mỗi liên hệ trong bảng contact_type_xref, một bản ghi cho mỗi liên hệ trong bảng loại liên hệ. Có lẽ sẽ không hại gì khi đọc lên chuẩn hóa cơ sở dữ liệu.
Wil

Tôi sẽ tham gia bảng Giao dịch nào?
Ezi

Nó phụ thuộc vào các quy tắc. Nếu một giao dịch chỉ có thể có một khách hàng, hãy dán id khách hàng vào bảng giao dịch. Nếu giao dịch có thể có nhiều khách hàng, hãy tạo bảng khách hàng_transaction với id khách hàng và id giao dịch. Loại khách hàng không nên là một phần của giao lộ giữa giao dịch và khách hàng ... hoàn toàn không quan trọng đối với giao dịch nếu khách hàng chỉ có một loại hoặc sáu loại.
Wil

1

Trước hết, đó là một chút khuôn khổ rác rưởi không thừa nhận nhiều mối quan hệ giữa các loại thực thể!

Nếu bạn có nhiều khóa ngoại này, rất có thể bạn sẽ có nhiều (hoặc ít hơn) trong tương lai. Chi tiết giải pháp @Wil sẽ cho phép bạn đạt được điều này mà không cần thay đổi lược đồ.

Một cách giải quyết có thể đánh lừa khung của bạn là xác định các khung nhìn trong cơ sở dữ liệu cho từng loại liên hệ của bạn và xác định mối quan hệ khung từ giao dịch đến khung nhìn. Ví dụ

create view Manufacture as
select
    ContactID as ManufactureID,
    FirstName,
    LastName,
    ...etc.
from Contacts

Có thể hoặc không thể hoạt động, tùy thuộc vào cách khung của bạn tương tác với cơ sở dữ liệu.

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.