Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Projekt bazy danych MySQL. Wstawianie wierszy w tabelach 1 do 1.

Udzielę odpowiedzi, ponieważ uważam, że jest to wada projektu.

Po pierwsze, jeśli dwie tabele mają wartość true 1:1 związek, dlaczego nie masz tylko jednego stolika?

Po drugie, jeśli nie jest to prawda 1:1 związek, ale problem nadtypu-podtypu, nie potrzebujesz też tych okrągłych kluczy obcych. Powiedzmy table1 jest Employee i table2 to Customer . Oczywiście większość klientów to nie pracownicy (i odwrotnie). Ale czasami klient może być również pracownikiem. Można to rozwiązać za pomocą 3 tabel:

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)

W scenariuszu, który opisujesz, masz dwie tabele Parent i Child mając 1:N relacja. Następnie chcesz w jakiś sposób przechowywać najskuteczniejsze (w oparciu o zdefiniowane obliczenia) dziecko dla każdego rodzica.

Czy to zadziała?:

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)

W ten sposób wymuszasz pożądaną integralność referencyjną (każde BestChild jest Dzieckiem, każdy Rodzic ma tylko jedno BestChild) i nie ma okrężnej ścieżki w Referencjach. Odniesienie do najlepszego dziecka jest przechowywane w dodatkowej tabeli, a nie w Parent stół.

Możesz znaleźć BestChild dla każdego rodzica, dołączając:

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

Dodatkowo, jeśli chcesz przechowywać najlepsze dzieci dla wielu testów wydajności (dla różnych typów testów lub testów w różnych terminach), możesz dodać test i zmień klucz podstawowy 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. usuń link nie usuwając żadnego rekordu w bazie mysql

  2. Wyświetlaj określone pola z bazy danych w polach wartości i tekstowych pola combobox w Symfony2

  3. Synchronizacja SQL Server z programem MySQL

  4. błąd wykonania:java.lang.ClassNotFoundException:com.mysql.jdbc.Driver

  5. Jak uzyskać rozmiar kolumny w tabeli mysql?