PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Existem opções para uma tabela de junção para associações muitos-para-muitos?


  • Se os modelos não compartilharem grupos de cores, o design seria uma tabela:
    model [model] comes in color [color]
    

  • Se os modelos compartilharem grupos de cores, terão duas tabelas:
    model [model] comes in the colors of group [group]
    group [group] has color [color]
    

    Essas tabelas se unem com projeção à primeira tabela:
    SELECT model, color FROM model_group NATURAL JOIN group_color
    

  • Se um modelo puder ter cores excepcionais disponíveis e/ou indisponíveis além ou em vez de um grupo, então tenha tabelas de exceção. O grupo de uma tabela agora é seu padrão cores (se houver):
    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]
    

    As tabelas de exceção são então respectivamente UNIONed com e MINUSed/EXCEPTed de um JOIN-plus-PROJECT/SELECT para fornecer a primeira tabela:
    SELECT group, color FROM model_default NATURAL JOIN group_colour
    EXCEPT SELECT * FROM model_unavailable
    UNION SELECT * FROM model_available
    

"Redundância" não é sobre valores que aparecem em vários lugares. Trata-se de várias linhas informando a mesma coisa sobre o aplicativo.

Cada tabela (e expressão de consulta) tem um modelo de instrução de preenchimento de espaços em branco associado (também conhecido como predicado). As linhas que fazem uma declaração verdadeira vão para a tabela. Se você tiver dois predicados independentes, precisará de duas tabelas. Os valores relevantes vão nas linhas de cada um.

Re linhas fazendo declarações sobre o aplicativo veja isso. (E pesquise minhas outras respostas sobre a "instrução" ou "critério" de uma tabela.) A normalização ajuda porque substitui tabelas cujas linhas declaram coisas da forma "... AND ..." por outras tabelas que declaram "... " separadamente. Veja isso e isso.

Se você compartilhar grupos e usar apenas uma única tabela de duas colunas para modelo e cor, seu predicado será:
FOR SOME group
    model [model] comes in the colors of group [group]
AND group [group] has color [color]

Assim, o segundo marcador remove um único "AND" deste predicado, ou seja, a fonte de uma "dependência multivalorada". Caso contrário, se você alterar o grupo de um modelo ou as cores de um grupo, precisará alterar simultaneamente várias linhas de forma consistente. (O objetivo é reduzir os erros e a complexidade da redundância, não economizar espaço.)

Se você não quiser repetir as strings por motivos de implementação (dependentes) (espaço ocupado ou velocidade das operações às custas de mais junções), adicione uma tabela de IDs e strings de nome e substitua suas colunas e valores de nome antigo por colunas e valores de ID. (Isso não é normalização, isso está complicando seu esquema por causa das compensações de otimização de dados dependentes da implementação. E você deve demonstrar isso é necessário e funciona.)