¿Qué puedo hacer con el nuevo campo json?

8

PostgreSQL 9.2 introdujo el jsontipo de campo. ¿Por qué y cuándo debo usarlo? ¿Qué beneficios tiene sobre un campo de texto?

Pensé que había nuevas opciones de consulta disponibles, sin embargo, no he visto ninguna. ¿Me estoy perdiendo de algo?

Jonathan Egerton
fuente

Respuestas:

7

Postgres 9.2

El beneficio de la nueva característica es doble. Las columnas de tipojson verifican la validez de su contenido para que lo que está en la columna sea JSON válido automáticamente y reciba un error si intenta escribir algo más en él.
Y tiene funciones básicas para crear JSON válidos sobre la marcha desde filas o matrices, que es un caso de uso muy común.

Cito a Andrew Dunstan en la lista de hackers pgsql :

En algún momento, posiblemente habrá algunas funciones de procesamiento de json (en oposición a la producción de json), pero no en 9.2.

Utilicé esa cita antes en esta pregunta relacionada sobre SO .

Postgres 9.3

.. finalmente trae una serie de funciones y operadores. Consulte la página del manual para las funciones JSON .

Respuesta relacionada sobre SO:

@Publicará la publicación del blog. Ver comentario a continuación.

Postgres 9.4

Asegúrese de revisar el nuevo jsonbtipo con una gran cantidad de nuevas funcionalidades.

Sobre todo, el almacenamiento binario descompuesto permite un almacenamiento más pequeño en el disco y un operador de igualdad para jsonb(a diferencia json), lo que hace posible una serie de operaciones adicionales (como DISTINCTo un UNIQUEíndice).

Sin embargo, se han agregado más funciones para ambos jsony jsonb. json_to_record(), json_to_recordset()etc. Más en las notas de la versión.

Erwin Brandstetter
fuente
1
También puede usar pl / v8js para manipularlos, lo que le brinda algunas capacidades bastante impresionantes.
Chris Travers
1
Sí, pero si está utilizando una instancia de Postgres alojada (como Heroku), PLV8 probablemente no sea una opción (ciertamente no está en Heroku). En cuyo caso, por lo que puedo ver, el tipo de datos JSON tiene un valor bastante limitado en 9.2. Parece que 9.3 podría tener un buen soporte.
David S
1
Un vistazo a las actualizaciones que vienen en 9.3 michael.otacoo.com/postgresql-2/…
Será el
2

En pocas palabras, el tipo de datos JSON (y la extensión HSTORE y el tipo de datos más antiguos también) le permiten usar PostgreSQL como un almacén de datos "sin esquema" (o combinar datos relacionales y no relacionales "sin esquema"), en lugar de tener que recurrir a algunas de las otras opciones de NoSQL (como MongoDB). Incluso obtienes algunas cosas que no puedes hacer con MongoDB, como la indexación filtrada, la indexación de expresiones, etc. El único inconveniente es que PostgreSQL no admite la creación de fragmentos de fábrica como lo hace MongoDB ... sin embargo, yo Realmente me pregunto con qué frecuencia es realmente necesario fragmentar . Con una base de datos PostgreSQL 9.3 bien configurada, suficientes recursos de O / S y algunos índices de expresión filtrados razonablemente bien pensados, debería ser capaz de lograr fácilmente recuperaciones de filas sin esquema en el rango de 0.25 milisegundos.

HTH, Dave Sisk

Dave Sisk
fuente
1

Básicamente veo tres casos de uso aquí:

  1. pasar resultados complejos fácilmente a la aplicación
  2. pasar datos complejos a la base de datos desde la aplicación, y
  3. Almacene datos de forma relativamente libre para su posterior procesamiento.

El primero se puede hacer directamente desde PostgreSQL sin necesidad de complementos. Deberías poder hacer algo como:

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;

Esto se puede usar para crear matrices anidadas, etc. en su salida y evitar muchos problemas de análisis desordenados en el lado de la aplicación.

el segundo es pasar datos complejos a la base de datos para su procesamiento. Actualmente no hay funciones integradas para facilitar esto, pero con complementos como pl / v8js, puede programar su base de datos en Javascript y usar json como formato de intercambio. Esto puede permitir la creación de interfaces más ricas dentro de su base de datos. Tenga en cuenta que, dado que puede indexar salidas de funciones, puede usar esto para crear índices de aspectos de JSON que se almacenarán en su base de datos.

El tercero es un área que planeamos usar en LedgerSMB. La idea es que podríamos permitir que los integradores de sistemas almacenen información muy simple junto con las cuentas de los clientes. Esto podría empaquetarse en un campo JSON que se almacenaría. Esto no podría ser consultado directamente por las aplicaciones principales, pero si la gente quisiera agregar esto usando pl / v8js, esto podría hacerse para negocios individuales que usan el software.

Chris Travers
fuente