sql >> Database teknologi >  >> RDS >> Mysql

MySQL database design. Indsættelse af rækker i 1 til 1 tabeller.

Jeg vil gøre dette til et svar, da jeg føler, at dette er en designfejl.

For det første, hvis de to tabeller er i sand 1:1 forhold, hvorfor har du ikke bare ét bord?

For det andet, hvis det ikke er en ægte 1:1 forhold, men et supertype-undertype-problem, behøver du heller ikke denne cirkulære fremmednøgle. Lad os sige table1 er Employee og table2 er Customer . Selvfølgelig er de fleste kunder ikke ansatte (og omvendt). Men nogle gange kan en kunde også være en medarbejder. Dette kan løses 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 det scenarie, du beskriver, har du to tabeller Parent og Child med 1:N forhold. Så vil du på en eller anden måde gemme det bedst ydende barn (baseret på en defineret beregning) for hver forælder.

Ville dette virke?:

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å denne måde håndhæver du den ønskede referenceintegritet (hvert BedsteBarn er et Barn, hver Forælder har kun ét BedsteBarn), og der er ingen cirkulær sti i referencerne. Referencen til det bedste barn gemmes i den ekstra tabel og ikke i Parent bord.

Du kan finde BestChild for hver forælder ved at tilmelde dig:

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

Derudover, hvis du vil gemme de bedste børn til flere præstationstests (for forskellige typer test eller test på forskellige datoer), kan du tilføje en test felt, og ændre den primære nøgle til (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. Dårlig ydeevne, når trigram-lighed og fuldtekstsøgning blev kombineret med Q ind django ved hjælp af postgres

  2. Forvandling af bruger-id til navn (separate tabeller) i PHP

  3. inkludere Jfactory-klassen i en ekstern php-fil, Joomla

  4. asp-serverfejl ' Kunne ikke indlæse fil eller samling ', men samlingen er der helt sikkert.