ADR 0001 – Modèle générique : nœuds, aspects JSONB, liens typés
ADR 0001 – Modèle générique : nœuds, aspects JSONB, liens typés
Contexte
L’outil doit gérer des notes, tâches, documents et projets avec des métadonnées cumulables (une facture est aussi un courrier lié à un projet), à la manière des aspects d’Alfresco, sans coder le domaine.
Décision
- Une table
nodepour tous les éléments, avec untypeoptionnel. - Une ligne
node_aspectpar aspect porté, avec les données enjsonbet la version de la définition au moment de l’écriture. - Une table
node_linkpour les relations typées (types déclarés dansconfig/links/), et le typewikipour les liens libres. - Une table
node_eventqui journalise toute modification (avant/après), base de l’historique des métadonnées et des règles du jalon 3. - Les données d’aspect sont validées contre le JSON Schema de l’aspect à l’écriture, pas à la lecture.
Alternatives écartées
- Une table par aspect (colonnes typées) : exige une migration par aspect, contraire à « un aspect = un fichier ».
- EAV (entité-attribut-valeur) : requêtes et index pénibles ; JSONB + GIN couvre le besoin.
- Un seul document JSONB par nœud : rend l’ajout et le retrait d’aspect et leur versionnement moins lisibles.
Conséquences
- Les requêtes de vues se font en JSONB (
->>,@>,jsonb_path_exists) ; index GINjsonb_path_opssurdata. - Le tri et les filtres sur un champ précis peuvent nécessiter des index d’expression ajoutés plus tard selon l’usage.
- Les champs calculés et rollups (jalon 3) seront matérialisés dans
datapar le moteur de règles.