Supponendo che stiamo parlando di relazioni 1: 1 tra tutte le tabelle.
Lo spazio di archiviazione complessivo è praticamente sempre (sostanzialmente) più economico con una singola tabella anziché con più tabelle nella relazione 1: 1. Ogni riga ha 28 byte di sovraccarico, più tipicamente qualche byte in più per il riempimento extra. E devi archiviare la colonna PK con ogni tabella. E avere un indice (ridondante) separato su ciascuna di queste colonne ... Le dimensioni contano per le prestazioni.
Questo è vero anche se molte colonne sono NULL nella maggior parte delle righe perché l' archiviazione NULL è molto economica :
Durante il recupero di tutte le colonne una singola tabella è sostanzialmente più veloce di 5 tabelle unite. È anche molto più semplice . Cinque tabelle possono essere difficili da unire se non tutte le righe sono presenti in tutte le tabelle. Con le WHERE
condizioni destinate a una singola tabella, è abbastanza facile aggiungere altre tabelle con LEFT JOIN
. Non banale se hai predicati su più tabelle ...
Il partizionamento verticale può comunque migliorare le prestazioni di determinate query. Ad esempio, se il 90% delle tue query recupera le stesse 5 colonne delle 65 disponibili, ciò sarebbe più veloce se una tabella contenesse solo queste 5 colonne.
OTOH, potresti essere in grado di soddisfare tali query su alcune colonne selezionate con un indice "di copertura" che consente scansioni solo indice .
Un altro candidato per il partizionamento verticale: se hai molti aggiornamenti su poche colonne, mentre il resto non cambia quasi mai. In tal caso potrebbe essere molto più economico dividere le righe, poiché Postgres scrive una nuova versione di riga per ogni aggiornamento. Esistono eccezioni per i grandi valori memorizzati fuori linea ("TOASTed"). Più dettagli:
Dipende davvero dalla situazione completa. In caso di dubbio, scegli la semplice soluzione di avere un solo tavolo, soprattutto se ritrae bene la realtà: nel tuo esempio, quelli sono tutti attributi di un'auto e hanno un senso insieme.
VehicleInterior
, altre query che trattano solo le colonneVehicleTechnical
, ecc. O se ci sono molte file / veicoli che non hanno assolutamente informazioni su (ad esempio)VehicleExtra
quindi invece di molte righe con molti null in una tabella, hai righe nel resto delle tabelle e nessuna riga inVehicleExtra