Réflexions techniques sur les relations entre documents
Mises à jour :





  • 14 juin 2018 : Suppression du $ dans le nom de la propriété $relationships
  • 27 mars 2018 : Commentaire sur la limitation qu’introduit l’absence de bi-directionnalité des liens (section)

Objectifs

  • Établir différentes façons de stocker des relations entre documents
  • Voir les avantages et inconvénients de chaque dans les contextes cozy-client, partage, couchdb
  • (Éventuellement) Éliminer ceux qu’on ne veut pas voir à Cozy
  • (Éventuellement) Trancher sur une normalisation à adopter s’il y en a une

Cas d’exemple

Requêtes auxquelles on souhaiterait pouvoir répondre :
  1. Tous les livres écrits par un auteur
  1. L’auteur d’un livre (ou les auteurs d’un livre si c’est une relation N-N)
  1. (idéalement) Tous les documents liés avec [un document précis]

Références


Pourquoi normaliser les relations entre les docs

Normaliser la position des liens nous permet de :
  • Faciliter le travail des équipes, les liens s’écrivant toujours sous la même forme
  • Automatiser le fonctionnement de Cozy-Client avec un comportement par défaut
  • Permettre un support de la stack au niveau des API
  • Supporter des liens créés par d’autres app non gérées par Cozy

La normalisation n’est toutefois qu’une recommandation. Chacun est libre de l’utiliser ou non. Si la normalisation n’est pas utilisée, la gestion est alors entièrement manuelle.

Syntaxe utilisée

On utilise une syntaxe proche de ce que nous retourne la JSON API. Les liens sont regroupés par type dans un objet “relationships”. Chaque lien est décrit par le type de document lié et par l’identifiant du document lié.

Au niveau du stockage dans CouchDb / PouchDb

Les relations sont dans une sous-clef “relationships”, avec une syntaxe proche de la JSON API.

La sous-clef était auparavant préfixée par un $, afin d’isoler cette clef du reste des attributs du document quand tout est présenté à plat. Toutefois les opérateurs mango utilisent aussi ce préfixe, et l’utilisation de celui-ci dans le nom des propriétés nécessite d’échapper ce caractères dans les sélecteurs et les indexes. Décision a été prise de ne plus utiliser ce $ afin de simplifier cela.

Pour une relation unique (1-1 ou 1-N)
const book = {
  _id: "B234",
  title: "Guerre et Paix",