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,
hstorees un módulo contrib, que solo le permite almacenar pares clave => valor, donde las claves y los valores solo pueden sertexts (sin embargo, los valores también pueden ser sqlNULLs).Tanto
json& lejsonbpermite 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]}-hstorees 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&jsonbes su almacenamiento:jsonse almacena en su formato de texto plano, mientrasjsonbse almacena en alguna representación binariaHay 3 consecuencias principales de esto:
jsonbgeneralmente toma más espacio en el disco para almacenar quejson(a veces no)jsonbtoma más tiempo construir desde su representación de entrada quejsonjsonlas operaciones toman mucho más tiempo quejsonb(y el análisis también debe hacerse cada vez que realiza alguna operación en unjsonvalor escrito)Cuando
jsonbesté disponible con una versión estable, habrá dos casos de uso principales, en los que puede seleccionar fácilmente entre ellos:json.jsonb.fuente
jsonbno admite esto?UPDATE test SET data->'a' = 123 WHERE id = 1;desdeCREATE TABLE test(id SERIAL PRIMARY KEY, data JSONB);jsonsobrejsonbes si por razones de herencia su código consumiendo sujsondepende del orden de losjsoncampos y no pueden ser reordenado.textvsjson.: 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 ajsonbla 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
hstorees 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).jsonalmacena 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.jsonbtoma 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
jsonbuna 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
jsonyjsonbtipos 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
jsontipo, pero sí hay uno parajsonb.Esto significa que no puede usar la
DISTINCTpalabra clave al seleccionar estejsontipo y / u otros campos de una tabla (puede usarloDISTINCT ONen 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