PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Gibt es Optionen für eine Join-Tabelle für Many-to-Many-Verknüpfungen?

  • Wenn Modelle keine Farbgruppen teilen, wäre das Design eine Tabelle:

    model [model] comes in color [color]
    
  • Wenn Modelle Farbgruppen teilen, dann haben sie zwei Tabellen:

    model [model] comes in the colors of group [group]
    group [group] has color [color]
    

    Diese Tabellen schließen sich mit Projektion an die erste Tabelle an:

    SELECT model, color FROM model_group NATURAL JOIN group_color
    
  • Wenn ein Modell zusätzlich zu oder anstelle einer Gruppe außergewöhnliche verfügbare und/oder nicht verfügbare Farben haben kann, dann haben Sie Ausnahmetabellen. Die Gruppe einer Tabelle ist jetzt ihr Standard Farben (falls vorhanden):

    model [model] has default color group [group]
    group [group] has color [color]
    model [model] is exceptionally available in color [color]
    model [model] is exceptionally unavailable in color [color]
    

    Die Ausnahmetabellen werden dann jeweils UNIONed mit und MINUSed/EXCEPTed von einem JOIN-plus-PROJECT/SELECT, um die erste Tabelle zu erhalten:

    SELECT group, color FROM model_default NATURAL JOIN group_colour
    EXCEPT SELECT * FROM model_unavailable
    UNION SELECT * FROM model_available
    

Bei „Redundanz“ geht es nicht darum, dass Werte an mehreren Stellen vorkommen. Es geht um mehrere Zeilen, die dasselbe über die Anwendung aussagen.

Jede Tabelle (und jeder Abfrageausdruck) hat eine zugeordnete Fill-in-the-(named-)blanks-Anweisungsvorlage (auch bekannt als Prädikat). Die Zeilen, die eine wahre Aussage machen, gehen in die Tabelle. Wenn Sie zwei unabhängige Prädikate haben, benötigen Sie zwei Tabellen. Die relevanten Werte gehen in die Zeilen von jedem.

Zu Zeilen, die Aussagen über die Anwendung machen, siehe hier. (Und suchen Sie meine anderen Antworten nach der "Aussage" oder dem "Kriterium" einer Tabelle.) Die Normalisierung hilft, weil sie Tabellen ersetzt, deren Zeilen Dinge der Form "... UND ..." durch andere Tabellen ersetzen, die die "... „separat. Siehe dies und das.

Wenn Sie Gruppen teilen und nur eine einzige zweispaltige Tabelle für Modell und Farbe verwenden, lautet ihr Prädikat:

FOR SOME group
    model [model] comes in the colors of group [group]
AND group [group] has color [color]

Der zweite Aufzählungspunkt entfernt also ein einzelnes „UND“ aus diesem Prädikat, dh der Quelle einer „mehrwertigen Abhängigkeit“. Andernfalls müssen Sie, wenn Sie die Gruppe eines Modells oder die Farben einer Gruppe ändern, gleichzeitig mehrere Zeilen konsistent ändern. (Es geht darum, Fehler und Komplexität durch Redundanz zu reduzieren, nicht um Platz zu sparen.)

Wenn Sie die Strings nicht wiederholen möchten Aus implementierungsabhängigen Gründen (Platzbedarf oder Geschwindigkeit der Operationen auf Kosten von mehr Joins) fügen Sie dann eine Tabelle mit Namens-IDs und Zeichenfolgen hinzu und ersetzen Sie Ihre alten Namensspalten und -werte durch ID-Spalten und -Werte. (Das ist keine Normalisierung, das verkompliziert Ihr Schema zugunsten von implementierungsabhängigen Kompromissen bei der Datenoptimierung. Und Sie sollten es demonstrieren das wird benötigt und funktioniert.)