PostgreSQL acaba de presentar JSONB y ya está en tendencia en las noticias de hackers . Sería genial si alguien pudiera explicar cómo es diferente de Hstore y JSON previamente presentes en PostgreSQL. ¿Cuáles son sus ventajas y limitaciones y cuándo alguien debería considerar usarlo?
json
postgresql
nosql
postgresql-json
jsonb
Peeyush
fuente
fuente
Respuestas:
Primero,
hstore
es un módulo contrib, que solo le permite almacenar pares clave => valor, donde las claves y los valores solo pueden sertext
s (sin embargo, los valores también pueden ser sqlNULL
s).Tanto
json
& lejsonb
permite almacenar un valor JSON válido (definido en su especificación ).F.ex. estos son representaciones JSON válidos:
null
,true
,[1,false,"string",{"foo":"bar"}]
,{"foo":"bar","baz":[null]}
-hstore
es sólo un poco en comparación con lo subconjunto JSON es capaz (pero si sólo necesita este subconjunto, está bien).La única diferencia entre
json
&jsonb
es su almacenamiento:json
se almacena en su formato de texto plano, mientrasjsonb
se almacena en alguna representación binariaHay 3 consecuencias principales de esto:
jsonb
generalmente toma más espacio en el disco para almacenar quejson
(a veces no)jsonb
toma más tiempo construir desde su representación de entrada quejson
json
las operaciones toman mucho más tiempo quejsonb
(y el análisis también debe hacerse cada vez que realiza alguna operación en unjson
valor escrito)Cuando
jsonb
esté disponible con una versión estable, habrá dos casos de uso principales, en los que puede seleccionar fácilmente entre ellos:json
.jsonb
.fuente
jsonb
no admite esto?UPDATE test SET data->'a' = 123 WHERE id = 1;
desdeCREATE TABLE test(id SERIAL PRIMARY KEY, data JSONB);
json
sobrejsonb
es si por razones de herencia su código consumiendo sujson
depende del orden de losjson
campos y no pueden ser reordenado.text
vsjson
.: este último viene con validación JSON, por lo que ante un JSON no válido, solo fallará al insertarlo, en lugar de cada vez que su aplicación lo lea (porque obtiene una representación no válida). Además, puede transmitir este último de forma segura ajsonb
la base de datos.Peeyush:
La respuesta corta es:
Para obtener una respuesta más larga, deberá esperar a que haga una redacción completa de "Cómo hacer" más cerca de la versión 9.4.
fuente
Una explicación simple de la diferencia entre json y jsonb ( imagen original de PostgresProfessional ):
Más en video de presentación y presentación de diapositivas por desarrolladores jsonb. También presentaron JsQuery , pg.extension proporciona un potente lenguaje de consulta jsonb
fuente
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); Debería admitir toda la especificación JSON. Como se almacena todo el texto JSON, se conserva su formato.jsonb
toma accesos directos por razones de rendimiento: los datos JSON se analizan en la entrada y se almacenan en formato binario, no se mantienen los ordenamientos de las teclas en los diccionarios y tampoco se duplican las claves. Acceder 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 una razón importante para no usar
jsonb
una vez que esté disponible, si está trabajando con datos legibles por máquina.fuente
JSONB es una versión "mejor" de JSON.
Veamos un ejemplo:
En general, uno debería preferir JSONB, a menos que haya necesidades especializadas, como suposiciones heredadas sobre el pedido de claves de objeto.
fuente
Estuve en el pgopen hoy, 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% en comparación con mongodb, que una excepción en este momento es una actualización que requiere reescribir por completo toda la columna json, algo que mongodb maneja mejor.
La indexación de gin en jsonb suena increíble.
También postgres persistirá internamente en tipos de jsonb y básicamente coincidirá con tipos como numérico, texto, booleano, etc.
Las uniones también serán posibles usando jsonb
Agregue PLv8 para los procedimientos almacenados y esto será básicamente un sueño hecho realidad para los desarrolladores de node.js.
Al estar 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 cuando se consulta contra una columna jsonb en contraste con una columna json, los postgres no tienen que ejecutar la funcionalidad para convertir el texto a json en cada fila, lo que probablemente ahorrará una gran cantidad de tiempo solo.
fuente
En cuanto a las diferencias
json
yjsonb
tipos de datos, vale la pena mencionar la explicación oficial:Fuente: https://www.postgresql.org/docs/current/datatype-json.html
fuente
Otra diferencia importante, que no se mencionó en ninguna respuesta anterior, es que no hay un operador de igualdad para el
json
tipo, pero sí hay uno parajsonb
.Esto significa que no puede usar la
DISTINCT
palabra clave al seleccionar estejson
tipo y / u otros campos de una tabla (puede usarloDISTINCT ON
en su lugar, pero no siempre es posible debido a casos como este ).fuente
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 de hstore permitirá anidar. Este parche no se incluirá en la versión 9.4 y es posible que no se incluya pronto.
json, tal como existe actualmente , permite el anidamiento, pero está basado en texto y no permite la indexación, por lo tanto, 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 tipo jsonb rápido atraerá a las personas que habrían 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 pueden 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ápido que MongoDB
http://texture.io/alphabetum/postgresql-incl-hstore-vs-mongodb
fuente