Я сделаю это ответом, так как чувствую, что это недостаток дизайна.
Во-первых, если две таблицы находятся в истинных отношениях 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)