Vou fazer disso uma resposta, pois sinto que isso é uma falha de design.
Primeiro, se as duas tabelas estiverem em true
1:1
relacionamento, por que você não tem apenas uma mesa? Segundo, se não for um
1:1
verdadeiro relacionamento, mas um problema de supertipo-subtipo, você também não precisa dessas chaves estrangeiras circulares. Digamos table1
é Employee
e table2
é Customer
. Claro que a maioria dos clientes não são funcionários (e vice-versa). Mas às vezes um cliente pode ser um funcionário também. Isso pode ser resolvido com 3 tabelas: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)
No cenário que você descreve, você tem duas tabelas
Parent
e Child
tendo 1:N
relação. Em seguida, você deseja armazenar de alguma forma o filho com melhor desempenho (com base em um cálculo definido) para cada pai. Isso funcionaria?:
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)
Dessa forma, você impõe a integridade referencial desejada (todo BestChild é um Filho, todo Pai possui apenas um BestChild) e não há caminho circular nas Referências. A referência ao melhor filho é armazenada na tabela extra e não no
Parent
tabela. Você pode encontrar o BestChild para todos os pais juntando-se:
Parent
JOIN BestChild
ON Parent.id = BestChild.parentid
JOIN Child
ON BestChild.childid = Child.id
Além disso, se você deseja armazenar os melhores filhos para vários testes de desempenho (para diferentes tipos de testes ou testes em várias datas), pode adicionar um
test
campo e altere a chave primária para (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)