sql >> Database >  >> RDS >> Mysql

MySQL Database-ontwerp. Rijen invoegen in 1op1 tabellen.

Ik zal hier een antwoord op maken omdat ik vind dat dit een ontwerpfout is.

Ten eerste, als de twee tabellen in waar zijn 1:1 relatie, waarom heb je niet gewoon één tafel?

Ten tweede, als het geen echte 1:1 . is relatie, maar een supertype-subtype-probleem, hebt u deze circulaire externe sleutels ook niet nodig. Laten we zeggen table1 is Employee en table2 is Customer . Natuurlijk zijn de meeste klanten geen werknemers (en vice versa). Maar soms kan een klant ook een werknemer zijn. Dit kan worden opgelost met 3 tabellen:

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)

In het scenario dat je beschrijft heb je twee tabellen Parent en Child met 1:N relatie. Vervolgens wil je op de een of andere manier het best presterende (op basis van een gedefinieerde berekening) kind voor elke ouder opslaan.

Zou dit werken?:

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)

Op deze manier dwing je de gewenste referentiële integriteit af (elk BestChild is een kind, elke ouder heeft maar één BestChild) en is er geen cirkelvormig pad in de referenties. De verwijzing naar het beste kind wordt opgeslagen in de extra tabel en niet in de Parent tafel.

U kunt BestChild voor elke ouder vinden door lid te worden van:

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

Als u bovendien de beste kinderen wilt opslaan voor meerdere prestatietests (voor verschillende soorten tests of tests op verschillende datums), kunt u een test toevoegen veld, en verander de primaire sleutel in (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. Hoe gebruik je 2 verschillende database-adapters (SQL Server en PostgreSQL) in Rails in dezelfde omgeving?

  2. Records zoeken met NULL in een kolom

  3. SQL-query blijft zeer lang actief als zoekterm niet wordt gevonden

  4. Onjuiste gidsvolgorde