Tôi sẽ trả lời đây là một câu trả lời vì tôi cảm thấy đây là một sai sót trong thiết kế.
Đầu tiên, nếu hai bảng ở đúng 1:1
mối quan hệ, tại sao bạn không chỉ có một bảng?
Thứ hai, nếu nó không phải là 1:1
đúng mối quan hệ nhưng là vấn đề siêu kiểu-phụ, bạn cũng không cần khóa ngoại hình tròn này. Hãy nói table1
là Employee
và table2
là Customer
. Tất nhiên, hầu hết khách hàng không phải là nhân viên (và ngược lại). Nhưng đôi khi khách hàng cũng có thể là nhân viên. Điều này có thể được giải quyết bằng 3 bảng:
Person
------
id
PRIMARY KEY: id
Employee
--------
personid
lastname
firstname
... other data
PRIMARY KEY: personid
FOREIGN KEY: personid
REFERENCES Person(id)
Customer
--------
personid
creditCardNumber
... other data
PRIMARY KEY: personid
FOREIGN KEY: personid
REFERENCES Person(id)
Trong trường hợp bạn mô tả, bạn có hai bảng Parent
và Child
có 1:N
mối quan hệ. Sau đó, bạn muốn lưu trữ bằng cách nào đó con hoạt động tốt nhất (dựa trên một phép tính đã xác định) cho mọi phụ huynh.
Điều này có hiệu quả không?:
Parent
------
id
PRIMARY KEY: id
Child
-----
id
parentid
... other data
PRIMARY KEY: id
FOREIGN KEY: parentid
REFERENCES Parent(id)
UNIQUE KEY: (id, parentid) --- needed for the FK below
BestChild
---------
parentid
childid
... other data
PRIMARY KEY: parentid
FOREIGN KEY: (childid, parentid)
REFERENCES Child(id, parentid)
Bằng cách này, bạn thực thi tính toàn vẹn tham chiếu mong muốn (mọi BestChild là Con, mọi Cha mẹ chỉ có một BestChild) và không có đường dẫn vòng tròn trong Tham chiếu. Tham chiếu đến con tốt nhất được lưu trữ trong bảng phụ chứ không phải trong Parent
bàn.
Bạn có thể tìm thấy BestChild cho mọi Phụ huynh bằng cách tham gia:
Parent
JOIN BestChild
ON Parent.id = BestChild.parentid
JOIN Child
ON BestChild.childid = Child.id
Ngoài ra, nếu bạn muốn lưu trữ các phần tử con tốt nhất cho nhiều bài kiểm tra hiệu suất (đối với các loại bài kiểm tra khác nhau hoặc các bài kiểm tra vào các ngày khác nhau), bạn có thể thêm một test
và thay đổi Khóa chính thành (test, parentid)
:
BestChild
---------
testid
parentid
childid
... other data
PRIMARY KEY: (testid, parentid)
FOREIGN KEY: (childid, parentid)
REFERENCES Child(id, parentid)
FOREIGN KEY: testid
REFERENCES Test(id)