sql >> Databáze >  >> RDS >> Mysql

Návrh databáze MySQL. Vkládání řádků do tabulek 1to1.

Na to odpovím, protože mám pocit, že jde o konstrukční chybu.

Za prvé, pokud jsou dvě tabulky v true 1:1 vztah, proč nemáte jen jeden stůl?

Za druhé, pokud to není pravda 1:1 vztah, ale problém nadtyp-podtyp, nepotřebujete ani tyto kruhové cizí klíče. Řekněme table1 je Employee a table2 je Customer . Většina zákazníků samozřejmě nejsou zaměstnanci (a naopak). Někdy však může být zákazník také zaměstnancem. To lze vyřešit pomocí 3 tabulek:

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)

Ve scénáři, který popisujete, máte dvě tabulky Parent a Child s 1:N vztah. Potom chcete nějakým způsobem uložit nejvýkonnějšího (na základě definovaného výpočtu) potomka pro každého rodiče.

Fungovalo by to?:

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)

Tímto způsobem prosadíte požadovanou referenční integritu (každý BestChild je Child, každý rodič má pouze jeden BestChild) a v Referencích není žádná kruhová cesta. Odkaz na nejlepšího potomka je uložen v extra tabulce a ne v Parent stůl.

BestChild pro každého rodiče najdete, když se připojíte:

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

Pokud navíc chcete uložit nejlepší děti pro více testů výkonu (pro různé typy testů nebo testy v různých datech), můžete přidat test a změňte primární klíč na (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. Tabulka MYSQL se statickými a dynamickými hodnotami

  2. Password_verify v PHP

  3. Získejte aplikace s nejvyšším počtem recenzí od dynamické série dní

  4. Podobné řetězce UTF-8 pro pole automatického doplňování