PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

L'array PostgreSQL può essere ottimizzato per l'unione?

No, la memorizzazione di FK in un array non è mai una buona idea per le tabelle di uso generale. Innanzitutto, c'è il fatto che hai menzionato di sfuggita:i vincoli di chiave esterna per gli elementi dell'array non sono (ancora) implementati. Questo da solo dovrebbe annullare l'idea.

C'è stato un tentativo di implementare la funzionalità per Postgres 9.3 che è stato interrotto da seri problemi di prestazioni. Vedi questo thread su pgsql-hacker.

Inoltre, mentre le prestazioni di lettura possono essere migliorate con gli array per determinati casi d'uso, le prestazioni di scrittura precipitano. Pensaci:per inserire, aggiornare o eliminare un singolo elemento da un lungo array, ora devi scrivere una nuova versione di riga con l'intero array per ogni elemento canged. E vedo anche una seria contesa di blocco in vista.

Se la tua tabella è sola lettura , l'idea inizia ad avere più senso. Ma poi prenderei in considerazione una vista materializzata con array denormalizzati sopra di un'implementazione molti-a-molti normalizzata:

Mentre è presente, MV può includere tutte le tabelle di join e produrre una tabella piatta per prestazioni di lettura ancora migliori (per casi d'uso tipici). In questo modo ottieni l'integrità referenziale e buone prestazioni di lettura (e scrittura), a scapito dell'overhead e dello spazio di archiviazione aggiuntivo per la gestione della MV.