reference/schema-donnees.md

Schéma de données — modèle et patterns

Cette référence décrit le modèle de données au niveau architecture : ses domaines, sa répartition entre bundles et ses patterns. Elle ne publie pas le détail des colonnes (discipline airlock : la structure d'une base est une information de reconnaissance, on en documente la conception, pas la surface d'attaque).

Deux moteurs de stockage, rĂ´les disjoints

Moteur Usage
SGBD relationnel Données applicatives (tous les domaines ci-dessous)
Base embarquée + extension vectorielle Index RAG (recherche kNN par similarité cosinus)

Le modèle par domaine

Les entités sont réparties entre quatre bundles plus le cœur applicatif. Chaque bundle déploie ses entités de façon autonome (auto-mapping, sans fichier de mapping ni migration au bootstrap). L'application ne maintient que ses propres entités et résout les entités cibles que les bundles réclament par interface (voir patterns).

Domaine Porté par Rôle
Identité & accès cœur applicatif Comptes, authentification, second facteur, appareils de confiance, réinitialisation. Aucun secret n'est stocké en clair : mots de passe hachés, jetons et secrets 2FA hachés ou chiffrés.
CMS multisite bundle socle Sites (résolution par host), contenus éditoriaux (slug unique par site), étiquettes, médias (validation MIME réelle), extensions SEO en entités compagnons.
Veille bundle produit Sources planifiées, items collectés avec déduplication par empreinte de contenu, journal de tentatives pour diagnostic, cycle de vie de proposition (statuts), état de lecture par utilisateur.
Métriques bundle produit Usage et coûts d'appels LLM agrégés par dimension, alertes de seuil, cache local des identifiants de clés.
Tenancy MCP bundle MCP Locataires, clients API (jeton jamais stocké — uniquement son empreinte), projets (racine de corpus), journal d'audit des appels d'outils.

Le détail des champs de chaque entité vit dans la doc de production de chaque repo (-doc), pas dans la vitrine.

Patterns Doctrine notables (le cœur du savoir-faire)

  • Auto-mapping — toutes les entitĂ©s des bundles sont auto-mappĂ©es : aucun fichier de mapping XML/YAML, aucune migration au bootstrap. Un bundle apporte ses tables sans configuration cĂ´tĂ© hĂ´te.
  • EntitĂ© compagnon — pour Ă©tendre une entitĂ© d'un bundle sans modifier sa table (ex. champs SEO sur un contenu CMS), on l'associe en OneToOne Ă  une table satellite portĂ©e par l'hĂ´te. Le bundle reste maĂ®tre de sa table ; l'application l'enrichit par le cĂ´tĂ©.
  • resolve_target_entities — les bundles ne dĂ©pendent pas d'une classe User concrète : ils dĂ©clarent leurs interfaces (utilisateur du CMS, lecteur de veille…) et l'application rĂ©sout l'entitĂ© cible en configuration. DĂ©couplage → testabilitĂ© et rĂ©utilisabilitĂ© des bundles.
  • DĂ©normalisation d'audit — le journal d'audit stocke ses identifiants en colonnes scalaires plutĂ´t qu'en clĂ©s Ă©trangères : choix dĂ©libĂ©rĂ© pour conserver l'historique mĂŞme après suppression du tenant ou du client auditĂ©.
  • Lifecycle callbacks — horodatages created_at / updated_at gĂ©rĂ©s par callbacks d'entitĂ© (PrePersist / PreUpdate), sans listeners globaux.
  • Singleton par clĂ© naturelle — certains stores clĂ©/valeur utilisent une clĂ© mĂ©tier comme clĂ© primaire plutĂ´t qu'un auto-increment.

Index vectoriel (RAG)

En dehors du SGBD relationnel, le moteur RAG utilise une base embarquée dotée d'une extension vectorielle pour la recherche kNN : des fragments (chunk) porteurs de leur provenance et de leur vecteur, interrogés par proximité cosinus. Ce store est géré par le composant RAG, pas par l'ORM.

Pour aller plus loin

Assistant documentaire

Posez une question sur la documentation. Les réponses citent leurs sources — un clic ouvre le document à gauche.