sql >> Databasteknik >  >> RDS >> Mysql

MySQL-databasdesign. Infoga rader i 1to1-tabeller.

Jag ska göra detta till ett svar eftersom jag känner att detta är ett designfel.

Först, om de två tabellerna är i sann 1:1 relation, varför har du inte bara ett bord?

För det andra, om det inte är en sann 1:1 relation men ett supertyp-undertypsproblem, du behöver inte heller dessa cirkulära främmande nycklar. Låt oss säga table1 är Employee och table2 är Customer . Naturligtvis är de flesta kunder inte anställda (och vice versa). Men ibland kan en kund också vara anställd. Detta kan lösas med 3 tabeller:

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)

I scenariot du beskriver har du två tabeller Parent och Child med 1:N relation. Sedan vill du på något sätt lagra det bäst presterande barnet (baserat på en definierad beräkning) för varje förälder.

Skulle detta fungera?:

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)

På så sätt upprätthåller du den önskade referensintegriteten (varje BestChild är ett barn, varje förälder har bara ett BestChild) och det finns ingen cirkulär bana i referenserna. Referensen till det bästa barnet lagras i den extra tabellen och inte i Parent tabell.

Du kan hitta BestChild för varje förälder genom att gå med:

Parent
  JOIN BestChild
    ON Parent.id = BestChild.parentid
  JOIN Child
    ON BestChild.childid = Child.id

Om du dessutom vill lagra de bästa barnen för flera prestandatester (för olika typer av tester eller tester på olika datum), kan du lägga till ett test och ändra den primära nyckeln till (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)


  1. JPA EclipseLink DatabaseException:'tabell foo.SEQUENCE existerar inte'

  2. Oracle datumsekvens?

  3. Returnera rader som är max en kolumn i Postgresql

  4. Beräknar medianen med Mysql