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

Gli indici JSON di Postgres sono abbastanza efficienti rispetto alle classiche tabelle normalizzate?

Avrò bisogno di alcune query nel modulo "elenca tutti gli oggetti in cui uno dei nomi alternativi è 'foobar'." La dimensione prevista della tabella è dell'ordine di alcuni milioni di record. Le query JSON di Postgres possono essere utilizzate per questo e possono anche essere indicizzate (ad esempio, Index For Finding Element in JSON array). Tuttavia, DOVREBBE essere fatto in questo modo o è una soluzione perversa che non è consigliata?

può essere fatto in questo modo, ma ciò non significa che dovresti. In un certo senso, la migliore pratica è già ben documentata (vedi ad esempio l'utilizzo di hstore rispetto all'utilizzo di XML rispetto all'utilizzo di EAV rispetto all'utilizzo di una tabella separata) con un nuovo tipo di dati che, a tutti gli effetti e scopi pratici (oltre alla convalida e alla sintassi), non è diverso da precedenti opzioni non strutturate o semistrutturate.

In altre parole, è lo stesso vecchio maiale con il nuovo trucco.

JSON offre la possibilità di utilizzare indici ad albero di ricerca invertiti , allo stesso modo di hstore, tipi di array e tsvectors. Funzionano bene, ma tieni presente che sono progettati principalmente per estrarre punti in un quartiere (pensa ai tipi di geometria) ordinati per distanza, piuttosto che per estrarre un elenco di valori in ordine lessicografico.

Per illustrare, prendi i due piani che la risposta di Roman delinea:

  • Quello che esegue una scansione dell'indice scorre direttamente le pagine del disco, recuperando le righe nell'ordine indicato dall'indice.
  • Quello che esegue una scansione dell'indice bitmap inizia identificando ogni pagina del disco che potrebbe contenere una riga e le legge come appaiono sul disco, come se stesse (e in effetti, proprio come) eseguendo una scansione in sequenza che salta le aree inutili.

Tornando alla tua domanda:indici ad albero invertiti disordinati e sovradimensionati migliorerà davvero le prestazioni della tua app se usi le tabelle Postgres come giganteschi negozi JSON. Ma non sono nemmeno un proiettile d'argento e non ti porteranno fino a un corretto design relazionale quando si tratta di colli di bottiglia.

La conclusione, alla fine, non è diversa da quella che otterresti quando decidi di utilizzare hstore o un EAV:

  1. Se ha bisogno di un indice (cioè appare frequentemente in una clausola where o, ancora più importante, in una clausola join), probabilmente vorrai che i dati siano in un campo separato.
  2. Se è principalmente cosmetico, JSON/hstore/EAV/XML/whatever-makes-you-sleep-at-night funziona bene.