ejemplo - postgresql json example
Explicación de JSONB introducida por PostgreSQL (8)
PostgreSQL acaba de presentar JSONB y ya tiene tendencia a las noticias sobre hackers . Sería genial si alguien pudiera explicar en qué se diferencian de Hstore y JSON que anteriormente estaban en PostgreSQL. ¿Cuáles son sus ventajas y limitaciones y cuándo debería alguien considerar su uso?
Hoy estuve en pgopen los puntos de referencia son mucho más rápidos que mongodb, creo que fue alrededor de un 500% más rápido para los seleccionados. Casi todo fue más rápido al menos en un 200% cuando se contrasta con mongodb, de lo que una excepción en este momento es una actualización que requiere reescribir completamente la columna json completa, algo que mongodb maneja mejor.
La ginebra de indexación en jsonb suena increíble.
Además, postgres conservará los tipos de jsonb internamente y, básicamente, los combinará con tipos como numérico, texto, booleano, etc.
Las combinaciones también serán posibles usando jsonb.
Agregue PLv8 para procedimientos almacenados y esto básicamente será un sueño hecho realidad para los desarrolladores de node.js.
Siendo almacenado como binario, jsonb también eliminará todos los espacios en blanco, cambiará el orden de las propiedades y eliminará las propiedades duplicadas utilizando la última aparición de la propiedad.
Además del índice al consultar con una columna jsonb contrastada con una columna json, postgres no tiene que ejecutar la funcionalidad para convertir el texto a json en cada fila, lo que probablemente ahorrará una gran cantidad de tiempo solo.
Otra diferencia importante, que no se mencionó en ninguna de las respuestas anteriores, es que no hay un operador de igualdad para el tipo json
, pero hay uno para jsonb
.
Esto significa que no puede usar la palabra clave DISTINCT
cuando selecciona este tipo de json
y / u otros campos de una tabla (en su lugar, puede usar DISTINCT ON
, pero no siempre es posible debido a casos como this ).
Peeyush
La respuesta corta es:
- Si está realizando una gran cantidad de manipulación JSON dentro de PostgreSQL, como la clasificación, el corte, el empalme, etc., debe usar JSONB por razones de velocidad.
- Si necesita búsquedas indexadas para búsquedas de claves arbitrarias en JSON, entonces debe usar JSONB.
- Si no está haciendo nada de lo anterior, probablemente debería usar JSON.
- Si necesita conservar el orden de las claves, los espacios en blanco y las claves duplicadas, debe usar JSON.
Para una respuesta más larga, tendrás que esperar a que haga un resumen completo de "Cómo" más cerca de la versión 9.4.
Por lo que yo puedo decir,
hstore como existe actualmente (en Postgresql 9.3) no permite anidar otros objetos y matrices como los valores de sus pares clave / valor. sin embargo, un futuro parche hstore permitirá el anidamiento. este parche no estará en la versión 9.4 y es posible que no se incluya pronto.
json como existe actualmente permite el anidamiento, pero está basado en texto y no permite la indexación, por lo que es "lento"
jsonb que se lanzará con 9.4 tendrá las capacidades de anidamiento actuales de json, así como la indexación GIN / GIST de hstore, por lo que será rápido
Las personas que trabajan en postgresql 9.4 parecen estar diciendo que el nuevo y rápido tipo jsonb atraerá a las personas que hubieran optado por usar un almacén de datos noSQL como MongoDB, pero ahora pueden combinar una base de datos relacional con datos no estructurados que se puedan consultar bajo un mismo techo
http://www.databasesoup.com/2014/02/why-hstore2jsonb-is-most-important.html
Los puntos de referencia de postgresql 9.4 jsonb parecen estar a la par o, en algunos casos, más rápidos que MongoDB
http://texture.io/alphabetum/postgresql-incl-hstore-vs-mongodb
Una explicación simple de la diferencia entre json y jsonb ( imagen original de PostgresProfessional ):
SELECT ''{"c":0, "a":2,"a":1}''::json, ''{"c":0, "a":2,"a":1}''::jsonb;
json | jsonb
------------------------+---------------------
{"c":0, "a":2,"a":1} | {"a": 1, "c": 0}
(1 row)
- json: almacenamiento textual «como es»
- jsonb: sin espacios en blanco
- jsonb: no hay claves duplicadas, última clave ganada
- jsonb: las teclas están ordenadas
Más en vídeo de discurso y presentación de diapositivas por los desarrolladores de jsonb. También introdujeron JsQuery , pg . Extensión proporciona un lenguaje de consulta jsonb potente
jsonb es la versión "mejor" de JSON. Veamos con ayuda de un ejemplo.
- JSON permite espacios en blanco, es por eso que podemos ver espacios cuando se almacena la tecla "a", mientras que JSONB no.
- JSON almacena todos los valores de clave. Esta es la razón por la que puede ver varios valores (2 y 1) en la clave "a", mientras que JSONB solo "almacena" el último valor.
- JSON mantiene el orden en que se insertan los elementos, mientras que JSONB mantiene el orden "ordenado".
- Los objetos JSONB se almacenan como binarios descomprimidos en lugar de los "datos sin procesar" en JSON, donde no se requiere volver a analizar los datos durante la recuperación.
- jsonb también admite la indexación, lo que puede ser una ventaja significativa.
En general, se debe preferir JSONB, a menos que haya necesidades bastante especializadas, como suposiciones heredadas sobre el orden de las claves de objetos.
Primero, hstore
es un módulo contrib, que solo le permite almacenar pares key => value, donde las claves y los valores solo pueden ser text
s (sin embargo, los valores pueden ser sql NULL
s).
Tanto json
jsonb
permiten almacenar un valor JSON válido (definido en su especificación ).
F.ex. estas son representaciones JSON válidas: null
, true
, [1,false,"string",{"foo":"bar"}]
, {"foo":"bar","baz":[null]}
- hstore
is solo un pequeño subconjunto en comparación con lo que JSON es capaz (pero si solo necesita este subconjunto, está bien).
La única diferencia entre json
y jsonb
es su almacenamiento:
-
json
se almacena en su formato de texto plano, mientras que -
jsonb
se almacena en alguna representación binaria
Hay 3 consecuencias principales de esto:
-
jsonb
usualmente toma más espacio en el disco para almacenar quejson
(a veces no) -
jsonb
toma más tiempo para construir desde su representación de entrada quejson
-
json
operacionesjson
toman mucho más tiempo quejsonb
(y el análisis también debe realizarse cada vez que realice alguna operación a un valorjson
)
Cuando jsonb
estará disponible con una versión estable, habrá dos casos de uso principales, cuando puede seleccionar fácilmente entre ellos:
- Si solo trabaja con la representación JSON en su aplicación, PostgreSQL solo se usa para almacenar y recuperar esta representación, debe usar
json
. - Si realiza muchas operaciones en el valor JSON en PostgreSQL, o usa la indexación en algún campo JSON, debe usar
jsonb
.
-
hstore
es más un tipo de almacenamiento de "columna ancha", es un diccionario plano (no anidado) de pares clave-valor, siempre almacenado en un formato binario razonablemente eficiente (una tabla hash, de ahí el nombre). -
json
almacena documentos JSON como texto, realiza la validación cuando se almacenan los documentos y los analiza en la salida si es necesario (es decir, accede a campos individuales); debe soportar toda la especificación JSON. Dado que se almacena todo el texto JSON, se conserva su formato. -
jsonb
toma atajos por razones de rendimiento: los datos JSON se analizan en la entrada y se almacenan en formato binario, los ordenamientos de las teclas en los diccionarios no se mantienen, y tampoco las teclas duplicadas. El acceso a elementos individuales en el campo JSONB es rápido ya que no requiere analizar el texto JSON todo el tiempo. En la salida, los datos JSON se reconstruyen y se pierde el formato inicial.
En mi opinión, no hay ninguna razón importante para no usar jsonb
una vez que esté disponible, si está trabajando con datos legibles por máquina.