12

Các liên kết đa hình (PA) khá là một lời yêu cầu cơ sở dữ liệu tương đối đơn giản: cho các bảng khác nhau có các bản ghi con trong một bảng chia sẻ. Ví dụ cổ điển là một bảng duy nhất có các bản ghi chú thích áp dụng cho các thực thể không nhất thiết khác nhau.Làm thế nào để thực hiện các mối liên hệ đa hình trong cơ sở dữ liệu hiện có

Trong this question Mark đã làm một công việc tuyệt vời cho thấy ba cách tiếp cận phổ biến để triển khai PA. Tôi muốn sử dụng phương pháp tiếp cận bảng cơ sở, được mô tả chi tiết hơn trong một số xuất sắc như nhau answer by Bill Karwin.

Một ví dụ cụ thể sẽ trông như thế này:

enter image description here

Các khóa chính của các thực thể tham khảo giá trị quan trọng giống hệt nhau trong bảng cơ sở và bảng Bình luận đề cập đến vào bảng cơ sở, toàn vẹn để tham chiếu được quan sát. Phần quan trọng ở đây là các khóa chính của bảng thực thể có các tên miền riêng biệt riêng biệt. Chúng được tạo ra bằng cách tạo một bản ghi mới trong bảng cơ sở và sao chép khóa được tạo của nó vào khóa chính của thực thể.

Bây giờ câu hỏi của tôi: nếu tôi muốn giới thiệu PA với tính toàn vẹn tham chiếu trong cơ sở dữ liệu hiện có có thực thể tạo khóa chính, chồng chéo chính của chúng?

Cho đến nay, tôi thấy hai lựa chọn:

Lựa chọn 1:

Option 1

Mỗi thực thể giữ khóa chính riêng của mình mà còn nhận được một chìa khóa thay thế.

Giống như:

  • Gần phương pháp khuyến khích.
  • Bảng cơ sở ổn định.

Không thích:

  • thực thể hiện hữu phải được sửa đổi.
  • Khó tìm thấy pháp nhân sở hữu của nhận xét.

Phương án 2:

Option 2

Mỗi thực thể có cột khóa ngoại riêng của mình trong các bảng cơ sở. Điều này trông giống như cách tiếp cận nhiều cột của Mark.

Giống như:

  • thực thể hiện hữu không bị ảnh hưởng.
  • Dễ dàng tìm thấy thực thể sở hữu của nhận xét.

Không thích:

  • cột thưa thớt
  • bảng cơ sở không ổn định: cần thay đổi khi một thực thể mới với PA được giới thiệu

tôi nghiêng về phương án 1, có thể với một lĩnh vực "EntityName" trong bảng Cơ sở để tra cứu hai chiều. Tùy chọn nào sẽ tốt hơn. Hoặc là cách tiếp cận khác, tốt hơn?

+0

Lựa chọn 1 sẽ dễ dàng hơn để duy trì. Nếu bạn phải tiếp tục thêm cột vào bảng cơ sở của bạn, nó sẽ là cả một rắc rối và sẽ đòi hỏi rất nhiều bảo trì vì phân chia trang và con trỏ và như vậy. – JNK

+0

@JNK Điểm tốt, tác động lưu trữ vật lý là điều quan trọng cần ghi nhớ. –

+0

Bạn có thể sử dụng Tùy chọn 1 nhưng không sử dụng Khóa thay thế thay thế bổ sung. Khóa thay thế mới có thể là Khóa chính hiện tại (của mỗi thực thể), được mở rộng bằng cột 'EntityType' (nói' CHAR (1) ', sẽ là' E' cho Sự kiện, 'P' cho Người,' D' cho sản phẩm) –

Trả lời

9

Bạn có thể sử dụng Tùy chọn 1 nhưng không có Khóa thay thế thay thế bổ sung.

Thay vào đó, kéo dài tuổi Primary Key hiện có (của từng đối tượng), với một cột EntityType (nói CHAR(1), đó sẽ là E cho các sự kiện, P cho Người, D cho các sản phẩm).

Hợp chất (EntityId, EntityType) sẽ trở thành sau đó là Khóa chính của bảng Entity và các hợp chất tương ứng trong 3 bảng loại phụ khác.

(The EntityType chỉ là một auxilary, bảng tham chiếu, với 3 hàng):

Polymorphic_Associations

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