NoSQL para empresas

QT relacional de EDB

¿Qué es Postgres NoSQL para empresas?

Postgres NoSQL es una poderosa combinación de tecnologías de bases de datos desestructuradas y relacionales en un único sistema de administración de bases de datos empresarial. Postgres NoSQL ofrece libertad, flexibilidad y rendimiento en el manejo de datos desestructurados y semiestructurados, a la vez que mantiene su viabilidad a largo plazo como información empresarial.

Las tecnologías de almacenamiento documental y clave-valor de Postgres ofrecen las ventajas de las nuevas tecnologías NoSQL además de la capacidad para incorporarlas a las infraestructuras tradicionales de datos corporativos, sin silos de datos, complejidades operativas, pérdida de la integridad de los datos y riesgos.

 

La Base de Datos Documental completa

Postgres ha combinado la implementación líder de JSON con su fiable motor de transacción ACID. Con esta singular combinación, los usuarios obtienen una flexibilidad de carga de trabajo líder sustentada en la plataforma más económica y fiable del mercado.

Hoy en día, una solución completa de bases de datos debe hacer frente no solo a la integridad transaccional, sino también a altas demandas de volúmenes de datos, una mayor rapidez de los datos y rendimiento veloz, y una variedad cada vez mayor de formatos de datos. Han surgido nuevas tecnologías que se especializan en optimizar uno o dos de estos aspectos, al tiempo que sacrifican otros.

Postgres con JSON adopta un enfoque más holístico respecto a las necesidades de los usuarios, y así, aborda con mayor éxito la mayoría de las cargas de trabajo NoSQL. Para obtener más información, lea el artículo técnico PostgreSQL Advances to Meet NoSQL Challenges (Avances de PostgreSQL para hacer frente a los desafíos de NoSQL).

 

¿ACID o BASE?

Los estándares de atomicidad, consistencia, aislamiento y durabilidad (Atomicity, Consistency, Isolation, and Durability, ACID) que han guiado la tecnología de las bases de datos durante décadas significan que los recursos más valiosos de una organización (es decir, sus datos) son válidos, consistentes y están protegidos.Las tecnologías independientes NoSQL no cumplen con los estándares ACID porque sacrifican las protecciones de datos importantes a fin de lograr un rendimiento más alto para aplicaciones desestructuradas. Logran una disponibilidad básica, un estado ténue y una consistencia eventual (Basic Availability, Soft State and Eventual Consistency, BASE), que puede resultar aceptable para ciertos casos de uso con poco riesgo, como un mensaje de texto perdido o el traslado de un token en un juego para múltiples jugadores.

Si bien las soluciones NoSQL pueden prometer la atomicidad en un único documento, esto resulta inadecuado para la mayoría de los sistemas empresariales con relaciones importantes de misión crítica entre múltiples conjuntos de datos desagregados, ya sean estructurados o desestructurados. Con las capacidades NoSQL de Postgres, resulta sencillo integrar porciones fundamentales de los datos destructurados con los datos regulados de modo tradicional, manteniendo los beneficios de agilidad y desestructuración que se obtienen con las herramientas NoSQL.

 

Simplicidad

Escribir aplicaciones para la web móvil o las redes sociales resulta muy sencillo gracias a la compatibilidad de Postgres con Javascript, Python, Ruby, node.js, JSON, Key-Values, geo-spatial y XML.

Al utilizar sus herramientas ágiles preferidas, los desarrolladores pueden mejorar fácilmente la experiencia de los clientes, acelerar el tiempo de comercialización y reducir los costes.

 

Escalabilidad

El crecimiento explosivo de los usuarios de Postgres se ha visto impulsado, al menos en forma parcial, por una demostrada experiencia respaldando sistemas de alto rendimiento con miles de usuarios procesando grandes cantidades de datos. Prácticamente en todas las situaciones excepto en casos con volúmenes extremos, Postgres administró con sencillez grandes cantidades de datos con multitud de usuarios concurrentes. 

  • El servidor de replicación xDB de EDB ofrece una solución de escalabilidad de lectura no virtualizada. xDB en configuraciones Multi-maestro ofrece escalabilidad de lectura y disponibilidad de escritura a una de las compañías telefónicas más grandes de los Estados Unidos. 
  • Failover Manager crea clusters de base de datos a prueba de errores para minimizar el tiempo de inactividad cuando una base de datos maestra falla. Para ello, conserva los datos en línea en configuraciones de alta disponibilidad. 
  • Las configuraciones y las soluciones a gran escala de Postgres pueden administrarse, monitorearse y ajustarse de manera profesional mediante el uso de Postgres Enterprise Manager de EDB, junto con paneles de rendimiento, alertas de condiciones críticas, planificación de la capacidad, analizadores de registros y mucho más.

 

Rendimiento

Hoy en día, Postgres se ocupa de tratar las necesidades cada vez más exigentes de grandes compañías de seguros, bancos, organismos gubernamentales y contratistas de defensa del mundo, y así lo ha hecho durante los últimos años. Las mejoras en el rendimiento de Postgres son continuas a medida que se publican nuevas versiones todos los años, e incluyen también un gran rendimiento de sus tipos de datos desestructurados.

 

EDB le invita a experimentar el rendimiento NoSQL de Postgres por sí mismo. Descargue pg_nosql_benchmark desde GitHub y comparta su opinión.

Comparación de Bases de Datos de Documentales/Relacionales

Un enfoque inteligente a las nuevas tecnologías requiere llevar a cabo una evaluación minuciosa de sus necesidades y de las herramientas disponibles para satisfacerlas.En la tabla a continuación, se comparan las características de la base de datos NoSQL de orientación Documental (como MongoDB) y las características de la base de datos de Documental/Relacional de Postgres, para ayudarlo a explorar y determinar cuál es la solución adecuada conforme a sus requisitos.

Funcionalidades MongoDB PostgreSQL
Inicio del desarrollo Open Source 2009 1995
Esquemas Dinámico Estático y dinámico
Compatible con Datos Documentales Jerárquicos Sí (desde el 2012)
Compatible con datos de valores clave Sí (desde el 2006)
Compatible con datos relacionales/almacenamiento normalizado de formularios No
Restricciones de datos No
Maximum Document Size 16 MB 1,000 MB
Joining of Data Extremely Difficult Extremely Easy
Powerful Standardized Query Language No
Soporte para transacciones y controles de concurrencia entre distintas versiones No
Transacciones atómicas Dentro de un documento En la base de datos
Idiomas admitidos para el desarrollo web JavaScript, Python, Ruby, más… JavaScript, Python, Ruby, más…
Soporte de formatos de datos web comunes JSON (documento), valores clave, XML JSON (documento), valores clave, XML
Compatibilidad geoespacial
Ruta más sencilla para el escalado Escalabilidad horizontal Escalabilidad vertical
Sharding Sencillo Complejo
Programación lateral del servidor Ninguno Muchos idiomas de procedimientos, como Python, JavaScript, C, C+++, Tcl, Perl y muchos más.
Integración sencilla con otros almacenamientos de datos No, creates data silos Yes, Foreign Data Wrappers to Oracle, MySQL, MongoDB, CouchDB, Redis, Neo4j, Twitter, LDAP, File, Hadoop and more…
Lógica empresarial Embedded in and Distributed Across Client Applications Centralizado con triggers y procedimientos almacenados o distribuidos en las aplicaciones de cliente
Disponibilidad de recursos especializados Difícil de encontrar Fácil de encontrar
Usos principales Grandes volúmenes de datos (miles de millones de registros) con actualizaciones de concurrencia elevada para las que no es necesario garantizar la integridad de los datos y la consistencia. Aplicaciones transaccionales y operativas que se benefician de formularios normalizados, uniones, restricciones de datos y soporte transaccional.

 

Para obtener más información sobre las capacidades JSON en Postgres...

Postgres admite datos estructurados y sin estructurar

Las tecnologías NoSQL, como almacenes documentales y de clave valor, son compatibles con las metodologías de desarrollo graduales, en las que los modelos de datos surgen a medida que la aplicación pasa por ciclos de desarrollo ágil, en lugar de ser cuidadosamente diseñadas por adelantado utilizando ER-diagramming, análisis normal de formularios y marcos de trabajo de diseño conceptual/lógico/físico.

NoSQL y ACID juntos

Postgres lanzó JSON (2012) y HSTORE (2006) para ofrecer a los desarrolladores y arquitectos de soluciones una opción de administración de datos desestructurados, totalmente integrada con el modelo sólido ACID (atómico, consistente, aislamiento y duradero) de Postgres.

 

Soporte para tipos de datos JSON

Postgres ofrece un soporte sólido para insertar datos JSON junto con un analizador de validación, almacenamiento y una amplia variedad de funciones para extraer elementos de los documentos JSON.

 

JSON dentro y JSON fuera

Postgres también ofrece la capacidad para cifrar fácilmente los conjuntos de resultados de las consultas en JSON, lo que significa que los desarrolladores de la aplicación que prefieren trabajar nativamente con JSON pueden obtener fácilmente los datos de Postgres en su formato original.

 

Documentos y datos de valores clave

Postgres también ofrece HSTORE para soporte de valores clave desde el 2006; sin embargo, a diferencia de otras soluciones exclusivas de NoSQL, todo almacenamiento de clave-valor creado en Postgres cumple con ACID.Al igual que JSON, STORE puede utilizarse para emular a una base de datos desestructurada, cuando así se desee.También hay funciones que convierten los datos de clave-valor mantenidos en Postgres en datos con formato JSON, lo que incrementa la flexibilidad y el alcance de las aplicaciones de tipo NoSQL, a las que Postgres puede hacer referencia.

 

JSON y Javascript

Postgres ofrece capacidades Javascript directamente en la base de datos, lo que permite a los desarrolladores web escribir lógicas centralizadas de bases de datos utilizando el mismo motor JavaScript que utilizan los clientes Web. Desarrollado por Google para Chrome, V8 ha sido diseñado para funcionar tanto en el cliente como en el servidor, y también es una parte fundamental de Node.js. V8 está disponible como complemento PL/V8 de Postgres.Con Postgres, los desarrolladores pueden trabajar con sus formatos de datos web y con el idioma de la aplicación web también en la base de datos.

 

Postgres para cuando la precisión es importante

Postgres 9.4 incorpora JSONB, un segundo tipo de JSON con un formato de almacenamiento binario muy distinto de BSON, el cuál es utilizado por el proveedor más importantes de bases de datos exclusivas documentales. BSON significa JSON binario; sin embargo, no todos los valores de JSON pueden representarse utilizando BSON. Por ejemplo, BSON no puede representar un número entero o un punto flotante con más de 64 bits de precisión, mientras que JSONB puede representar cualquier valor arbitrario de JSON.

Para obtener más información sobre las capacidades JSON en Postgres...

Operadores y funciones JSON/JSONB de Postgres

En las siguientes tablas, se muestra la variedad de operadores y funciones disponibles para el almacenamiento, la recuperación, la conversión, la manipulación y la creación de datos JSON en un entorno relacional de Postgres. Cuando se utilizan estas funciones con formatos clave-valor de Postgres (HSTORE), búsqueda de texto completo, búsqueda de trigramas, búsqueda de vecinos más cercanos, indexación GIN y GiST, tablas sin registrar, soporte XML, contenedores de datos externos (p. ej., MongoDB, CouchDB y Redis) y configuraciones de confirmación asincrónicas para una "posible consistencia", se dará cuenta de que no necesita otra base de datos especializada para satisfacer sus necesidades de datos desestructurados.

Los tipos de datos JSON de Postgres se utilizan para almacenar datos JSON (notación de objetos de Javascript), conforme se especifica en RFC 7159. Los tipos de datos JSON almacenan una copia exacta del texto de entrada, cuyas funciones de procesamiento deben volver a analizarse en cada ejecución; mientras que los datos JSONB se almacenan con un formato binario descompuesto, lo que, en cierta medida, ralentiza el ingreso como consecuencia de una sobrecarga adicional de conversión; no obstante, estos son significativamente más rápidos de procesar porque no es necesario volver a analizarlos. JSONB también admite la indexación, lo que puede suponer una ventaja importante.

 

En la siguiente tabla, se muestran los operadores disponibles para utilizar con los dos tipos de datos de JSON: JSON y JSONB.

Operadores JSON y JSONB
Operador Tipo de operando adecuado Descripción
–> int Obtener elemento de matriz JSON (indexado desde cero, los números enteros negativos se cuentan desde el final)
–> texto Obtener campo de objeto JSON por clave
–>> int Obtener elemento de matriz JSON como texto
–>> texto Obtener campo de objeto JSON como texto
#> texto[ ] Obtener objeto JSON en la ruta especificada
#> texto[ ] Obtener objeto JSON en la ruta especificada como texto

 

Existen operadores adicionales únicamente para JSONB, el formato de almacenamiento binario de JSON.

Operadores adicionales de JSONB
Operador Tipo de operando adecuado Descripción
@> jsonb ¿Contiene el valor JSON de la izquierda las entradas de ruta/valor JSON correctas en el nivel superior?
<@ jsonb ¿Se encuentran las entradas de ruta/valor JSON de la izquierda incluidas en el nivel superior dentro del valor JSON correspondiente?
? texto ¿Existe la cadena como clave de nivel superior dentro del valor JSON?
?| texto[ ] ¿Alguna de estas cadenas de matriz existe como clave de nivel superior?
?& texto[ ] ¿Existen todas estas cadenas como claves de nivel superior?
| | jsonb Vincule dos valores jsonb en un nuevo valor jsonb.
- texto Elimine el par de clave/valor o el elemento de cadena del operando izquierdo. Los pares clave/valor se combinan en función de su valor clave.
- entero Elimine el elemento de matriz con el índice especificado (recuento de enteros negativos desde el final). Arroja un error si el contenedor de nivel superior no es una matriz.
#- text[] Elimine el campo o el elemento con una ruta especificada (para matrices JSON, los enteros negativos se cuentan desde el final).

 

En esta tabla, se muestran las funciones disponibles para crear valores JSON. En la actualidad, no hay funciones equivalentes para JSONB; sin embargo, puede transmitir el resultado de una de estas funciones a JSON.

Funciones de creación de JSON
Función Descripción
to_json(anyelement)

to_jsonb(anyelement)

Devuelve el valor como json o jsonb. Las matrices y los compuestos se convierten (recursivamente) a matrices y objetos; de lo contrario, si hay una transmisión del tipo a json, la función de la transmisión se utilizará para llevar a cabo la conversión. De otro modo, se produce un valor escalar. Para cualquier tipo escalar que no sea un número, un operador booleano o un valor nulo, se utilizará la representación de texto, de forma tal que sea un valor json o jsonb válido.
array_to_json(anyarray [, pretty_bool]) Devuelve la matriz como matriz de JSON. Una matriz multidimensional de PostgreSQL se convierte en una matriz JSON de matrices. Se agregarán avances de línea entre los elementos dimension-1 si pretty_bool es verdadero.
row_to_json(record [, pretty_bool]) Devuelve la fila como objeto JSON. Se agregarán avances de línea entre los elementos level-1 si pretty_bool es verdadero.
json_build_array(VARIADIC "any")

jsonb_build_array(VARIADIC "any")

Crea una matriz de JSON de tipo posiblemente heterogéneo a partir de una lista variádica de argumentos.
json_build_object(VARIADIC "any")

jsonb_build_object(VARIADIC "any")

Crea un objeto JSON a partir de una lista variádica de argumentos. Por convención, la lista de argumentos está compuesta por claves y valores alternativos.
json_object(text[ ])

jsonb_object(text[ ])

Crea un objeto JSON a partir de una matriz de texto. La matriz debe tener exactamente una dimensión con un número parejo de miembros, en cuyo caso, se toman como pares de claves/valores alternativos; o bien, dos dimensiones, de tal forma que cada matriz interna esté compuesta exactamente por dos elementos, considerados un par de clave/valor.
json_object(keys text[ ], values text[ ])

jsonb_object(keys text[ ], values text[ ])

Esta forma de json_object toma claves y valores en pares de dos matrices individuales. En todo lo demás, es idéntico a la forma de un argumento.

 

En la tabla final, se muestran las funciones disponibles para procesar valores JSON y JSONB.

Funciones de procesamiento de JSON
Función Tipo de retorno Descripción
json_array_length(json)

jsonb_array_length(jsonb)

int Devuelve la cantidad de elementos en la matriz JSON más externa.
json_each(json)

jsonb_each(jsonb)

conjunto de texto clave, valor json

conjunto de texto clave, valor jsonb

Extiende el objeto JSON más externo en un conjunto de pares clave/valor.
json_each_text(json)

jsonb_each_text(jsonb)

conjunto de texto clave,

texto de valor

Extiende el objeto JSON más externo en un conjunto de pares de clave/valor. Los valores devueltos serán de tipo de texto.
json_extract_path(from_json json, VARIADIC path_elems text[ ])

jsonb_extract_path(from_jsonb jsonb, VARIADIC path_elems text[ ])

json

jsonb

Arroja un valor JSON al que se apunta en forma de path_elements (equivalente a un operador #>).
json_extract_path_text(from_json json, VARIADIC path_elems text[ ])

jsonb_extract_path_text(from_json jsonb, VARIADIC path_elems text[ ])

prueba Arroja un valor JSON al que se apunta en forma de path_elems como texto (equivalente a un operador #>>).
json_object_keys(json)

jsonb_object_keys(jsonb)

conjunto de texto Devuelve el conjunto de claves en el objeto JSON más externo.
json_populate_record(base anyelement, from_json json)

jsonb_populate_record(base anyelement, from_json jsonb)

cualquier elemento Extiende el objeto en from_json de una fila, cuyas columnas coinciden con el tipo de registro definido por la base (ver nota a continuación).
json_populate_recordset(base anyelement, from_json json)

jsonb_populate_recordset(base anyelement, from_json jsonb)

conjunto de cualquier elemento Extiende la matriz de objetos más externa en from_json de conjunto de filas, cuyas columnas coinciden con el tipo de registro definido por la base (ver nota a continuación).
json_array_elements(json)

jsonb_array_elements(jsonb)

conjunto de json

conjunto de jsonb

Extiende la matriz JSONH a un conjunto de valores JSON.
json_array_elements_text(json)

jsonb_array_elements_text(jsonb)

conjunto de texto Extiende la matriz JSON a un conjunto de valores de texto.
json_typeof(json)

jsonb_typeof(jsonb)

texto Devuelve el tipo de valor JSON más externo en forma de cadena de texto. Entre los tipos posibles, se encuentran objetos, matrices, cadenas, números, operadores booleanos y valores nulos.
json_to_record(json)

jsonb_to_record(jsonb)

registro Crea un registro arbitrario a partir de un objeto JSON (ver nota a continuación). Tal y como sucede con todas las funciones que devuelven registros, el llamador debe definir explícitamente la estructura del registro con una cláusula AS.
json_to_recordset(json)

jsonb_to_recordset(jsonb)

conjunto de registros Crea un conjunto arbitrario de registros a partir de una matriz de objetos (ver nota a continuación). Tal y como sucede con todas las funciones que devuelven registros, el llamador debe definir explícitamente la estructura del registro con una cláusula AS.
json_strip_nulls(from_json json)

jsonb_strip_nulls(from_json jsonb)

json

jsonb

Vuelve desde from_json con todos los campos de objetos con valores nulos omitidos. Otros valores nulos permanecen sin modificaciones.
jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean]) jsonb Arroja un destino con la sección designada por la ruta reemplazada por new_value o con new_value agregado si create_missing es verdadero (lo predeterminado es verdadero) y el elemento designado por la ruta no existe. Tal como sucede con los operadores orientados por rutas, los enteros negativos que aparecen en la ruta se cuentan desde el final de las matrices JSON.
jsonb_pretty(from_json jsonb) texto Arroja from_json como texto JSON con sangría.

 

Haga clic aquí para acceder a las funciones completas de JSON y a las referencias para el operador, con ejemplos y resultados de ejemplos.

 

Para obtener más información sobre las capacidades JSON en Postgres...

Cuéntenos su opinión

Queremos mejorar el sitio web y, para lograrlo, necesitamos de su ayuda. Cuéntenos de qué manera este sitio web se ajusta a sus necesidades:

Comenzar la encuesta >>

Tutorial de XDK de PG

XDK de PostgreSQL le permite explorar las capacidades NoSQL de PostgreSQL. 

Aprenda a manipular los datos JSON con PostgreSQL 9.4, con este tutorial asistido gratuito en Amazon Web Services.

Guía de inicio rápido de XDK de PG

Descargar PostgreSQL

 

NoSQL Webcast

Greater Developer Flexibility with NoSQL in EDB Postgres

NoSQL will give developers control over the data to be stored within the database without having to rely on a DBA to implement changes. This presentation will give an overview of what NoSQL is, briefly what the pros and cons are, and includes a demo of the NoSQL functionality in EDB Postgres to allow you to better choose the best data management solution for your use case.
 

NoSQL de referencia

Compruebe por sus propios medios cómo se desenvuelve Postgres con datos desestructurados en comparación con MongoDB.

Descargue la referencia NoSQL de Postgres y realice sus propias pruebas!

Descargar PostgreSQL