Angenommen, es handelt sich um 1: 1-Beziehungen zwischen allen Tabellen.
Insgesamt Lagerung ist praktisch immer ( im Wesentlichen) billiger mit einer einzigen Tabelle anstelle von mehreren Tabellen in 1: 1 - Beziehung. Jede Zeile hat einen Overhead von 28 Bytes sowie normalerweise ein paar Bytes mehr für zusätzliches Auffüllen. Und Sie müssen die PK-Spalte mit jeder Tabelle speichern. Und haben Sie einen separaten (redundanten) Index für jede dieser Spalten ... Größe ist wichtig für die Leistung.
Dies gilt sogar, wenn viele Spalten in den meisten Zeilen NULL sind, da NULL-Speicher sehr billig ist :
Beim Abrufen aller Spalten ist eine einzelne Tabelle wesentlich schneller als 5 miteinander verbundene Tabellen. Es ist auch viel einfacher . Das Verknüpfen von fünf Tabellen kann schwierig sein, wenn nicht alle Zeilen in allen Tabellen vorhanden sind. Unter WHERE
Bedingungen, die auf eine einzelne Tabelle abzielen, ist es einfach genug, andere Tabellen anzuhängen LEFT JOIN
. Nicht so trivial, wenn Sie Prädikate für mehrere Tabellen haben ...
Die vertikale Partitionierung kann die Leistung bestimmter Abfragen noch verbessern. Wenn beispielsweise 90% Ihrer Abfragen dieselben 5 von 65 verfügbaren Spalten abrufen, ist dies schneller, wenn eine Tabelle nur diese 5 Spalten enthält.
OTOH, Sie können möglicherweise solche Abfragen in einigen ausgewählten Spalten mit einem "abdeckenden" Index bearbeiten, der nur Index-Scans ermöglicht .
Ein weiterer Kandidat für die vertikale Partitionierung: Wenn Sie nur für wenige Spalten viele Aktualisierungen haben , während sich der Rest kaum ändert. In einem solchen Fall kann es erheblich billiger sein, Zeilen zu teilen, da Postgres für jedes Update eine neue Zeilenversion schreibt. Es gibt Ausnahmen für große Werte, die außerhalb der Zeile gespeichert werden ("TOASTed"). Mehr Details:
Es kommt wirklich auf die gesamte Situation an. Wenn Sie Zweifel haben, entscheiden Sie sich für die einfache Lösung, einen einzigen Tisch zu haben, insbesondere wenn er die Realität gut darstellt: In Ihrem Beispiel sind dies alles Attribute eines Autos und machen zusammen Sinn.
VehicleInterior
, andere Abfragen , die sich mit Spalten von nurVehicleTechnical
usw. Oder wenn es viele Reihen / Fahrzeuge , die absolut keine Informationen haben über (zum Beispiel) ,VehicleExtra
so Anstelle vieler Zeilen mit vielen Nullen in einer Tabelle haben Sie Zeilen in den restlichen Tabellen und keine Zeilen inVehicleExtra