Bientôt un nouveau système de gestion de base de données relationnel-objet open source : EdgeDB

Par:
fredericmazue

mer, 18/04/2018 - 16:40

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.