PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Existe-t-il des options pour une table de jointure pour les associations plusieurs-à-plusieurs ?

  • Si les modèles ne partagent pas de groupes de couleurs, la conception serait alors une seule table :

    model [model] comes in color [color]
    
  • Si les modèles partagent des groupes de couleurs, alors ayez deux tableaux :

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

    Ces tables se rejoignent avec projection sur la première table :

    SELECT model, color FROM model_group NATURAL JOIN group_color
    
  • Si un modèle peut avoir des couleurs exceptionnelles disponibles et/ou indisponibles en plus ou à la place d'un groupe, alors ayez des tables d'exception. Le groupe d'une table est maintenant son par défaut couleurs (le cas échéant) :

    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]
    

    Les tables d'exceptions sont alors respectivement UNIONed avec et MINUSed/EXCEPTed à partir d'un JOIN-plus-PROJECT/SELECT pour donner la première table :

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

La "redondance" ne concerne pas les valeurs apparaissant à plusieurs endroits. Il s'agit de plusieurs lignes indiquant la même chose à propos de l'application.

Chaque table (et expression de requête) est associée à un modèle d'instruction fill-in-the-(named-)blanks (alias prédicat). Les lignes qui font une déclaration vraie vont dans le tableau. Si vous avez deux prédicats indépendants, vous avez besoin de deux tables. Les valeurs pertinentes vont dans les lignes de chacun.

Re lignes faisant des déclarations sur l'application voir ceci. (Et recherchez mes autres réponses concernant la "déclaration" ou le "critère" d'un tableau.) La normalisation aide car elle remplace les tableaux dont les lignes énoncent des éléments de la forme "... ET ..." par d'autres tableaux qui énoncent le "... " séparément. Voir ceci et cela.

Si vous partagez des groupes et n'utilisez qu'un seul tableau à deux colonnes pour le modèle et la couleur, son prédicat est :

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

Ainsi, la deuxième puce supprime un seul "ET" de ce prédicat, c'est-à-dire la source d'une "dépendance multivaluée". Sinon, si vous modifiez le groupe d'un modèle ou les couleurs d'un groupe, vous devez modifier simultanément plusieurs lignes de manière cohérente. (Le but est de réduire les erreurs et la complexité de la redondance, pas d'économiser de l'espace.)

Si vous ne voulez pas répéter les chaînes pour des raisons d'implémentation (dépendantes) (espace pris ou vitesse des opérations au détriment de plus de jointures), ajoutez ensuite une table d'identifiants et de chaînes de noms et remplacez vos anciennes colonnes et valeurs de noms par des colonnes et des valeurs d'identifiants. (Ce n'est pas de la normalisation, cela complique votre schéma pour des raisons de compromis d'optimisation des données dépendant de la mise en œuvre. Et vous devriez démontrer ceci est nécessaire et fonctionne.)