Se ha presentado la versión 2.0 de la base de datos EdgeDB, que implementa un modelo de datos relacional y gráfico y un lenguaje de consultas EdgeQL, optimizados para trabajar con datos jerárquicos complejos. El código está escrito en Python y Rust (analizador y partes críticas para el rendimiento) y se distribuye bajo la licencia Apache 2.0. El proyecto se desarrolla como una extensión de PostgreSQL. Se han preparado bibliotecas cliente para los lenguajes Python, Go, Rust 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 property name -> str; } type Movie { required property title -> str; multi link actors -> Person; }
Para acelerar el procesamiento de consultas, se pueden utilizar índices. También se admiten características como la tipificación estricta de propiedades, restricciones en los valores de las propiedades, propiedades calculadas y procedimientos almacenados. Entre las características de la esquema de almacenamiento de EdgeDB, que recuerda a un ORM, se destaca la posibilidad de mezclar esquemas, vincular propiedades de diferentes objetos y la integración del soporte para JSON.
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 formar consultas, se admite tanto el lenguaje de consultas GraphQL como su propio lenguaje EdgeDB, que es una adaptación de SQL para datos jerárquicos. En lugar de listas, los resultados de las consultas 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 ciclos.
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' } ) } for number in {0, 1, 2, 3} union ( select { number, number + 0.5 } );
En la nueva versión:
- Se ha añadido una interfaz web integrada para la administración de la base de datos, que permite visualizar y editar datos, ejecutar consultas EdgeQL y analizar el esquema de almacenamiento aplicado. La interfaz se inicia con el comando 'edgedb ui', después de lo cual está disponible al acceder a localhost.

- Se ha implementado la expresión 'GROUP', que permite seccionar y agregar datos y realizar agrupamientos de datos por expresiones EdgeQL arbitrarias, de manera similar a la agrupación en la operación SELECT.
- Posibilidad de gestionar el acceso a nivel de objetos. Las reglas de acceso se definen a nivel del esquema de almacenamiento y permiten restringir el uso de un conjunto específico de objetos en operaciones de selección, inserción, eliminación y actualización. Por ejemplo, se puede agregar una regla que permita la actualización de una publicación únicamente al autor.
- Se ha añadido la posibilidad de usar variables globales en el esquema de almacenamiento. Se ha propuesto una nueva variable global llamada current_user para la vinculación al usuario.
- Se ha añadido soporte para tipos que definen rangos de valores (range).
- Se ha preparado la biblioteca cliente oficial para el lenguaje Rust.
- Se ha estabilizado el protocolo binario de EdgeDB, que ahora puede manejar simultáneamente varias sesiones diferentes dentro de una misma conexión de red, así como el reenvío a través de HTTP, el uso de variables globales y estados locales.
- Se ha añadido soporte para la activación por socket, lo que permite no mantener el procesador del servidor en memoria y ejecutarlo solo al intentar establecer una conexión (útil para ahorrar recursos en sistemas de desarrolladores).
Fuente: opennet.ru

