Haben diese Datenbankdesignstile (oder Antimuster) Namen?

8

Betrachten Sie eine Datenbank mit den Tabellen Produkte und Mitarbeiter. Es gibt eine neue Anforderung, aktuelle Produktmanager zu modellieren, da sie der einzige Mitarbeiter sind, der für ein Produkt verantwortlich ist. Einige Produkte sind einfach oder ausgereift genug, um keinen Produktmanager zu benötigen. Das heißt, jedes Produkt kann null oder einen Produktmanager haben.

Ansatz 1: Ändern Sie die Tabelle Product , um eine neue NULL fähige Spalte product_manager_employee_ID hinzuzufügen, sodass ein Produkt ohne Produktmanager durch den Wert NULL modelliert wird.

Ansatz 2: Erstellen Sie eine neue Tabelle ProductManagers mit nicht NULL fähigen Spalten product_ID und employee_ID mit einer eindeutigen Einschränkung für product_ID , so dass ein Produkt ohne Produktmanager von der Fehlen einer Zeile in dieser Tabelle.

Es gibt andere Ansätze, aber diese beiden scheinen mir am häufigsten zu begegnen.

Unter der Annahme, dass beide legitime Design-Entscheidungen sind (wie ich geneigt bin zu glauben) und nur verschiedene Stile repräsentieren, haben sie Namen? Ich bevorzuge Ansatz 2 und finde es schwierig, den Unterschied im Stil zu jemandem zu vermitteln, der Ansatz 1 bevorzugt, ohne ein tatsächliches Beispiel zu verwenden (wie ich es hier getan habe!) Ich wäre nett, wenn ich sagen könnte: "Ich bevorzuge die Neigung-zu-6NF (oder was auch immer) Stil selbst. "

Unter der Annahme, dass einer dieser Ansätze tatsächlich ein Anti-Pattern ist (da ich vermute, dass dies für Ansatz 1 der Fall sein kann, indem eine Beziehung zwischen zwei Entitäten als Attribut einer dieser Entitäten modelliert wird), hat dieses Anti-Pattern a Name?

    
onedaywhen 05.06.2009, 09:20
quelle

5 Antworten

9

Nun, der erste ist nichts anderes als eine Eins-zu-viele-Beziehung (ein Mitarbeiter zu vielen Produkten). Dies wird manchmal als O: M-Beziehung bezeichnet (null zu viele), weil es optional ist (nicht jedes Produkt hat einen Produktmanager). Auch ist nicht jeder Mitarbeiter ein Produktmanager, also ist es auch auf der anderen Seite optional.

Die zweite ist eine Join-Tabelle, die normalerweise für eine Viele-zu-Viele-Beziehung verwendet wird. Aber da eine Seite nur eins zu eins ist (jedes Produkt ist nur einmal in der Tabelle), ist es wirklich nur eine verschachtelte Eins-zu-Viele-Beziehung.

Persönlich bevorzuge ich den ersten, aber keiner ist falsch (oder schlecht).

Der zweite würde aus zwei Gründen verwendet werden, die in den Sinn kommen.

  1. Sie stellen sich die Möglichkeit vor, dass ein Produkt mehr als einen Manager hat; oder
  2. Sie möchten die Historie des Produktmanagers für ein Produkt verfolgen. Dies tun Sie mit einer Current_Flag-Spalte, die auf "Y" (oder ähnlich) gesetzt ist, wobei nur jeweils eine gleichzeitig aktuell sein kann. Dies ist ein ziemlich häufiges Muster in datenbankzentrierten Anwendungen.
cletus 05.06.2009, 09:25
quelle
2

Es sieht für mich wie das zwei verschiedene Verhalten des Modells aus. Im ersten Beispiel können Sie einen Produktmanager pro Produkt haben und ein Mitarbeiter kann Produktmanager für mehr als ein Produkt sein (eins zu viele). Die zweite scheint mehr als einen Produktmanager pro Produkt zuzulassen (viele zu viele). Dies würde darauf hindeuten, dass die beiden Lösungen in verschiedenen Situationen gleichermaßen gültig sind und welche Sie von der Geschäftsregel abhängig machen würden.

    
1800 INFORMATION 05.06.2009 09:26
quelle
0

Es gibt einen Fehler in der ersten Annäherung. Stellen Sie sich eine Sekunde vor, dass sich die Geschäftsanforderungen geändert haben und Sie nun in der Lage sein müssen, 2 Product Manager auf ein Produkt zu setzen. Was wirst du machen? Hinzufügen einer weiteren Spalte zur Tabelle Produkt? Jawohl. Dies verstößt offensichtlich gegen 1NF.

Eine weitere Möglichkeit, die der zweite Ansatz bietet, ist die Möglichkeit, einige Attribute für einen bestimmten Produktmanager zu speichern. & lt; - & gt; Produktbeziehung. Wenn Sie beispielsweise zwei Produktmanager für ein Produkt haben, können Sie eines davon als primären ... Oder, zum Beispiel, ein Mitarbeiter kann eine Telefonnummer haben, aber als Produktmanager kann er / sie eine andere Telefonnummer haben ... Das geht dann auch in die spezielle Tabelle.

    
Max Galkin 05.06.2009 09:30
quelle
0

Ansatz 1)

  1. Verlangsamt die Verwendung der Product-Tabelle mit dem zusätzlichen Product Manager-Feld (möglicherweise nicht für alle Datenbanken, sondern für einige).
  2. Die Verknüpfung von der Product-Tabelle mit der Employee-Tabelle ist einfach.

Ansatz 2)

  1. Vorhandene Abfragen, die die Produkttabelle verwenden, sind nicht betroffen.
  2. Erhöht die Größe Ihrer Datenbank. Sie haben jetzt die Produkt-ID-Spalte in eine andere Tabelle dupliziert und dieser Tabelle eindeutige Einschränkungen und Indizes hinzugefügt.
  3. Die Verknüpfung von der Product-Tabelle mit der Employee-Tabelle ist mühsamer und kostspieliger, da Sie zuerst in die Zwischentabelle aufnehmen müssen.

Wie oft müssen Sie die Tabellen verknüpfen?

Wie viele andere Abfragen verwenden die Produkttabelle?

Wie viele Datensätze in der Produkttabelle?

    
Paul Morgan 05.06.2009 18:52
quelle
0

In dem speziellen Fall, den Sie geben, denke ich, dass die Hauptmotivation für zwei Tabellen darin besteht, Nullen für fehlende Daten zu vermeiden, und so würde ich die beiden Ansätze charakterisieren.

Es gibt eine Diskussion über die Vor- und Nachteile auf Wikipedia .

Ich bin mir ziemlich sicher, dass er die Relationstheorie definiert, so dass nur die Lösung mit mehreren Tabellen "gültig" ist. Zum Beispiel könnten Sie den Single-Table-Ansatz "schlecht typisiert" aufrufen (da der Typ von Null unklar - siehe Zitat auf S.4).

    
andrew cooke 26.03.2012 11:59
quelle