Supondo que estamos falando de relacionamentos 1: 1 entre todas as tabelas.
O armazenamento geral é praticamente sempre (substancialmente) mais barato com uma única tabela em vez de várias tabelas no relacionamento 1: 1. Cada linha possui 28 bytes de sobrecarga, além de, normalmente, mais alguns bytes para preenchimento extra. E você precisa armazenar a coluna PK com todas as tabelas. E tenha um índice (redundante) separado em cada uma dessas colunas ... O tamanho importa para o desempenho.
Isso é verdade mesmo se muitas colunas forem NULL na maioria das linhas, porque o armazenamento NULL é muito barato :
Ao recuperar todas as colunas, uma única tabela é substancialmente mais rápida que 5 tabelas juntas. Também é muito mais simples . Pode ser difícil associar cinco tabelas se nem todas as linhas estiverem presentes em todas as tabelas. Com as WHERE
condições direcionadas a uma única tabela, é fácil anexar outras tabelas LEFT JOIN
. Não é tão trivial se você tiver predicados em várias tabelas ...
O particionamento vertical ainda pode melhorar o desempenho de determinadas consultas. Por exemplo, se 90% de suas consultas recuperarem as mesmas 5 colunas das 65 disponíveis, isso seria mais rápido com uma tabela mantendo essas 5 colunas.
OTOH, você pode atender a essas consultas em algumas colunas selecionadas com um índice de "cobertura" que permite verificações apenas de índice .
Outro candidato ao particionamento vertical: se você tiver muitas atualizações em apenas algumas colunas, enquanto o resto quase nunca muda. Pode ser consideravelmente mais barato dividir linhas nesse caso, pois o Postgres grava uma nova versão de linha para cada atualização. Há exceções para grandes valores armazenados fora da linha ("TOASTed"). Mais detalhes:
Realmente depende da situação completa. Em caso de dúvida, siga a solução simples de ter uma única tabela, especialmente se ela retrata bem a realidade: no seu exemplo, todos esses são atributos de um carro e fazem sentido juntos.
VehicleInterior
, outras consultas que lidam com colunas de únicaVehicleTechnical
, etc., ou se há muitas linhas / veículos que não têm absolutamente nenhuma informação sobre (por exemplo)VehicleExtra
de modo em vez de muitas linhas com lotes de valores nulos em uma tabela de, você tem linhas no resto das tabelas e nenhuma linha emVehicleExtra