Jag ska göra detta till ett svar eftersom jag känner att detta är ett designfel.
Först, om de två tabellerna är i sann 1:1
relation, varför har du inte bara ett bord?
För det andra, om det inte är en sann 1:1
relation men ett supertyp-undertypsproblem, du behöver inte heller dessa cirkulära främmande nycklar. Låt oss säga table1
är Employee
och table2
är Customer
. Naturligtvis är de flesta kunder inte anställda (och vice versa). Men ibland kan en kund också vara anställd. Detta kan lösas med 3 tabeller:
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)
I scenariot du beskriver har du två tabeller Parent
och Child
med 1:N
relation. Sedan vill du på något sätt lagra det bäst presterande barnet (baserat på en definierad beräkning) för varje förälder.
Skulle detta fungera?:
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)
På så sätt upprätthåller du den önskade referensintegriteten (varje BestChild är ett barn, varje förälder har bara ett BestChild) och det finns ingen cirkulär bana i referenserna. Referensen till det bästa barnet lagras i den extra tabellen och inte i Parent
tabell.
Du kan hitta BestChild för varje förälder genom att gå med:
Parent
JOIN BestChild
ON Parent.id = BestChild.parentid
JOIN Child
ON BestChild.childid = Child.id
Om du dessutom vill lagra de bästa barnen för flera prestandatester (för olika typer av tester eller tester på olika datum), kan du lägga till ett test
och ändra den primära nyckeln till (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)