PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Ci sono opzioni per una tabella di join per le associazioni molti-a-molti?

  • Se i modelli non condividono i gruppi di colori, il design sarebbe una tabella:

    model [model] comes in color [color]
    
  • Se i modelli condividono i gruppi di colori, hanno due tabelle:

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

    Queste tabelle si uniscono con proiezione alla prima tabella:

    SELECT model, color FROM model_group NATURAL JOIN group_color
    
  • Se un modello può avere colori disponibili e/o non disponibili eccezionali in aggiunta o al posto di un gruppo, disporre delle tabelle delle eccezioni. Il gruppo di una tabella è ora il suo predefinito colori (se presenti):

    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]
    

    Le tabelle delle eccezioni sono quindi rispettivamente UNIONed with e MINUSed/EXCEPTed da un JOIN-plus-PROJECT/SELECT per dare la prima tabella:

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

"Ridondanza" non riguarda i valori che appaiono in più posizioni. Si tratta di più righe che affermano la stessa cosa sull'applicazione.

Ogni tabella (e espressione di query) ha un modello di istruzione fill-in-the-(named-)blanks associato (aka predicato). Le righe che fanno una dichiarazione vera vanno nella tabella. Se hai due predicati indipendenti, hai bisogno di due tabelle. I valori rilevanti vanno nelle righe di ciascuno.

Righe che fanno dichiarazioni sull'applicazione vedere questo. (E cerca le mie altre risposte in merito a una "dichiarazione" o "criterio" di una tabella.) La normalizzazione aiuta perché sostituisce le tabelle le cui righe indicano cose del formato "... AND ..." con altre tabelle che affermano il "... "separatamente. Guarda questo e questo.

Se condividi gruppi e utilizzi solo una singola tabella a due colonne per il modello e il colore, il suo predicato è:

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

Quindi il secondo punto rimuove un singolo "AND" da questo predicato, cioè la fonte di una "dipendenza multivalore". In caso contrario, se si modifica il gruppo di un modello oi colori di un gruppo, è necessario modificare in modo coerente più righe contemporaneamente. (Il punto è ridurre gli errori e la complessità dovuti alla ridondanza, non risparmiare spazio.)

Se non vuoi ripetere le stringhe per motivi di implementazione (dipendenti) (spazio occupato o velocità delle operazioni a scapito di più join), quindi aggiungi una tabella di ID e stringhe dei nomi e sostituisci le colonne e i valori dei vecchi nomi con colonne e valori id. (Questa non è normalizzazione, sta complicando il tuo schema per il bene dei compromessi di ottimizzazione dei dati dipendenti dall'implementazione. E dovresti dimostrare questo è necessario e funziona.)