5

Tôi đang thiết kế một cơ sở dữ liệu nhỏ cho một dự án cá nhân, và một trong các bảng, gọi nó là C, cần có khóa ngoài cho một trong hai bảng, gọi chúng là AB, khác nhau theo mục nhập. Cách tốt nhất để thực hiện điều này là gì?Làm cách nào để xử lý mối quan hệ "HOẶC" trong thiết kế ERD (bảng)?

Ý tưởng cho đến nay:

  • Tạo bảng với hai lĩnh vực then chốt ngoại nullable kết nối với hai bảng.
    • Có thể có trình kích hoạt để từ chối chèn và cập nhật sẽ dẫn đến 0 hoặc 2 trong số đó không có giá trị.
  • Hai bảng riêng biệt với dữ liệu giống hệt
    • này phá vỡ các quy tắc về sao chép dữ liệu.

Cách thanh lịch hơn để giải quyết vấn đề này là gì?

+1

Đã thêm thẻ 'polymorphic-associations' vì đó là thuật ngữ chung cho loại mối quan hệ này. –

Trả lời

10

Bạn đang mô tả thiết kế được gọi là Hiệp hội đa hình. Điều này thường khiến mọi người gặp rắc rối.

Những gì tôi thường khuyên bạn nên:

A --> D <-- B 
     ^
     | 
     C 

Trong thiết kế này, bạn tạo một bảng cha chung D rằng cả hai AB tham khảo. Điều này tương tự như một siêu kiểu chung trong thiết kế OO. Bây giờ bảng con của bạn C có thể tham khảo siêu bảng và từ đó bạn có thể đến bảng phụ tương ứng.

Thông qua các ràng buộc và phím phức hợp, bạn có thể đảm bảo một hàng nhất định trong D chỉ có thể được tham chiếu A hoặc B nhưng không được cả hai.

+0

Cảm ơn, bây giờ đã được tái cấu trúc. –

1

Nếu bạn chắc chắn rằng C sẽ chỉ đề cập đến một trong hai bảng (và không phải là một trong N), thì lựa chọn đầu tiên của bạn là một cách tiếp cận hợp lý (và là cách tôi đã sử dụng trước đó). Nhưng nếu bạn nghĩ rằng số lượng cột khóa ngoài sẽ tiếp tục tăng, điều này cho thấy có một số điểm giống nhau hoặc trùng lặp có thể được kết hợp và bạn có thể muốn xem xét lại.

Các vấn đề liên quan