Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Projeto de banco de dados MySQL. Inserindo linhas em tabelas 1to1.


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)