Na to odpovím, protože mám pocit, že jde o konstrukční chybu.
Za prvé, pokud jsou dvě tabulky v true 1:1
vztah, proč nemáte jen jeden stůl?
Za druhé, pokud to není pravda 1:1
vztah, ale problém nadtyp-podtyp, nepotřebujete ani tyto kruhové cizí klíče. Řekněme table1
je Employee
a table2
je Customer
. Většina zákazníků samozřejmě nejsou zaměstnanci (a naopak). Někdy však může být zákazník také zaměstnancem. To lze vyřešit pomocí 3 tabulek:
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)
Ve scénáři, který popisujete, máte dvě tabulky Parent
a Child
s 1:N
vztah. Potom chcete nějakým způsobem uložit nejvýkonnějšího (na základě definovaného výpočtu) potomka pro každého rodiče.
Fungovalo by to?:
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)
Tímto způsobem prosadíte požadovanou referenční integritu (každý BestChild je Child, každý rodič má pouze jeden BestChild) a v Referencích není žádná kruhová cesta. Odkaz na nejlepšího potomka je uložen v extra tabulce a ne v Parent
stůl.
BestChild pro každého rodiče najdete, když se připojíte:
Parent
JOIN BestChild
ON Parent.id = BestChild.parentid
JOIN Child
ON BestChild.childid = Child.id
Pokud navíc chcete uložit nejlepší děti pro více testů výkonu (pro různé typy testů nebo testy v různých datech), můžete přidat test
a změňte primární klíč na (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)