Cosa posso fare con il nuovo campo JSON?


8

PostgreSQL 9.2 ha introdotto il jsontipo di campo. Perché e quando dovrei usarlo? Quali sono i vantaggi di un campo di testo?

Ho pensato che fossero disponibili nuove opzioni di query, tuttavia non ne ho viste. Mi sto perdendo qualcosa?

Risposte:


7

Postgres 9.2

Il vantaggio della nuova funzionalità è duplice. Le colonne di tipojson verificano la validità del suo contenuto in modo che ciò che è nella colonna sia automaticamente JSON valido e si ottenga un errore se si tenta di scrivere qualcos'altro su di esso.
E hai funzioni di base per creare al volo JSON valido da righe o array, che è un caso d'uso molto comune.

Cito Andrew Dunstan nella lista degli hacker di pgsql :

Ad un certo punto ci saranno probabilmente alcune funzioni di elaborazione json (anziché di produzione json), ma non in 9.2.

Ho usato quella citazione prima sotto questa domanda correlata su SO .

Postgres 9.3

.. finalmente porta un numero di funzioni e operatori. Consulta la pagina di manuale per le funzioni JSON .

Risposta correlata su SO:

@Metterò post sul blog. Vedi il commento qui sotto.

Postgres 9.4

Assicurati di provare il nuovo jsonbtipo con una serie di nuove funzionalità.

Soprattutto, l'archiviazione binaria decomposta consente una minore archiviazione su disco e un operatore di uguaglianza per jsonb(a differenza json), il che rende possibile una serie di operazioni aggiuntive (come DISTINCTo un UNIQUEindice).

Altre funzioni sono state aggiunte per entrambi jsone jsonb. json_to_record(), json_to_recordset()ecc. Altro nelle note di rilascio.


1
Inoltre puoi usare pl / v8js per manipolarli, il che ti offre alcune funzionalità davvero fantastiche.
Chris Travers,

1
Sì, ma se stai usando un'istanza Postgres ospitata (come Heroku), PLV8 probabilmente non è un'opzione (certamente non è su Heroku). Nel qual caso, da quello che posso vedere, il tipo di dati JSON ha un valore piuttosto limitato in 9.2. Sembra che 9.3 possa avere un buon supporto.
David S

1
Uno sguardo agli aggiornamenti in arrivo 9.3 michael.otacoo.com/postgresql-2/…
Will

2

In breve, il tipo di dati JSON (e anche l'estensione e il tipo di dati HSTORE precedenti) consentono di utilizzare PostgreSQL come archivio dati "senza schema" (o combinare dati "senza schema" relazionali e non relazionali), anziché dover ricorrere ad alcune delle altre opzioni NoSQL (come MongoDB). Ottieni anche alcune cose che non puoi fare con MongoDB, come l'indicizzazione filtrata, l'indicizzazione delle espressioni, ecc. L'unico inconveniente è che PostgreSQL non supporta lo sharing out-of-the-box come MongoDB ... metto davvero in discussione la frequenza con cui lo sharding è veramente necessario. Con un database PostgreSQL 9.3 ben configurato, risorse O / S sufficienti e alcuni indici di espressione filtrati ragionevolmente ben congegnati, dovresti essere in grado di ottenere facilmente il recupero delle righe senza schema nell'intervallo di 0,25 millisecondi.

HTH, Dave Sisk


1

Fondamentalmente vedo tre casi d'uso qui:

  1. passare facilmente risultati complessi all'applicazione
  2. passare dati complessi nel db dall'applicazione e
  3. Archivia i dati relativamente in formato libero per successive elaborazioni.

Il primo può essere fatto direttamente da PostgreSQL senza bisogno di componenti aggiuntivi. Dovresti essere in grado di fare qualcosa del tipo:

SELECT row_to_json(mt.id, mt.testval, array_agg(mt2))
  FROM my_table mt
  JOIN my_table2 mt2 ON mt.id = mt2.mt_id
 WHERE mt.id = 123;

Questo può quindi essere usato per creare array nidificati ecc. Nell'output ed evitare molti problemi di analisi disordinati sul lato app.

il secondo sta trasferendo dati complessi nel db per l'elaborazione. Attualmente non ci sono funzioni integrate per facilitare questo, ma con componenti aggiuntivi come pl / v8js, è possibile programmare il database in Javascript e utilizzare json come formato di scambio. Ciò può consentire la creazione di interfacce più ricche all'interno del database. Si noti che poiché è possibile indicizzare gli output delle funzioni, è possibile utilizzarlo per creare indici di aspetti di JSON da archiviare nel proprio db.

La terza è un'area che intendiamo utilizzare in LedgerSMB. L'idea è che potremmo voler consentire agli integratori di sistemi di memorizzare informazioni molto semplici insieme agli account dei clienti. Questo potrebbe quindi essere impacchettato in un campo JSON che verrebbe archiviato. Questo non sarebbe in grado di essere interrogato direttamente dalle app principali, ma se la gente volesse aggiungerlo usando pl / v8js questo potrebbe essere fatto per le singole aziende che usano il software.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.