我因爲我覺得這是一個設計缺陷,所以我會做出這個答案。
首先,如果兩個表都是真的1:1
的關係,爲什麼你不只有一個表?
其次,如果它不是一個真正的1:1
關係,而是一個超亞型的問題,你也不需要這個圓形的外鍵。假設table1
是Employee
和table2
是Customer
。當然大多數客戶不是員工(反之亦然)。但有時客戶也可能是一名員工。這是可以解決的有3個表:
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)
在你描述的情況下,你有兩個表Parent
並具有1:N
關係Child
。然後,您想要以某種方式爲每個父母存儲最佳表現(基於定義的計算)孩子。
將這項工作?:
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)
這樣,你強制想引用完整性(每BestChild是一個孩子,每一個家長只有一個BestChild),而且在沒有引用任何圓形路徑。對最好的孩子的引用存儲在附加表中,而不是在Parent
表中。
您可以通過加入找到BestChild爲每位家長:
Parent
JOIN BestChild
ON Parent.id = BestChild.parentid
JOIN Child
ON BestChild.childid = Child.id
此外,如果要存儲多個性能測試最好的兒童(針對不同類型的測試,或在不同日期測試) ,你可以添加一個test
場,並改變主鍵(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)
我經常觀察到的這種關係是兩個表應該在一個表中,或者只有一個表需要參考。 – Jacob
在這種情況下這是不正確的。不管怎樣,謝謝! –
@Emilio:在這種情況下你可能認爲這是不正確的。但也許有辦法改變這兩張桌子上的設計,所以沒有像這樣的循環路徑。你能描述爲什麼需要這兩種關係嗎?這兩張表是什麼? –