Se presenta el lanzamiento de la base de datos EdgeDB 4.0, que implementa un modelo de datos relacional-gráfico y un lenguaje de consultas, EdgeQL, optimizado para trabajar con datos jerárquicos complejos. El código está escrito en Python y Rust (parser 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 de 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; }
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’ } ) }
En la nueva versión:
- Se ha añadido soporte para la búsqueda de texto completo a través del módulo complementario fts. Para convertir cualquier objeto en un documento accesible para búsqueda, se debe utilizar el índice fts::index, y para buscar una frase específica entre los documentos indexados, se ofrece la función fts::search(). Los resultados se devuelven en forma de tuplas, que contienen el objeto encontrado y su peso de búsqueda. Por ejemplo: type Item { required available: bool { default := false; }; required name: str; required description: str; index fts::index on ( fts::with_options( .name, language := fts::Language.eng ) ); } with res := ( select fts::search(Item, 'candy corn', language := 'eng') ) select res.object {name, score := res.score} order by res.score desc;
- Se ha añadido un nuevo tipo de datos 'multirange', que define uno o varios rangos de valores para representar intervalos discontinuos. La normalización de áreas superpuestas en los rangos dados se realiza automáticamente. Todas las funciones y operadores disponibles anteriormente para el procesamiento de rangos pueden trabajar con el tipo 'multirange'. select multirange([range(8, 10)]) + range(1, 5) — range(3, 4);
- Se ha añadido y habilitado por defecto soporte para autenticación para restringir el acceso a GraphQL y EdgeQL sobre HTTP.
- Para iniciar el servicio de autenticación, que funciona de forma independiente de la instancia de la base de datos, se ha añadido la extensión 'auth', que soporta OAuth o acceso mediante correo electrónico y contraseña.
- Se ha añadido la extensión pgcrypto, que proporciona funciones hmac, gen_salt y crypt para el hash y cifrado. select ext::pgcrypto::digest('encrypt this', 'sha1');
- Se ha añadido la extensión pg_trgm con funciones para determinar la similitud de cadenas.
- Se han realizado optimizaciones que han mejorado el rendimiento. El consumo de memoria ha servidor disminuido en un 40%. El código del analizador de consultas EdgeQL ha sido reescrito en lenguaje Rust.
- Se ha añadido soporte en el lenguaje EdgeQL para una sintaxis de expresiones condicionales más familiar (if … then .. else …). Se ha proporcionado la posibilidad de utilizar DML condicional para crear, actualizar y eliminar diferentes objetos en función de las condiciones especificadas. Se han añadido funciones to_bytes(), to_str(), enc::base64_encode y enc::base64_decode. En los triggers, se permite el uso de la expresión 'when'. select if count(Object) > 0 then 'got data' else 'no data'; select (select User filter .name = 'Alice') ?? (insert User { name := 'Alice' }); select enc::base64_encode(b'hello');
- Se ha añadido un nuevo método para transmitir valores globales en consultas GraphQL: en lugar de utilizar un campo separado, ahora es posible enviar variables basadas en el objeto __globals__.
Fuente: opennet.ru
