Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Korrekte Implementierung des Supertyp-Untertyps in MySQL

Die Tabelle "Party" sieht nicht richtig aus. Vergleichen Sie mit dem Quellcode von diese andere SO-Frage .

In einer solchen Struktur breitet sich die Partei-ID-Nummer sozusagen nach unten aus. Es sollte normalerweise entweder ein Primärschlüssel oder ein Fremdschlüssel in Tabellen sein, die Daten über eine Person speichern.

In Ihrer Tabelle "Berichte" sieht es so aus, als ob der Primärschlüssel nicht "partyid" sein sollte. Das würde nur eine Zeile pro Mitarbeiter zulassen, was Sie meiner Meinung nach nicht beabsichtigt haben. (Ich könnte mich irren.) Wenn ich damit richtig liege, könnten Sie einen NOT NULL UNIQUE in Betracht ziehen Beschränkung auf {partyid, date} und einen PRIMARY KEY Beschränkung auf eine neue Spalte, 'reportid'. Die Tabellen „travel“ und „performance“ würden wahrscheinlich auf „reportid“ verweisen. (Aber lies weiter.)

Es gibt Stellen in Ihrem Diagramm, an denen eine Entität einen zusätzlichen Schlüssel erhält:Ihr Unternehmen weist seinen Mitarbeitern beispielsweise eine eindeutige Mitarbeiter-ID zu. Es gibt keinen theoretischen Grund, warum Sie ab diesem Zeitpunkt nicht 'employid' anstelle von 'partyid' verwenden können, um auf Mitarbeiter zu verweisen. Aber es gibt ein praktischer Grund, warum Sie das vielleicht nicht tun möchten. Es erhöht die Anzahl der Joins.

Wenn beispielsweise die Tabellen „Credential“, „Tool“, „Certification“, „Academic“ und „Compliance“ auf employee.employid anstelle von employee.partyid verweisen, können Sie „Compliance“ und „Party“ nicht einfach verknüpfen den Namen der Person erhalten. Sie müssten auch "Mitarbeiter" beitreten.

Sie müssen einen Primärschlüssel haben; Der Primärschlüssel muss nicht unbedingt eine ID-Nummer sein. Wenn es einen natürlichen Schlüssel gibt, müssen Sie ihn trotzdem identifizieren und als EINZIGARTIG deklarieren.

Die Tabelle „orders“ sollte wahrscheinlich nur „orderid“ als Primärschlüssel haben; Verwenden Sie eine Fremdschlüsselreferenz, um den Kunden zu identifizieren. In einigen Fällen ist es sinnvoll, Spalten umzubenennen. Bei Kunden kann es sinnvoll sein, den Schlüssel 'customerid' statt 'parytid' zu nennen. Ich würde selbst eine Domain erstellen.

create domain PARTY_ID as integer not null;

Dann würde ich überall dort, wo eine Party-ID-Nummer benötigt wird, stattdessen die Domain verwenden.

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

Ich würde auch lieber eine Tabelle mit Managern sehen. Ein Verweis darauf würde garantieren, dass manager.managerid zu einem tatsächlichen Manager führen würde, nicht nur zu einem beliebigen Mitarbeiter.