Phiên bản ngắn
Tôi phải thêm một số thuộc tính bổ sung cố định cho mỗi cặp trong một liên kết nhiều-nhiều hiện có. Bỏ qua các sơ đồ bên dưới, tùy chọn 1-4 nào là cách tốt nhất, về mặt lợi thế và bất lợi, để thực hiện điều này bằng cách mở rộng Trường hợp cơ sở? Hoặc, có một sự thay thế tốt hơn mà tôi chưa xem xét ở đây?
Phiên bản dài hơn
Tôi hiện có hai bảng trong mối quan hệ nhiều-nhiều, thông qua bảng tham gia trung gian. Bây giờ tôi cần thêm các liên kết bổ sung vào các thuộc tính thuộc về cặp đối tượng hiện có. Tôi có một số lượng cố định các thuộc tính này cho mỗi cặp, mặc dù một mục trong bảng thuộc tính có thể áp dụng cho nhiều cặp (hoặc thậm chí được sử dụng nhiều lần cho một cặp). Tôi đang cố gắng xác định cách tốt nhất để làm điều này và đang gặp khó khăn trong việc tìm ra cách nghĩ về tình huống. Về mặt ngữ nghĩa, dường như tôi có thể mô tả nó như bất kỳ điều nào sau đây cũng tốt như sau:
- Một cặp được liên kết với một tập hợp các thuộc tính bổ sung cố định
- Một cặp được liên kết với nhiều thuộc tính bổ sung
- Nhiều (hai) đối tượng được liên kết với một tập các thuộc tính
- Nhiều đối tượng liên kết với nhiều thuộc tính
Thí dụ
Tôi có hai loại đối tượng, X và Y, mỗi loại có ID duy nhất và bảng liên kết objx_objy
với các cột x_id
và y_id
cùng nhau tạo thành khóa chính cho liên kết. Mỗi X có thể liên quan đến nhiều Y và ngược lại. Đây là thiết lập cho mối quan hệ nhiều-nhiều hiện có của tôi.
Trường hợp cơ sở
Ngoài ra, tôi có một tập các thuộc tính được xác định trong một bảng khác và một tập hợp các điều kiện theo đó một cặp (X, Y) nhất định sẽ có thuộc tính P. Số lượng điều kiện được cố định và giống nhau cho tất cả các cặp. Về cơ bản, họ nói "Trong tình huống C1, cặp (X1, Y1) có thuộc tính P1", "Trong tình huống C2, cặp (X1, Y1) có thuộc tính P2", v.v., trong ba tình huống / điều kiện cho mỗi cặp tham gia bàn.
lựa chọn 1
Trong tình hình hiện tại của tôi có đúng ba điều kiện như vậy, và tôi không có lý do để hy vọng rằng sẽ tăng, vì vậy một khả năng là để thêm các cột c1_p_id
, c2_p_id
và c3_p_id
để featx_featy
quy định cụ thể cho một cho x_id
và y_id
, trong đó tài sản p_id
để sử dụng trong mỗi trong ba trường hợp .
Đây dường như không phải là một ý tưởng tuyệt vời đối với tôi, vì nó làm phức tạp SQL để chọn tất cả các thuộc tính được áp dụng cho một tính năng và không dễ dàng mở rộng quy mô sang nhiều điều kiện hơn. Tuy nhiên, nó thực thi yêu cầu của một số điều kiện nhất định cho mỗi cặp (X, Y). Trong thực tế, nó là lựa chọn duy nhất ở đây làm như vậy.
Lựa chọn 2
Tạo bảng điều kiện cond
và thêm ID điều kiện vào khóa chính của bảng tham gia.
Một nhược điểm của điều này là nó không chỉ định số lượng điều kiện cho mỗi cặp. Một điều nữa là khi tôi chỉ xem xét mối quan hệ ban đầu, với một vài thứ như
SELECT objx.*, objy.* FROM objx
INNER JOIN objx_objy ON objx_objy.x_id = objx.id
INNER JOIN objy ON objy.id = objx_objy.y_id
Sau đó tôi phải thêm một DISTINCT
mệnh đề để tránh các mục trùng lặp. Điều này dường như đã mất thực tế rằng mỗi cặp chỉ nên tồn tại một lần.
Lựa chọn 3
Tạo một 'cặp ID' mới trong bảng tham gia và sau đó có một bảng liên kết thứ hai giữa cái đầu tiên và các thuộc tính và điều kiện.
Điều này dường như có ít nhược điểm nhất, ngoài việc không thực thi một số điều kiện cố định cho mỗi cặp. Liệu nó có ý nghĩa mặc dù để tạo một ID mới mà không xác định được gì ngoài các ID hiện có?
Tùy chọn 4 (3b)
Về cơ bản giống như Tùy chọn 3, nhưng không tạo ra trường ID bổ sung. Điều này được thực hiện bằng cách đặt cả ID gốc vào bảng tham gia mới, vì vậy nó chứa x_id
và y_id
các trường, thay vì xy_id
.
Một lợi thế bổ sung cho hình thức này là nó không làm thay đổi các bảng hiện có (mặc dù chúng chưa được sản xuất). Tuy nhiên, về cơ bản, nó sao chép toàn bộ một bảng nhiều lần (hoặc cảm thấy như vậy, dù sao đi nữa) nên cũng không có vẻ lý tưởng.
Tóm lược
Cảm giác của tôi là Tùy chọn 3 và 4 tương tự nhau đủ để tôi có thể đi với một trong hai. Bây giờ tôi có thể sẽ có nếu không yêu cầu một số lượng nhỏ các liên kết cố định đến các thuộc tính, điều này làm cho Phương án 1 có vẻ hợp lý hơn so với cách khác. Dựa trên một số thử nghiệm rất hạn chế, việc thêm một DISTINCT
mệnh đề vào các truy vấn của tôi dường như không ảnh hưởng đến hiệu suất trong tình huống này, nhưng tôi không chắc rằng Tùy chọn 2 đại diện cho tình huống cũng như các vấn đề khác, vì sự trùng lặp cố hữu gây ra bởi việc đặt các cặp (X, Y) giống nhau trong nhiều hàng của bảng liên kết.
Là một trong những lựa chọn này theo cách tốt nhất của tôi về phía trước, hoặc có một cấu trúc khác tôi nên xem xét?
DISTINCT
mệnh đề, tôi đã nghĩ đến một truy vấn giống như truy vấn ở cuối # 2, liên kết x
và y
xuyên suốt xyc
nhưng không đề cập đến c
... Vì vậy, nếu tôi bị (x_id, y_id, c_id)
ràng buộc UNIQUE
với các hàng (1,1,1)
và (1,1,2)
, sau đó SELECT x.id, y.id FROM x JOIN xyc JOIN y
, tôi sẽ nhận lại hai truy vấn giống hệt nhau hàng (1,1)
, và (1,1)
.