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

Správná implementace podtypu supertypu v MySQL

Stolní "párty" nevypadá správně. Porovnejte se zdrojovým kódem z tato další SO otázka .

V tomto druhu struktury se identifikační číslo strany šíří směrem dolů, abych tak řekl. Obvykle by to měl být primární klíč nebo cizí klíč v tabulkách, které uchovávají data o osobě.

Ve vaší tabulce „přehledy“ to vypadá, že primární klíč by neměl být „partyid“. To by umožnilo pouze jeden řádek na zaměstnance, což si nemyslím, že jste zamýšlel. (Mohu se mýlit.) Pokud v tom mám pravdu, můžete zvážit NOT NULL UNIQUE omezení na {partyid, date} a PRIMARY KEY omezení na nový sloupec, 'reportid'. Tabulky „cestování“ a „výkon“ by pravděpodobně odkazovaly na „reportid“. (Ale čtěte dál.)

Ve vašem diagramu jsou místa, kde entita získá další klíč:vaše společnost například svým zaměstnancům přiřadí jedinečné identifikační číslo zaměstnance. Neexistuje žádný teoretický důvod, proč byste od tohoto okamžiku nemohli použít 'employid' místo 'partyid' pro referenci zaměstnanců. Ale existuje praktický důvod, proč to možná nechcete dělat. Zvyšuje počet spojení.

Pokud například tabulky „pověření“, „nástroj“, „certifikace“, „akademický“ a „shoda“ odkazovaly na zaměstnanec.employid namísto zaměstnanec.partyid, nemohli byste pouze připojit výrazy „dodržování“ a „strana“ k získat jméno osoby. Také byste se museli připojit k „zaměstnanci“.

Musí mít primární klíč; primární klíč nemusí být nutně identifikační číslo. Pokud existuje přirozený klíč, musíte jej identifikovat a prohlásit za UNIKÁTNÍ.

Tabulka "objednávky" by pravděpodobně měla mít jako primární klíč pouze "orderid"; k identifikaci zákazníka použijte odkaz na cizí klíč. V některých případech má smysl sloupce přejmenovat. V případě zákazníků může mít smysl nazývat jeho klíč „customerid“ namísto „parytid“. Vytvořil bych si doménu sám.

create domain PARTY_ID as integer not null;

Všude, kde je potřeba identifikační číslo strany, bych místo toho použil doménu.

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

Také bych raději viděl tabulku manažerů. Odkaz na něj by zaručil, že manager.managerid se přenese na skutečného manažera, nikoli jen na kteréhokoli zaměstnance.




  1. Externí metaúložiště úlu pro EMR

  2. Dávkové vkládání EclipseLink je velmi pomalé

  3. Laravel - Querybuilder se spojením a spojením

  4. Používáte proměnnou relace PHP v souboru MySQL spuštěném v PHP?