Un billet présente le projet EdgeDB. Il s'agit d'un nouveau système de base de données relationnel-objet. Le projet EdgeDB est open source et une première préversion sera publiée très prochainement, selon l'équipe du projet.
EdgeDB est présentée comme une base de données relationnelle objet nouvelle génération . Au lieu du modèle relationnel, il implémente un modèle de graphe d'objets . Dans ce modèle, les données sont décrites et stockées sous la forme d'objets et de relations fortement typés ou de liens entre eux. Les objets et les liens peuvent contenir des propriétés : un ensemble de valeurs scalaires nommées.
Les concepteurs de EdgeDB précisent qu'il ne s'agit pas d'une base de données graphique: les données sont stockées et interrogées à l'aide de techniques de base de données relationnelles et nécessitent un schéma strict.
EdgeDB n'est pas non plus une base de données de documents, mais insérer, modifier et interroger des données de type hiérarchique est trivial, toujours selon les concepteurs.
En dépit de la présence du mot objet dans relationnel-objet, EdgeDB n'est pas une base de données d'objets traditionnelle. Ni une implémentation de la persistance ou de l'encapsulation POO.
EdgeDB dispose d'un langage de requête expressif, EdgeQL, dont l'objectif est de faire correspondre et surpasser les capacités SQL modernes, telles que les sous-requêtes, l'agrégation avancée et les fonctions de fenêtres.
EdgeDB est basé sur PostgreSQL et hérite de toutes ses forces: fiabilité, conformité ACID et performance.
Pour donner un petit aperçu de EdgeDB, les concepteurs donnent la définition d'un schéma simple décrivant une application rudimentaire de type GitHub en utilisant leur schéma DSL:
# Define a string enumerated type for
# pull request status.
scalar type pr_status extending str:
constraint enum('Open', 'Closed', 'Merged')
# Pull request object type definition.
type PullRequest:
required property title -> str
required property status -> pr_status:
default := 'Open'
# Pull request "author" as a to-one
# link to a User object.
required link author -> User
# Many-to-many relationship with
# different User objects.
link assignees -> User:
cardinality := '**'
type User:
required property name -> str
link followees -> User:
cardinality := '**'
Voyons maintenant à quoi ressemble une simple requête écrite en EdgeQL
SELECT User {
id,
name,
followees: {
id,
name
}
}
FILTER
User.name = 'Alice';
alors que la requête SQL équivalente ressemblerait à ça :
SELECT
users.id,
users.name,
array_agg(followees.id) AS followee_ids,
array_agg(followees.name) AS followee_names
FROM
users
LEFT JOIN user_followees ON
user_followees.user_id = users.id
LEFT JOIN users AS followees ON
followees.id = user_followees.followee_id
WHERE
users.name = 'Alice'
GROUP BY
users.id, users.name;
EdgeDB dispose déjà d'un site dédié mais au moment où nous écrivons ces lignes, aucune date quant à la sortie de la première préversion de EdgeDB n'a été donnée.