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

Poprawne zaimplementowanie podtypu super-type w MySQL

Tabela „impreza” nie wygląda dobrze. Porównaj z kodem źródłowym z to inne pytanie SO .

W tego rodzaju strukturze numer identyfikacyjny partii rozchodzi się, że tak powiem, w dół. Zwykle powinien to być klucz podstawowy lub klucz obcy w tabelach przechowujących dane o osobie.

W Twojej tabeli „raportowanie” wygląda na to, że kluczem podstawowym nie powinno być „partyid”. To pozwoliłoby tylko na jeden wiersz na pracownika, co chyba nie było twoim zamiarem. (Mogę się mylić.) Jeśli mam rację, możesz rozważyć opcję NOT NULL UNIQUE ograniczenie na {partyid, date} i PRIMARY KEY ograniczenie nowej kolumny „reportid”. Tabele „podróże” i „wydajność” prawdopodobnie odwołują się do „raportid”. (Ale czytaj dalej.)

Na diagramie są miejsca, w których encja otrzymuje dodatkowy klucz:np. Twoja firma przypisuje swoim pracownikom unikalny numer identyfikacyjny pracownika. Nie ma żadnego teoretycznego powodu, dla którego od tego momentu nie można używać słowa „employid” zamiast „partyid” w odniesieniu do pracowników. Ale jest jest praktyczny powód, dla którego możesz tego nie chcieć. Zwiększa liczbę złączeń.

Na przykład, jeśli tabele „credential”, „tool”, „certification”, „academic” i „compliance” odwołują się do worker.employid zamiast worker.partyid, nie można po prostu dołączyć „compliance” i „party” do uzyskać imię osoby. Musisz też dołączyć do „pracownika”.

Muszą mieć klucz podstawowy; klucz podstawowy niekoniecznie musi być numerem identyfikacyjnym. Jeśli istnieje klucz naturalny, musisz go zidentyfikować i zadeklarować UNIKATOWY.

Tabela „orders” powinna prawdopodobnie mieć tylko „orderid” jako klucz podstawowy; użyj odniesienia do klucza obcego, aby zidentyfikować klienta. W niektórych przypadkach warto zmienić nazwy kolumn. W przypadku klientów sensowne może być nazwanie jego klucza „customerid” zamiast „parytid”. Sam utworzyłbym domenę.

create domain PARTY_ID as integer not null;

Wtedy wszędzie, gdzie potrzebny jest numer identyfikacyjny partii, zamiast tego używałbym domeny.

create table customers (
    customerid PARTY_ID primary key references parties (partyid),
...

Ja też wolałbym zobaczyć tabelę menedżerów. Odniesienie do niego gwarantowałoby, że manager.managerid będzie dotyczył rzeczywistego kierownika, a nie tylko dowolnego pracownika.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zliczanie zmian na osi czasu za pomocą MySQL

  2. Problemy z używaniem MS Access jako interfejsu do zaplecza bazy danych MySQL?

  3. Nieprawidłowy numer parametru:liczba powiązanych zmiennych nie zgadza się z liczbą tokenów w Doctrine

  4. Transakcja mysql Node.js

  5. Chcesz ustawić limit MySql na każdy warunek?