La sortie de la base de donnĂ©es EdgeDB 4.0 a Ă©tĂ© annoncĂ©e, mettant en Ćuvre un modĂšle de donnĂ©es relationnel et graphique ainsi qu'un langage de requĂȘte EdgeQL, optimisĂ©s pour le traitement de donnĂ©es hiĂ©rarchiques complexes. Le code est Ă©crit en Python et Rust (pour le parseur et les parties critiques en termes de performance) et est distribuĂ© sous la licence Apache 2.0. Le projet Ă©volue sous la forme d'une extension de PostgreSQL. Des bibliothĂšques clientes sont disponibles pour les langages Python, Go, Rust, .NET, Elixir et TypeScript/Javascript. Un ensemble d'outils en ligne de commande est fourni pour gĂ©rer la base de donnĂ©es et exĂ©cuter des requĂȘtes de maniĂšre interactive (REPL).
EdgeDB utilise une approche dĂ©clarative basĂ©e sur des types d'objets plutĂŽt qu'un modĂšle de donnĂ©es basĂ© sur des tableaux. Au lieu de clĂ©s Ă©trangĂšres (foreign key) pour dĂ©finir les relations entre les types, un systĂšme de liaison par rĂ©fĂ©rences est utilisĂ© (un objet peut ĂȘtre employĂ© comme propriĂ©tĂ© d'un autre objet).
type Person { required name: str; } type Movie { required title: str; multi actors: Person; }
Pour accĂ©lĂ©rer le traitement des requĂȘtes, des index peuvent ĂȘtre utilisĂ©s. Des fonctionnalitĂ©s telles que la typage strict des propriĂ©tĂ©s, les contraintes de valeurs des propriĂ©tĂ©s, les propriĂ©tĂ©s calculĂ©es et les procĂ©dures stockĂ©es sont Ă©galement supportĂ©es. Parmi les caractĂ©ristiques du schĂ©ma de stockage orientĂ© objet d'EdgeDB, qui rappelle quelque peu les ORM, on note la possibilitĂ© de mĂ©langer les schĂ©mas, de lier des propriĂ©tĂ©s provenant de diffĂ©rents objets et le support intĂ©grĂ© de JSON.
Des outils intĂ©grĂ©s pour la migration du schĂ©ma de stockage sont fournis â aprĂšs modification du schĂ©ma, spĂ©cifiĂ© dans un fichier esdl sĂ©parĂ©, il suffit d'exĂ©cuter la commande « edgedb migration create » et la base de donnĂ©es analysera les diffĂ©rences de schĂ©ma et gĂ©nĂ©rera de maniĂšre interactive un script pour passer au nouveau schĂ©ma. L'historique des modifications de schĂ©ma est automatiquement suivi.
Pour la crĂ©ation de requĂȘtes, le langage de requĂȘte GraphQL ainsi que le langage propre Ă EdgeDB, qui est une adaptation de SQL pour les donnĂ©es hiĂ©rarchiques, sont supportĂ©s. Au lieu de listes, les rĂ©sultats de la requĂȘte sont formatĂ©s de maniĂšre structurĂ©e, et au lieu de sous-requĂȘtes et d'opĂ©rations JOIN, il est possible d'indiquer une requĂȘte EdgeQL en tant qu'expression au sein d'une autre requĂȘte. Les transactions et les boucles sont pris en charge.
sĂ©lectionnez Movie { titre, acteurs: { nom } } filtre .titre = «The Matrix» insĂ©rer Movie { titre := «The Matrix Resurrections», acteurs := ( sĂ©lectionner Personne filtre .nom dans { âKeanu Reevesâ, âCarrie-Anne Mossâ, âLaurence Fishburneâ } ) }
Dans la nouvelle version :
- Ajout de la prise en charge de la recherche textuelle complĂšte, mise en Ćuvre via un module plug-in fts. Pour transformer n'importe quel objet en document accessible Ă la recherche, il convient d'utiliser l'index fts::index, et pour rechercher une certaine phrase parmi les documents indexĂ©s, la fonction fts::search() a Ă©tĂ© proposĂ©e. Les rĂ©sultats sont renvoyĂ©s sous la forme de tuples, contenant l'objet trouvĂ© et son poids de recherche. Par exemple : type Item { requis disponible: bool { dĂ©faut := faux; }; requis nom: str; requis description: str; index fts::index sur ( fts::with_options( .nom, langue := fts::Language.eng ) ); } avec res := ( sĂ©lectionner fts::search(Item, âcandy cornâ, langue := âengâ) ) sĂ©lectionner res.object {nom, score := res.score} commander par res.score desc;
- Ajout d'un nouveau type de donnĂ©es «multirange», dĂ©finissant une ou plusieurs plages de valeurs pour reprĂ©senter des intervalles discontinus. La normalisation des zones de chevauchement dans les plages dĂ©finies est effectuĂ©e automatiquement. Le type «multirange» peut fonctionner avec toutes les fonctions et opĂ©rateurs prĂ©cĂ©demment disponibles pour le traitement des plages. sĂ©lectionner multirange([range(8, 10)]) + range(1, 5) â range(3, 4);
- Ajout et activation par défaut de la prise en charge de l'authentification pour limiter l'accÚs à GraphQL et EdgeQL sur HTTP.
- Pour démarrer le service d'authentification, fonctionnant séparément de l'instance de la base de données, une extension «auth» a été ajoutée, prenant en charge OAuth ou la connexion par e-mail et mot de passe.
- Ajout de l'extension pgcrypto, fournissant des fonctions hmac, gen_salt et crypt pour le hachage et le chiffrement. sĂ©lectionner ext::pgcrypto::digest(âencrypt thisâ, âsha1â);
- Ajout de l'extension pg_trgm avec des fonctions pour déterminer la similarité des chaßnes.
- Des optimisations ont Ă©tĂ© apportĂ©es, permettant d'amĂ©liorer les performances. La consommation de mĂ©moire a Ă©tĂ© le serveur rĂ©duite de 40%. Le code du parseur de requĂȘtes EdgeQL a Ă©tĂ© réécrit en langage Rust.
- Le langage EdgeQL a ajoutĂ© la prise en charge d'une syntaxe d'expressions conditionnelles plus familiĂšre (if ⊠then .. else âŠ). Il est dĂ©sormais possible d'utiliser des DML conditionnels pour crĂ©er, mettre Ă jour et supprimer diffĂ©rents objets en fonction de conditions spĂ©cifiĂ©es. Les fonctions to_bytes(), to_str(), enc::base64_encode et enc::base64_decode ont Ă©tĂ© ajoutĂ©es. L'utilisation de l'expression « when » est autorisĂ©e dans les dĂ©clencheurs. 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');
- Un nouveau moyen de transmettre des valeurs globales dans les requĂȘtes GraphQL a Ă©tĂ© ajoutĂ© â plutĂŽt que d'utiliser un champ sĂ©parĂ©, il est dĂ©sormais possible de transmettre des variables basĂ©es sur l'objet __globals__.
Source : opennet.ru
