Sim, estou ciente de que a normalização de dados deve ser minha prioridade (como é).
- Eu tenho uma tabela com 65 colunas de armazenamento de dados do veículo com colunas:
used_vehicle
,color
,doors
,mileage
,price
e assim por diante, no total de 65. - Agora, eu posso dividir isso e ter uma
Vehicle
mesa,VehicleInterior
,VehicleExterior
,VehicleTechnical
,VehicleExtra
(todo o um-para-um com principalVehicle
tabela).
Vamos supor que eu tenha cerca de 5 milhões de linhas (veículos).
Com SELECT
uma WHERE
cláusula: o desempenho será melhor pesquisado (ambos os casos indexados pelo menos em IDs
):
Vehicle
mesa com 65 colunas ouVehicle
tabela comJOINS
em outras quatro tabelas (todas com 5 milhões de linhas) para retornar todos os dados relacionados aVehicle
?
(Conforme o mecanismo do banco de dados, considere o PostgreSQL e / ou MySQL).
Realmente aprecia alguma ideia detalhada que possa ter da sua experiência anterior?
postgresql
database-design
performance
partitioning
postgresql-performance
Urim Kurtishi
fonte
fonte
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
Respostas:
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 tabelasLEFT 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.
fonte
Uma seleção em uma única tabela deve sempre ser mais rápida. Assim que você encontrar seu veículo, você já terá todos os detalhes.
No entanto, você perde a eficiência da normalização. Por exemplo, se 1 carro tivesse muitos modelos com opções diferentes.
Esta é uma referência db de todos os carros? Ou uma lista de veículos em segunda mão? Haveria muitos exemplos da mesma marca / modelo com as mesmas opções?
Edit: eu deveria qualificar minha resposta como sendo rdbms genéricos em vez de específico para o postgres Adardo a resposta detalhada de @ Erwin específica para o postgres
fonte