Wie verwende ich Subtypen in einer SQL Server-Datenbank?

8

Ich arbeite an einem Programm, in dem Sie Beschwerden anmelden können. Es gibt drei Arten von Beschwerden: internal (Fehler von Mitarbeitern), external (Fehler von einem anderen Unternehmen) und supplier (Fehler von einem Lieferanten). Sie enthalten unterschiedliche Daten, die nicht geteilt werden können. Ich habe derzeit 4 Tabellen (Beschwerde, Mitarbeiter, Firma und Lieferant). Hier ist eine Visualisierung der Tabellen:

Ich habe ein grundlegendes Verständnis von Subtypen, aber ich kann nicht scheinen, sie von einer ERD in eine tatsächliche SQL Server-Datenbank oder zumindest in diesem Szenario zu übersetzen. So sehen die 4 Tabellen aus (irrelevante Attribute werden weggelassen):

Beschwerde
Beschwerde-ID-PK

Mitarbeiter
EmployeeId PK
Mitarbeitername

Unternehmen
CompanyId PK
Firmenname

Lieferant
SupplierId PK
Lieferantenname

Beim Registrieren einer Beschwerde wird der Fehler von einem der drei Typen gemacht und alle speichern unterschiedliche Informationen. Was ist der beste Weg, um Informationen in diesem Fall zu speichern? Ich habe darüber nachgedacht, 2 Diskriminatoren in die Reklamationstabelle zu setzen: ComplaintType und Id , damit ich auf die zu überprüfende Tabelle und die benötigte ID zeigen kann, aber das ist weder sehr sauber noch effizient.

Bitte helfen Sie.

    
Fusyion 08.10.2010, 20:26
quelle

5 Antworten

4

Ich empfehle Ihnen dringend, die "2 diskriminators" -Methode NICHT zu verwenden. Sie verfügen über eine Spalte für einen Fremdschlüssel, der je nach Feld "ComplaintType" auf eine von drei Tabellen verweist. Wenn Sie dies tun, umgehen Sie die referenziellen Integritätsprüfungen, die von SQL Server bereitgestellt werden, und alle Vorteile, die mit Fremdschlüsseln geliefert werden. Bei meinem vorherigen Job gab es eine Tabelle namens EntityTypeIndexLabel, die eine "Bridge-Tabelle" war, die IndexLabels (im Grunde Metadaten) an verschiedene "Entitäten" anschloss, bei denen es sich um verschiedene potentielle Tabellen (Dokument, Binder, Workflow usw.) handelte. Das war einfach schrecklich. Der FK in dieser Tabelle könnte auf viele verschiedene Tabellen verweisen. Verwaiste Datensätze können überall auftauchen. Zusätzliche Logik musste implementiert werden, um zu bestimmen, auf welcher Tabelle sich ein Join befindet. Joins waren im Allgemeinen ein Schmerz zu schreiben. Es waren alle möglichen Kopfschmerzen.

Ich denke, Ihre zwei Optionen sind:

-3 Spalten in Reklamation: EmployeeComplaintID, CompanyComplaintID, SupplierComplaintID. Reklamations-IDs sollten in allen Tabellen eindeutig sein (denke hier anstelle von IDENTITY-Spalten GUIDs). Für jede Zeile in Reklamation wird nur eine dieser IDs ausgefüllt, die anderen beiden sind NULL. Dann können Sie einfach OUTER JOIN für diese Tabellen in jeder Abfrage verlassen, um die benötigten Daten zu erhalten.

- Eine riesige Tabelle mit allen möglichen Feldern, die Sie für jeden Reklamationstyp benötigen, wobei nicht verwendete Felder anderer Reklamationstypen auf NULL gesetzt werden.

    
Mario 08.10.2010, 20:46
quelle
13

Sehen Sie ein paar wirklich gute Ressourcen zum Thema:

Es gibt grundsätzlich drei bekannte Ansätze:

  • Tabelle pro Unterklasse
  • Tabelle pro Hierarchie
  • Tabelle pro Betontyp

Jeder hat Vor- und Nachteile, glänzt in einer Situation und saugt andere ein - studieren Sie die Ressourcen und sehen Sie, welche der drei am besten zu Ihren Bedürfnissen passt.

    
marc_s 08.10.2010 20:55
quelle
1

Ist das Hauptproblem, dass Sie irgendeine Art von "Seriennummer" benötigen, um eine Beschwerde unabhängig von welchem ​​Typ eindeutig zu identifizieren? Im Grunde brauchen Sie dann eine Tabelle für jede Art von Beschwerde (wie Sie denken werden), plus die Master-Tabelle "Beschwerde" mit der Beschwerde-ID. Jede typspezifische Tabelle hat einen Fremdschlüssel für Complaint.ComplaintId. Es kann nützlich sein, ein "Typ" -Feld in der Reklamation zu haben, aber das ist nicht wirklich notwendig für das Modell.

    
Andrew 08.10.2010 20:30
quelle
1

Sie können eine requestSubTypeID mit einer FK-Beziehung zum PK aller drei Ihrer Subtyptabellen haben - Mitarbeiter, Unternehmen und Lieferant.

    
Beth 08.10.2010 20:36
quelle
0

Als Antwort auf Ihre Bemerkung zur akzeptierten Antwort:

Im Folgenden finden Sie eine Möglichkeit, eine Überprüfung durchzuführen, um sicherzustellen, dass nur einer der drei Schlüssel Daten enthält:

%Vor%     
joefromct 05.09.2014 01:20
quelle

Tags und Links