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

Modelowanie bazy danych dla słabego podmiotu

Jednostka nie jest słaba, ponieważ nie może istnieć niezależnie, ale dlatego, że nie można jej zidentyfikować niezależnie. Dlatego relacja, która „prowadzi” do słabego bytu, nazywana jest relacją „identyfikującą”. W praktyce oznacza to, że klucz podstawowy rodzica jest migrowany do (zwykle właściwy ) podzbiór PK dziecka (termin „słaba jednostka” jest zwykle definiowany w odniesieniu do kluczy podstawowych, chociaż teoretycznie może odnosić się do dowolnego klucza).

Jest całkowicie uzasadnione posiadanie jednostki, która nie może istnieć niezależnie, ale może być niezależnie zidentyfikowana - innymi słowy, to jest w nieidentyfikującej relacji z nie-NULL.

Musisz zapytać:czy historyLineID być wyjątkowym samodzielnie lub w połączeniu z orderID ? Podejrzewam, że ma to miejsce w tym drugim przypadku, co czyni go słabym podmiotem.

To, co nam pokazałeś, nie jest słabą jednostką - PK rodzica nie jest przenoszone do PK dziecka.

Masz zasadniczo dwie opcje:

  • orderHistory ma złożony PK:{orderID, historyLineID} , gdzie orderID to FK. BTW, ten PK można uznać za „naturalny”:

  • orderHistory ma zastępczy PK:{orderHistoryID} , natomiast orderID jest poza PK. Nadal musisz mieć alternatywny klucz {orderID, historyLineID} chociaż:

Tak, to pierwsza opcja opisana powyżej. Chyba że masz relacje podrzędne w orderHistory samo w sobie jest to również najlepsze rozwiązanie. Jeśli orderHistory ma dzieci, to może, ale nie musi, być najlepszym rozwiązaniem, w zależności od kilku czynników.

To nie jest albo-albo. Pole może być zarówno FK, jak i częścią klucza (podstawowego lub alternatywnego), jak pokazano powyżej.

Nie będziesz w stanie dotrzeć do 3NF, chyba że poprawnie określisz swoje klucze i nie będziesz w stanie tego zrobić bez rozważenia, która jednostka może być zidentyfikowana niezależnie, a która nie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak robić kopie zapasowe w MySQL?

  2. Pobierz wartości z ostatnich 6 miesięcy w mysql

  3. A.* nie znajduje się w GROUP BY z lewym sprzężeniem w konstruktorze zapytań laravel

  4. Przyznaj MySQL uprawnienia do tabel i kolumn

  5. MYSQL Dodaj dni robocze do tej pory