Ik zal hier een antwoord op maken omdat ik vind dat dit een ontwerpfout is.
Ten eerste, als de twee tabellen in waar zijn 1:1
relatie, waarom heb je niet gewoon één tafel?
Ten tweede, als het geen echte 1:1
. is relatie, maar een supertype-subtype-probleem, hebt u deze circulaire externe sleutels ook niet nodig. Laten we zeggen table1
is Employee
en table2
is Customer
. Natuurlijk zijn de meeste klanten geen werknemers (en vice versa). Maar soms kan een klant ook een werknemer zijn. Dit kan worden opgelost met 3 tabellen:
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)
In het scenario dat je beschrijft heb je twee tabellen Parent
en Child
met 1:N
relatie. Vervolgens wil je op de een of andere manier het best presterende (op basis van een gedefinieerde berekening) kind voor elke ouder opslaan.
Zou dit werken?:
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)
Op deze manier dwing je de gewenste referentiële integriteit af (elk BestChild is een kind, elke ouder heeft maar één BestChild) en is er geen cirkelvormig pad in de referenties. De verwijzing naar het beste kind wordt opgeslagen in de extra tabel en niet in de Parent
tafel.
U kunt BestChild voor elke ouder vinden door lid te worden van:
Parent
JOIN BestChild
ON Parent.id = BestChild.parentid
JOIN Child
ON BestChild.childid = Child.id
Als u bovendien de beste kinderen wilt opslaan voor meerdere prestatietests (voor verschillende soorten tests of tests op verschillende datums), kunt u een test
toevoegen veld, en verander de primaire sleutel in (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)