Ще направя това отговор, тъй като смятам, че това е дефект в дизайна.
Първо, ако двете таблици са в истинско 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
и Child
с 1:N
връзка. След това искате да съхраните по някакъв начин най-добре представящото се (въз основа на определено изчисление) дете за всеки родител.
Ще работи ли това?:
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)