Se ha lanzado la versión 5.0 de EdgeDB, que implementa un modelo de datos relacional y gráfico y un lenguaje de consulta, EdgeQL, optimizado para trabajar con datos jerárquicos complejos. El proyecto se desarrolla como una extensión de PostgreSQL, cuyo código está escrito en Python y Rust (el analizador y las partes críticas en rendimiento), y se distribuye bajo la licencia Apache 2.0. Se han preparado bibliotecas cliente para los lenguajes Python, Go, Rust, .NET, Elixir y TypeScript/Javascript. Se proporciona una herramienta de línea de comandos para gestionar la base de datos y ejecutar consultas interactivas (REPL).
En lugar de un modelo de datos basado en tablas, EdgeDB utiliza un sistema declarativo basado en tipos de objeto. En lugar de claves externas (foreign key) para definir relaciones entre los tipos, se utiliza la vinculación mediante referencias (un objeto puede ser utilizado como propiedad de otro objeto).
type Person { required name: str; } type Movie { required title: str; multi actors: Person; }
Se admiten características como la tipificación estricta de propiedades, restricciones de valores de propiedades, propiedades calculadas y procedimientos almacenados. Entre las características del esquema de objeto de almacenamiento de EdgeDB, que se asemeja a ORM, se destaca la posibilidad de mezclar esquemas, vincular propiedades de diferentes objetos y el soporte integrado de JSON. Se pueden aplicar índices para acelerar el procesamiento de consultas.
Se proporcionan herramientas integradas para la migración del esquema de almacenamiento: después de cambiar el esquema definido en un archivo esdl separado, solo se necesita ejecutar el comando «edgedb migration create» y la base de datos analizará las diferencias en el esquema y generará interactivamente un script para la transición al nuevo esquema. Además, se rastrea automáticamente el historial de cambios en el esquema.
Para la formación de consultas, se admite el lenguaje de consulta GraphQL y el propio lenguaje de EdgeDB, que representa una adaptación de SQL para datos jerárquicos. En lugar de listas, los resultados de la consulta se presentan de manera estructurada, y en lugar de subconsultas y operaciones JOIN, se permite especificar una consulta EdgeQL como una expresión dentro de otra consulta. Se admiten transacciones y bucles.
select Movie { title, actors: { name } } filter .title = «The Matrix» insert Movie { title := «The Matrix Resurrections», actors := ( select Person filter .name in { ‘Keanu Reeves’, ‘Carrie-Anne Moss’, ‘Laurence Fishburne’ } ) }
En la nueva versión:
- Se ha añadido soporte para el ramificado («branching»), que permite utilizar el concepto de ramas en la gestión de datos y esquemas, similar a los sistemas de control de versiones. En lugar del término «base de datos», en esta nueva versión se propone el concepto de «rama» (branch), y los comandos «create database» y «drop database» han sido declarados obsoletos, recomendándose el uso de los nuevos comandos «create empty branch» y «drop branch». Además de ramas vacías, a través de los comandos «create schema branch» y «create data branch» se pueden crear ramificaciones de ramas y bases de datos existentes, copiando su esquema de almacenamiento y datos.
Desde un punto de vista práctico, el soporte de ramas permite sincronizar los datos con el código utilizado para su procesamiento, manteniendo la compatibilidad con el código antiguo. Por ejemplo, después de actualizar el código, se puede vincular una nueva rama de datos que tenga en cuenta los cambios en el esquema de almacenamiento realizados en el código. Esta funcionalidad resulta útil para simplificar el desarrollo y la prueba de nuevas versiones de software, ya que, una vez listas, solo es necesario cambiar a la rama ya probada.
- En la extensión pgvector, utilizada para el almacenamiento y consulta eficiente de vectores, se ha añadido un nuevo tipo de índices HNSW (Hierarchical Navigable Small Worlds), que, al igual que el índice IVFFlat, está disponible en tres variantes: ext::pgvector::hnsw_euclidean, ext::pgvector::hnsw_ip y ext::pgvector::hnsw_cosine. Además, se han ampliado las capacidades de ajuste fino de los índices a través del objeto ext::pgvector::Config.
- Se han añadido capacidades adicionales de autenticación. En la extensión auth se ha implementado el soporte para esquemas de autenticación sin contraseña WebAuthn (Passkeys) y 'enlaces mágicos' (basados en email). Se ha añadido soporte para el uso de las plataformas Slack y Discord como proveedores de OAuth.
- Se han realizado optimizaciones de rendimiento. En la implementación de caché de resultados de compilación de consultas, se ha garantizado la conservación del estado entre reinicios y se ha añadido la recompilación automática después de la migración. Se ha mejorado la velocidad de operación con grandes esquemas de almacenamiento.
- En el lenguaje de consultas EdgeQL, se ha permitido omitir la palabra clave 'union' en consultas básicas en las que se utilizan las expresiones insert, update o delete.
- Se ha añadido el comando vacuum() para limpiar, optimizar y empaquetar el contenido de la base de datos.
- Se ha permitido la conversión de datos entre el tipo bytes y los tipos int16, int32, int64 y uuid, utilizando las funciones to_bytes(), to_uuid() y to_int*().
- Se ha añadido la posibilidad de cerrar todas las conexiones a la base de datos después de realizar la operación 'drop database'.
Fuente: opennet.ru
