Jeg vil gøre dette til et svar, da jeg føler, at dette er en designfejl.
For det første, hvis de to tabeller er i sand 1:1
forhold, hvorfor har du ikke bare ét bord?
For det andet, hvis det ikke er en ægte 1:1
forhold, men et supertype-undertype-problem, behøver du heller ikke denne cirkulære fremmednøgle. Lad os sige table1
er Employee
og table2
er Customer
. Selvfølgelig er de fleste kunder ikke ansatte (og omvendt). Men nogle gange kan en kunde også være en medarbejder. Dette kan løses 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 det scenarie, du beskriver, har du to tabeller Parent
og Child
med 1:N
forhold. Så vil du på en eller anden måde gemme det bedst ydende barn (baseret på en defineret beregning) for hver forælder.
Ville dette virke?:
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å denne måde håndhæver du den ønskede referenceintegritet (hvert BedsteBarn er et Barn, hver Forælder har kun ét BedsteBarn), og der er ingen cirkulær sti i referencerne. Referencen til det bedste barn gemmes i den ekstra tabel og ikke i Parent
bord.
Du kan finde BestChild for hver forælder ved at tilmelde dig:
Parent
JOIN BestChild
ON Parent.id = BestChild.parentid
JOIN Child
ON BestChild.childid = Child.id
Derudover, hvis du vil gemme de bedste børn til flere præstationstests (for forskellige typer test eller test på forskellige datoer), kan du tilføje en test
felt, og ændre den primære nøgle til (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)