sql >> Base de Datos >  >> RDS >> Mysql

Diseño de base de datos MySQL. Insertar filas en tablas 1to1.

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)