De acordo com o assunto, tenho um campo que é varchar no qual armazeno alguns números separados por vírgulas. A lista cresce e diminui com base nas escolhas dos clientes. Em seguida, uso-o em consultas para verificar se um determinado valor está nessa lista em relação a
value || ','
Está funcionando bem, mas estava pensando em convertê-lo em uma matriz inteira.
Esta seria uma solução melhor tanto do ponto de vista técnico/desempenho quanto para programar corretamente o banco de dados?
É altamente provável que a melhor abordagem seja uma tabela lateral de
sometable(main_id, value)
onde você tem um índice composto em(main_id, value)
. Isso permite pesquisas muito rápidas para ver "para este mainid, esse valor existe". Isso permitirá que você imponha relacionamentos de chave estrangeira. A menos que você tenha um bom motivo, use essa abordagem relacional convencional.Caso contrário, você pode e deve usar um campo de matriz em vez de uma lista separada por vírgulas. Usar uma lista separada por vírgulas é simplesmente horrível do ponto de vista do design. Isso torna as consultas mais difíceis de escrever, mais propensas a erros e força você a fazer muitas manipulações de strings e análises de números lentas e ineficientes apenas para operações simples e evita qualquer tipo de verificação de integridade sem
CHECK
restrições ou gatilhos muito ineficientes. Acho que Bill acertou em cheio com:Com uma matriz, você pode usar a
intarray
extensão para fornecer um índice GiST que permite testar rapidamente se a matriz contém um determinado valor@>
usando uma operação ou indexável<@
. Você pode querer adicionar abtree_gist
extensão também, para que você possa criar um índice GiST composto demain_id, the_values_array
, caso suas consultas sejam geralmente da forma:(ou tenha dois índices separados e veja se ele fará uma varredura de índice de bitmap).
Você ainda não pode impor um relacionamento de chave estrangeira em uma matriz no PostgreSQL, embora o recurso pareça estar a caminho. Você precisaria fazer isso com gatilhos um tanto complicados nesse meio tempo. Ainda assim, é muito melhor do que uma lista separada por vírgulas.