Gleiche Daten von verschiedenen Entitäten in der Datenbank - Best Practice - Telefonnummern Beispiel

7

Eine ziemlich einfache Frage: Wenn ich ein System hätte, das sich mit Angestellten, Kunden und Lieferanten beschäftigt, die alle mehrere mögliche Telefonnummern haben, wie würden Sie dann diese Zahlen auf eine normalisierte Weise speichern? Ich habe ein wenig darüber nachgedacht und der logische Weg ist nicht herausspringen.

    
henry.oswald 28.03.2011, 23:18
quelle

3 Antworten

23

In den meisten Fällen. . .

  • "Mitarbeiter" beschreibt immer Leute.
  • Einige Kunden sind Leute.
  • Einige Kunden sind Unternehmen (Organisationen).
  • "Lieferanten" sind normalerweise (immer?) Organisationen.
  • Mitarbeiter können auch Kunden sein.
  • Lieferanten können auch Kunden sein.

Es gibt ernsthafte Probleme mit separaten Tabellen mit Telefonnummern von Mitarbeitern, Telefonnummern von Lieferanten und Telefonnummern von Kunden.

  • Mitarbeiter können Kunden sein. Wenn ein Personal Telefonnummer ändert sich, tut ein Kunde Telefonnummer muss auch aktualisiert werden? Woher weißt du, welche zu aktualisieren?
  • Lieferanten können Kunden sein. Wenn ein Telefonnummer des Lieferanten ändert sich, tut ein Kunde Telefonnummer muss auch aktualisiert werden? Woher weißt du, welche zu aktualisieren?
  • Sie müssen die Einschränkungen duplizieren und ohne Fehler beibehalten für Telefonnummern in jeder Tabelle, die speichert Telefonnummern.
  • Die gleichen Probleme entstehen, wenn a Die Telefonnummer des Kunden ändert sich. Jetzt Sie müssen überprüfen, ob Mitarbeiter und Lieferantenrufnummern müssen auch aktualisiert werden.
  • Um die Frage "When Telefon Nummer ist 123-456-7890? ", müssen Sie schau in 'n' verschiedene Tabellen, wo 'n' ist die Anzahl der verschiedenen "Arten" von Parteien, mit denen Sie zu tun haben. Im Zusätzlich zu Mitarbeitern, Kunden und Lieferanten, denken "Auftragnehmer" Telefone "," Prospect's Telefone ", etc.

Sie müssen ein Supertype / Subtype-Schema implementieren. (PostgreSQL-Code, nicht streng getestet.)

%Vor%

Um dies ein bisschen weiter auszudehnen, muss eine Tabelle zum Implementieren von "Mitarbeitern" auf den Personensubtyp verweisen, nicht auf den Party-Supertyp. Organisationen können nicht Mitarbeiter sein.

%Vor%

Wenn Lieferanten nur Organisationen und keine Einzelpersonen sein können, würde eine Tabelle, die Lieferanten implementiert, auf ähnliche Weise auf den Untertyp Organisationen verweisen.

Für die meisten Unternehmen kann ein Kunde entweder eine Person oder eine Organisation sein. Daher sollte eine Tabelle, die Kunden implementiert, auf den Supertyp verweisen.

%Vor%     
Mike Sherrill 'Cat Recall' 29.03.2011, 10:44
quelle
0

Ich denke, dass die Entscheidung auf einer praktischen Bewertung basieren muss, wie wichtig diese Kontaktinformationen sind, wie oft sie sich ändern und wie viele Überschneidungen es zwischen verschiedenen Arten von Menschen mit Telefonnummern gibt.

Wenn die Kontaktinformationen flüchtig und / oder wirklich zentral für die Anwendung sind, wird wahrscheinlich mehr Normalisierung besser sein. Dies würde bedeuten, dass Sie eine PHONE_NUMBER-Tabelle haben, auf die Ihre verschiedenen CUSTOMER-, SUPPLIER-, EMPLOYEE-Tabellen (usw.) verweisen könnten - oder eher mit einer Art dreiseitigen Schnittpunkt zwischen Kontakttyp, Kontaktperson (Kunde / Lieferant / Mitarbeiter) und Kontaktstelle (Telefon). Auf diese Weise können Sie die private Telefonnummer eines Mitarbeiters als primäre Geschäftsnummer des Kundeneintrags festlegen. Wenn sich diese ändert, wird sie einmal für jede Verwendung dieses Kontaktpunkts geändert.

Auf der anderen Seite, wenn Sie Telefonnummern für den Teufel davon speichern und Sie nicht verwenden und wahrscheinlich nicht beibehalten werden, dann verbringen Sie eine Menge Zeit und Mühe Modellierung und Aufbau dieser Raffinesse in Ihre Datenbank wird es nicht wert sein und Sie können die guten, altmodischen Phone1, Phone2, Phone3, ... Spalten auf KUNDE, LIEFERANT, MITARBEITER oder was Sie haben. Dies ist ein schlechtes Datenbankdesign, aber es ist eine gute Systementwicklungspraxis, da es die 80/20-Regel anwendet, um Projektprioritäten zu identifizieren.

Um es zusammenzufassen: Wenn die Daten wichtig sind, machen Sie es richtig, wenn die Daten nicht wirklich wichtig sind, fügen Sie sie einfach hinzu - oder besser: lassen Sie sie ganz weg.

    
Joel Brown 29.03.2011 19:42
quelle
-1

Der einfachste Weg ist wahrscheinlich der beste. Selbst wenn Mitarbeiter, Kunden oder Lieferanten einen Standort für Telefon, Mobiltelefon und Faxnummer haben, ist es wahrscheinlich am besten, diese Felder auf jeden Tisch zu legen.

Aber , je mehr Felder Sie haben, desto mehr sollten Sie eine Art von "Vererbung" oder Zentralisierung in Erwägung ziehen. Wenn es andere Kontaktinformationen sowie mehrere Telefonnummern gibt, können Sie diese gemeinsamen Werte in einer zentralen Tabelle, Kontakte , haben. Felder, die spezifisch für einen Kunden, einen Lieferanten usw. sind, würden auf separaten Tabellen liegen. Die Customer-Tabelle beispielsweise hätte einen ContactID-Fremdschlüssel zurück zu Contacts.

    
Patrick Karcher 28.03.2011 23:21
quelle