Mysql
 sql >> база данни >  >> RDS >> Mysql

Дизайн на MySQL база данни. Вмъкване на редове в таблици 1 към 1.

Ще направя това отговор, тъй като смятам, че това е дефект в дизайна.

Първо, ако двете таблици са в истинско 1:1 връзка, защо не имате само една маса?

Второ, ако не е вярно 1:1 връзка, но проблем със супертип-подтип, вие също не се нуждаете от тези кръгови външни ключове. Да кажем table1 е Employee и table2 е Customer . Разбира се, повечето клиенти не са служители (и обратното). Но понякога клиентът може да бъде и служител. Това може да се реши с 3 таблици:

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)

В сценария, който описвате, имате две таблици Parent и Child с 1:N връзка. След това искате да съхраните по някакъв начин най-добре представящото се (въз основа на определено изчисление) дете за всеки родител.

Ще работи ли това?:

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)

По този начин вие налагате желаната референтна цялост (всяко BestChild е дете, всеки родител има само едно BestChild) и няма кръгов път в препратките. Препратката към най-доброто дете се съхранява в допълнителната таблица, а не в Parent маса.

Можете да намерите BestChild за всеки родител, като се присъедините:

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

Освен това, ако искате да съхранявате най-добрите деца за множество тестове за ефективност (за различни типове тестове или тестове на различни дати), можете да добавите test поле и променете първичния ключ на (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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как работи функцията RTRIM() в MySQL

  2. Изтриване на част от низ в MYSQL

  3. Сума до определен момент - MySql

  4. MySQL GROUP от Regex?

  5. PHP Как да върна datetime(6) от Mysql?