Haré de esto una respuesta ya que siento que es un defecto de diseño.
Primero, si las dos tablas están en verdadero 1:1
relación, ¿por qué no tienes solo una mesa?
Segundo, si no es un verdadero 1:1
relación sino un problema de supertipo-subtipo, tampoco necesita estas claves foráneas circulares. Digamos table1
es Employee
y table2
es Customer
. Por supuesto, la mayoría de los clientes no son empleados (y viceversa). Pero a veces un cliente también puede ser un empleado. Esto se puede solucionar con 3 tablas:
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)
En el escenario que describe, tiene dos tablas Parent
y Child
teniendo 1:N
relación. Luego, desea almacenar de alguna manera el hijo con mejor desempeño (basado en un cálculo definido) para cada padre.
¿Funcionaría esto?:
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)
De esta manera, se impone la integridad referencial deseada (cada BestChild es un Child, cada Parent tiene solo un BestChild) y no hay una ruta circular en las Referencias. La referencia al mejor hijo se almacena en la tabla extra y no en el Parent
mesa.
Puede encontrar BestChild para cada padre uniéndose a:
Parent
JOIN BestChild
ON Parent.id = BestChild.parentid
JOIN Child
ON BestChild.childid = Child.id
Además, si desea almacenar mejores hijos para múltiples pruebas de rendimiento (para diferentes tipos de pruebas o pruebas en varias fechas), puede agregar una test
y cambie la clave principal a (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)