No Postgres 12, estou rastreando fotografias. Cada um é grande, cerca de 6 a 8 megas cada. Para uma navegação rápida, armazenarei uma imagem em miniatura junto com a imagem completa. Tanto o full quanto o thumbnail são colunas do tipo BYTEA.
Para desempenho, quero evitar carregar a imagem completa quando apenas a miniatura é necessária. Pelo que entendi, ao acessar uma linha, todos os valores do campo BYTEA serão carregados na memória. Portanto, exibir uma lista de miniaturas para o usuário necessariamente estará carregando as fotos completas no servidor mesmo quando não solicitadas explicitamente na consulta.
Então, vou dividir essa tabela de fotos em duas, armazenando a miniatura na tabela principal e armazenando a miniatura em uma tabela filho separada, em um Um-para-Um.
Nesse cenário, a tabela de fotos completas filha carrega o ID de sua linha de miniatura pai como uma chave estrangeira. Essa coluna de chave estrangeira também pode servir logicamente como chave primária.
Posso designar essa coluna de um filho para ser uma chave estrangeira e também uma chave primária? Em caso afirmativo, há alguma ressalva a ser observada?
Chave primária e chave estrangeira
Sim absolutamente:
BRINDE
bytea
as colunas são armazenadas fora dos dados normais da coluna (nas chamadas "tabelas de brinde" ) e não são recuperadas a menos que você as inclua na lista SELECT.Citação do manual
Isso significa apenas que mesmo que uma consulta seja forçada a fazer um Seq Scan, as colunas bytea não são recuperadas até que sejam identificadas as linhas que precisam ser enviadas de volta. Portanto, se sua consulta fizer uma varredura seq em 1 milhão de linhas, mas apenas 1 linha for retornada, apenas um valor de bytea será lido e enviado ao cliente.
Observe que as miniaturas podem realmente ser armazenadas em linha (não na tabela de torradas) se forem pequenas o suficiente (o TOASTing é acionado apenas para tamanhos abaixo de aproximadamente 2k)
As colunas são torradas individualmente, portanto, não há problema em manter as duas imagens em uma única tabela. Apenas a imagem que aparece na
SELECT
lista será tostada.Além disso, se an
UPDATE
não afetar as colunas torradas, elas não precisarão ser reescritas.