Zwei Beziehungen zu derselben Tabelle


7

Ich habe eine Transaktionstabelle, jede Transaktion hat 5-6 Kontakte beteiligt. Jeder Kontakt hat die gleichen Felder wie Name, Adresse, Zelle, E-Mail usw.

Das Beste, was ich denke, ist, dieselbe Kontakttabelle zu verwenden und sie fünfmal mit der Transaktionstabelle zu verknüpfen. Ich muss also nicht fünfmal dieselbe Art von Tabelle erstellen.

Das Problem beginnt, wenn ich mich mit dem Entity-Framework verbinde. Dies erfordert nur eine Beziehung.

Meine Frage ist, ob ich für jeden Kontakttyp 6 Kopien des Kontakts erstellen soll oder ob ich mit 6 Verknüpfungstabellen besser wäre (Eine Tabelle mit nur 2 IDs, damit ich eine Verknüpfung durchführen kann).

Ich denke, es ist ein sehr häufiges Problem, aber ich konnte keine klaren Informationen darüber finden, was der beste Weg ist.

BEARBEITEN: Beispiel für Tabellen

Antworten:


5

Am besten normalisieren Sie die Tabellen. Erstellen Sie eine contact_type-Tabelle mit einem Datensatz für jeden Kontakttyp. Erstellen Sie dann eine Junction-Tabelle contact_type_xref, die den Bezeichner aus der Kontakttabelle und den Bezeichner aus der Tabelle contact_type enthält. Laden Sie dann die jedem Kontakt zugeordneten Kontakttypen in contact_type_xref und entfernen Sie die doppelten Kontaktdatensätze aus dem Kontakt. Hier ist ein Beispiel : Schema Beispiel. Sobald Sie das Datenbankdesign repariert haben, können Sie das Entity-Framework-Problem beheben (das wahrscheinlich verschwinden wird).


1
Ich erstelle jetzt die Datenbank ... es gibt also keine Daten zum Zusammenführen / Verschieben. Ich versuche es beim ersten Mal richtig zu machen, damit ich nicht später fragen muss, wie ich es reparieren soll ...
Ezi

Sie sagen also, ich sollte 1 Kontakttabelle verwenden und dann 6 Sprungtabellen mit nur den IDs erstellen?
Ezi

@Ezi, warum sechs Sprungtische? Eine contact_type-Tabelle, eine contact-Tabelle, eine contact_type_xref-Tabelle, um die Kontakte mit den Typen zu verknüpfen. Ein Datensatz pro Kontakt in der Kontakttabelle, 6 Datensätze pro Kontakt in der Tabelle contact_type_xref, ein Datensatz pro Kontakt in der Kontakttyp-Tabelle. Es würde wahrscheinlich nicht schaden, sich über die Normalisierung der Datenbank zu informieren.
Wil

Zu welcher Tabelle würde ich die Transaktionstabelle hinzufügen?
Ezi

Das hängt von den Regeln ab. Wenn eine Transaktion nur einen Kunden haben kann, tragen Sie die Kunden-ID in die Transaktionstabelle ein. Wenn Transaktionen mehrere Kunden haben können, erstellen Sie eine customer_transaction-Tabelle mit der Kunden-ID und der Transaktions-ID. Der Kundentyp sollte nicht Teil der Verbindung zwischen Transaktionen und Kunden sein. Es sollte für die Transaktion überhaupt keine Rolle spielen, wenn der Kunde nur einen oder sechs Typen hat.
Wil

1

Zunächst einmal ist es ein bisschen wie ein Müll-Framework, das nicht mehrere Beziehungen zwischen Entitätstypen anerkennt!

Wenn Sie so viele Fremdschlüssel haben, haben Sie wahrscheinlich in Zukunft mehr (oder weniger). Mit den @ Wil-Details der Lösung können Sie dies ohne Schemaänderungen erreichen.

Eine Problemumgehung, die Ihr Framework täuschen könnte, besteht darin, Ansichten in der Datenbank für jeden Ihrer Kontakttypen zu definieren und die Framework-Beziehung von der Transaktion zur Ansicht zu definieren. Zum Beispiel

create view Manufacture as
select
    ContactID as ManufactureID,
    FirstName,
    LastName,
    ...etc.
from Contacts

Kann funktionieren oder nicht, abhängig davon, wie Ihr Framework mit der Datenbank interagiert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.