Suponiendo que estamos hablando de relaciones 1: 1 entre todas las tablas.
El almacenamiento general es prácticamente siempre (sustancialmente) más barato con una sola tabla en lugar de varias tablas en una relación 1: 1. Cada fila tiene 28 bytes de sobrecarga, más típicamente unos pocos bytes más para relleno adicional. Y debe almacenar la columna PK con cada tabla. Y tenga un índice separado (redundante) en cada una de estas columnas ... El tamaño sí importa para el rendimiento.
Esto es incluso cierto si muchas columnas son NULL en la mayoría de las filas porque el almacenamiento NULL es muy barato :
Al recuperar todas las columnas, una sola tabla es sustancialmente más rápida que 5 tablas unidas. También es mucho más simple . Puede ser difícil unir cinco tablas si no todas las filas están presentes en todas las tablas. Con WHERE
condiciones dirigidas a una sola tabla, es bastante fácil agregar otras tablas LEFT JOIN
. No es tan trivial si tiene predicados en varias tablas ...
La partición vertical aún puede mejorar el rendimiento de ciertas consultas. Por ejemplo, si el 90% de sus consultas recuperan las mismas 5 columnas de las 65 disponibles, esto sería más rápido con una tabla que solo contenga estas 5 columnas.
OTOH, es posible que pueda atender tales consultas en unas pocas columnas seleccionadas con un índice de "cobertura" que permita escaneos de solo índice .
Otro candidato para la partición vertical: si tiene muchas actualizaciones en solo unas pocas columnas, mientras que el resto casi nunca cambia. Podría ser considerablemente más barato dividir filas en tal caso, ya que Postgres escribe una nueva versión de fila para cada actualización. Hay excepciones para grandes valores almacenados fuera de línea ("TOASTed"). Más detalles:
Realmente depende de la situación completa. En caso de duda, opte por la solución simple de tener una sola mesa, especialmente si representa bien la realidad: en su ejemplo, esos son todos los atributos de un automóvil y tienen sentido juntos.
VehicleInterior
, otras consultas que tienen que ver con las columnas de únicaVehicleTechnical
, etc., o si hay muchas filas / vehículos que no tienen absolutamente ninguna información sobre (por ejemplo)VehicleExtra
por lo en lugar de muchas filas con muchos valores nulos en una tabla, tiene filas en el resto de las tablas y ninguna fila enVehicleExtra