Historique des versions
| Version | Date | Rédacteur | Description |
|---|---|---|---|
1.0.0 |
18/06/2026 |
Équipe Technique |
Version initiale |
1.1.0 |
11/10/2026 |
Équipe Technique |
Mise à jour d’ensemble. Les cas d’utilisation, les règles de gestion et les scénarios de recette sont alignés sur le comportement attendu de la solution. Les schémas de données, les vues d’exécution et les diagrammes de séquence sont repris sur le modèle et les échanges livrés. Le dictionnaire des données est ramené aux tables structurantes, le modèle complet étant porté en annexe. Les documents sont mis en cohérence entre eux sur les statuts, les rôles, les interfaces et les nomenclatures. |
Diffusion
| Destinataires | Pour validation | Pour information |
|---|---|---|
COPIL |
X |
Validation
| Représentants | Valideur | Date |
|---|---|---|
DCE |
||
MND |
||
ASIN |
||
MESRS - DSI |
||
UNIVERSITÉS - DSI |
||
DSI Présidence |
1. Introduction et objectifs
1.1. Vue d’ensemble
bdes-referentiel est le système central de gestion des données de référence de l’enseignement supérieur au Bénin. Il agrège, normalise et expose via X-Road les données autoritaires provenant de multiples sources (systèmes de scolarité des universités, ministères, etc.).
Le système fonctionne comme un pipeline de données ELT (Extract, Load, Transform) qui :
-
Collecte les données de sources hétérogènes (API, fichiers Excel, bases de données)
-
Traite ces données (déduplication, normalisation, validation)
-
Expose un référentiel consolidé via X-Road pour les systèmes consommateurs (notamment bdes-evaluation)
1.2. Objectifs métier
| Priorité | Objectif |
|---|---|
1 |
Centraliser les données de référence de l’enseignement supérieur du Bénin dans une source unique de vérité |
2 |
Éliminer les doublons et incohérences entre les différentes sources de données universitaires |
3 |
Fournir un référentiel fiable et à jour pour les systèmes métier (évaluation, statistiques, pilotage) |
4 |
Assurer l’interopérabilité via X-Road avec les systèmes consommateurs |
5 |
Automatiser la collecte et le traitement des données référentielles |
1.3. Exigences de qualité spécifiques
| Priorité | Exigence | Description |
|---|---|---|
1 |
Fiabilité des données |
Les données exposées doivent être exactes, complètes et cohérentes (taux d’erreur < 1%) |
2 |
Disponibilité |
Service disponible 99.5% du temps pendant les heures ouvrables |
3 |
Performance |
Réponse aux requêtes API < 2 secondes (95e percentile) |
4 |
Sécurité |
Authentification forte via X-Road, traçabilité complète des accès aux données |
5 |
Maintenabilité |
Architecture modulaire permettant l’ajout de nouvelles sources sans refonte majeure |
2. Contexte et périmètre
2.1. Contexte métier
2.1.1. Partenaires de communication
| Partenaire | Description |
|---|---|
SI Université |
Systèmes d’information de gestion de la scolarité des Universités Publiques du Bénin : student.easylmd.net (UNA), academie.unstim.bj (UNSTIM), offres.uac.bj (UAC), Okapi (UPAR). Fournissent les données sur les enseignants, étudiants, programmes, UE/EC, soutenances. |
Autres SI |
Systèmes externes complémentaires. Fournissent les données RH statutaires des enseignants (corps, grade, affectations). |
bdes-evaluation |
Système consommateur principal. Utilise les référentiels (enseignants, universités, programmes) pour l’évaluation des enseignants. |
X-Road |
Infrastructure d’échange de données sécurisée. bdes-referentiel expose ses services via X-Road pour garantir traçabilité et sécurité. |
Administrateurs DCE |
Supervisent le fonctionnement du système, configurent les sources de données, pilotent la qualité des données. |
2.1.2. Modèle de données référentielles
Le référentiel s’articule autour de six schémas logiques — REFERENCE, RAW, STAGING, MDM, GOLDEN et AUDIT — garantissant la séparation des préoccupations, la traçabilité et la qualité des données :
Le schéma GOLDEN contient les données maîtres consolidées et réconciliées du référentiel. Ces données constituent la source de vérité unique (Single Source of Truth) après nettoyage, déduplication et validation des données reçues dans la zone d’atterrissage. L’organisation en packages logiques (Personnes, Rôles_Fonctions, Structures, Formations) facilite la maintenance et l’évolution.
Le package GOLDEN.Personnes centralise toutes les informations relatives aux personnes physiques intervenant dans l’enseignement supérieur : étudiants, enseignants, chercheurs, personnel administratif. Une personne y a une fiche unique, identifiée par son matricule, qui porte son identité, son état civil et sa situation administrative. Le cumul de rôles — étudiant en doctorat et enseignant vacataire, par exemple — est porté par les affectations du package Rôles_Fonctions.
Le package GOLDEN.Roles_Fonctions porte les affectations temporalisées : celles d’un rôle métier à une personne dans une structure, celles d’une fonction organisationnelle, et les habilitations. Les nomenclatures des rôles et des fonctions elles-mêmes appartiennent au schéma REFERENCE. Une même personne peut cumuler plusieurs rôles et fonctions, simultanément ou successivement, dans des structures différentes.
Le package GOLDEN.Structures modélise l’organigramme complet de l’enseignement supérieur : universités, facultés (UFR), écoles, instituts, départements, laboratoires de recherche, chaires, écoles doctorales. Chaque structure se rattache à une structure parente unique ; le niveau hiérarchique est calculé à la lecture par la vue golden.v_structure_organisationnelle.
Caractéristiques communes au schéma GOLDEN :
* Modèle normalisé évitant la redondance
* Identité et état civil portés par la fiche de la personne ; contacts, adresses et pièces d’identité dans des tables dédiées
* Temporalité par date_debut et date_fin pour les affectations, les liens et la validité des contacts et des adresses ; par dates d’ouverture et de fermeture pour les structures ; par plage de validité pour les offres de formation
* Traçabilité des écritures par Hibernate Envers, dans le schéma AUDIT
Le package GOLDEN.Formation modélise l’offre de formation complète de l’enseignement supérieur : diplômes, formations, offres annuelles, parcours, unités d’enseignement (UE) et éléments constitutifs (EC), leurs rattachements à l’offre, et la planification des cours et de leurs créneaux. La hiérarchie permet de représenter la structure du système LMD (Licence-Master-Doctorat), avec ses semestres et ses crédits.
Le schéma REFERENCE contient l’ensemble des nomenclatures, listes de valeurs et référentiels statiques utilisés dans tout le système. Ces tables constituent le socle commun de données partagées entre toutes les entités métier. Elles garantissent l’homogénéité terminologique, facilitent l’interopérabilité avec les systèmes externes et permettent l’évolution des valeurs sans impact structurel sur la base.
Caractéristiques principales :
* Données peu volatiles, modifiées par administration centralisée
* Référencement depuis GOLDEN par le code de la nomenclature, et par l’identifiant pour quelques rattachements
* Taxonomie des domaines, mentions et spécialités conforme à la nomenclature REESAO ; codes des pays conformes à la norme ISO 3166
* Historisation via colonnes d’audit (created_at, updated_at, version)
Les schémas RAW et STAGING forment la zone d’atterrissage des données provenant des sources externes (universités, MESRS, MTFP, etc.). Le lot arrive dans son format natif et y est conservé intégralement, pour préserver l’intégrité de la source ; il est ensuite éclaté en lignes typées, une table par entité, où se font le contrôle, la correction et le rapprochement avant consolidation dans GOLDEN.
Principes de fonctionnement :
* Le payload reçu est conservé intégralement dans raw.bulk_import
* Chaque ligne de staging porte son statut de traitement : PENDING, PROCESSING, PROCESSED, ERROR ou SKIPPED
* Une ligne en défaut reste en staging, avec son motif, jusqu’à correction et relance
* Les lignes traitées sont conservées, pour la traçabilité et la reprise des lots en erreur
Le schéma AUDIT assure la traçabilité des écritures sur les entités consolidées, par Hibernate Envers : chaque entité auditée porte sa table audit.<entité>_aud, et audit.revinfo horodate les révisions. Le schéma MDM porte les journaux du pipeline — mdm.reconciliation_log, mdm.ingest_error — et la provenance par champ, mdm.field_provenance. Conforme aux exigences ISO 27001 et RGPD pour l’auditabilité des données sensibles.
2.2. Contexte technique
2.2.1. Canaux de communication
| Canal | Protocole/Format | Données | Fréquence |
|---|---|---|---|
SI Université → bdes-migration |
Excel |
Enseignants, étudiants, programmes, UE/EC, soutenances |
Trimestriel |
Autres SI → bdes-migration |
Excel via messagerie ou dépôt |
Données RH enseignants (affectations, corps, grade) |
À la demande |
bdes-migration → referentiel-api-ms |
HTTP/REST (JSON), |
Lots d’import, payload conservé intégralement |
À la demande |
referentiel-api-ms → pipeline MDM |
Appel de fonction dans la transaction de l’import |
Ingestion vers |
Synchrone à l’import |
X-Road Security Server → referentiel-api-ms |
HTTP/REST (JSON) |
Requêtes des consommateurs externes |
À la demande |
bdes-evaluation → referentiel-api-ms |
HTTP/REST, compte de service |
Consultation des référentiels ; dépôt des maquettes et des planifications |
Temps réel |
ANIP/Autres consommateurs → X-Road |
X-Road Protocol (REST) |
Consultation données statistiques, indicateurs |
À la demande |
Formats de données
-
Entrée : Excel, JSON (API REST)
-
Stockage : PostgreSQL (schéma normalisé)
-
Exposition : JSON via X-Road (REST) ou selon configuration
3. Stratégie de solution
3.1. Approche générale
bdes-referentiel adopte une architecture ELT (Extract-Load-Transform) dont les trois étapes s’exécutent dans PostgreSQL :
-
Extraction & Chargement : réception des données par l’API d’import en masse (
/api/v1/bulk/*), conservation du payload complet dans le schémaraw, puis éclatement en lignes typées dans le schémastaging -
Transformation en base : rapprochement et consolidation vers le schéma
goldenpar des fonctions PL/pgSQL du schémamdm, livrées et versionnées avec le schéma par les migrations Flyway -
Exposition via API Spring Boot : services REST sécurisés par X-Road pour les consommateurs
3.2. Décisions technologiques
| Technologie | Décision | Justification |
|---|---|---|
PL/pgSQL (fonctions |
Moteur de transformation |
Transformation au plus près des données, dans la transaction de l’import ; aucun composant d’exécution supplémentaire ; code versionné avec le schéma |
Flyway (bdes-db-migration) |
Livraison du schéma et du pipeline |
Les fonctions du pipeline sont des objets de la base ; chaque évolution est une migration ( |
PostgreSQL 16 |
Base de données référentielle |
ACID, JSONB pour les payloads bruts, extensions |
Spring Boot 3 |
Framework API REST |
Stack Java standard, Spring Data JPA, intégration X-Road, cache Redis |
X-Road |
Bus d’interopérabilité |
Exigence gouvernementale, authentification mutuelle, traçabilité complète |
3.3. Composants
- referentiel-api-ms (Spring Boot)
-
Reçoit les imports en masse, déclenche le pipeline de consolidation (
mdm.process_import) dans la transaction de la requête, expose les donnéesgoldenvia API REST avec cache, et porte le workflow de correction des lignes en erreur. - Pipeline MDM (fonctions PL/pgSQL)
-
Ingestion
rawversstaging(mdm.ingest_*), rapprochementstagingversgolden(mdm.reconcile_*), déclencheurs d’auto-rapprochement sur les tablesstaging. Fonctionnement à la demande, synchrone à l’appel d’import. - bdes-db-migration (Flyway)
-
Porte les migrations du schéma
referentiel, dont la définition des tablesstaging, des fonctions du pipeline et de ses déclencheurs. Exécuté en Job Kubernetes à chaque livraison.
3.4. Stratégie qualité des données
Niveaux de validation :
-
Chargement
staging(mdm.ingest_*) : champs obligatoires (matricule, nom, code), normalisation des libellés, résolution des codes de référence par libellé (similaritépg_trgm), écart des éléments déjà connus. Un élément en défaut est journalisé dansmdm.ingest_error; le lot continue. -
Rapprochement (
mdm.reconcile_*) : existence des références, résolution de la clé naturelle, règles d’unicité et de suppression. Une ligne en défaut passe en statutERRORavec un message, et reste disponible pour correction. -
Consolidation
golden: création ou mise à jour. En mise à jour, chaque champ prend la dernière valeur non vide reçue ; une valeur absente ou vide ne remplace pas la valeur en place. -
Traçabilité :
mdm.field_provenance(source du dernier apport par champ, pour les personnes),mdm.reconciliation_log(journal des lots),raw.bulk_import(payload conservé), tablesaudit.*_aud(Hibernate Envers).
3.5. Architecture des données
Schéma à 6 couches :
-
REFERENCE : Nomenclatures (grades, corps, statuts, types, années académiques, géographie)
-
RAW : Payloads d’import reçus par l’API, conservés intégralement (
raw.bulk_import) -
STAGING : Une table par entité importée, lignes typées avec statut de traitement (
PENDING,PROCESSING,PROCESSED,ERROR,SKIPPED) -
MDM : Configuration des sources et des déclencheurs, fonctions du pipeline, journal, provenance
-
GOLDEN : Données consolidées (source de vérité)
-
AUDIT : Historique des entités JPA (Hibernate Envers)
Les schémas raw et staging forment la zone d’atterrissage. Les lignes de raw et de staging sont conservées après traitement, pour la traçabilité et la reprise des lots en erreur.
|
La stratégie de déploiement est documentée dans le DAT - Exploitation. |
4. Vue en Briques
4.1. Niveau 1 : Vue d’ensemble
4.1.1. Composants principaux
| Composant | Responsabilité |
|---|---|
referentiel-api-ms |
Expose les référentiels via API REST. Reçoit les imports en masse ( |
Pipeline MDM (PostgreSQL) |
Fonctions PL/pgSQL et déclencheurs du schéma |
bdes-db-migration |
Migrations Flyway du schéma |
Base de données |
Stocke référentiels consolidés (PostgreSQL). Schémas REFERENCE, RAW, STAGING, MDM, GOLDEN, AUDIT. |
bdes-migration |
Outil d’alimentation en ligne de commande (Python). Transforme les fichiers sources et les soumet à l’API d’import ( |
X-Road Security Server |
Infrastructure externe. Sécurité, traçabilité, routage des requêtes. |
4.2. Niveau 2 : Pipeline MDM
Composants du pipeline
| Composant | Description |
|---|---|
Service d’import |
|
|
Table de réception. Conserve le payload complet, le type ( |
Fonctions d’ingestion |
|
Tables |
Une table par entité importée (personne physique, adresse postale, coordonnées de contact, affectations rôle et fonction, structure organisationnelle, type de structure, formation, programme de formation, unité d’enseignement, élément constitutif, planification de cours, année académique, grade, statut, corps, mention, spécialité, domaine, nature de support, type de diplôme). Colonnes communes : |
Fonctions de rapprochement |
|
Déclencheurs d’auto-rapprochement |
|
Configuration des sources |
|
Journal et provenance |
|
Workflow de correction |
|
4.3. Niveau 2 : bdes-referentiel-api
| Composant | Description |
|---|---|
Contrôleurs REST |
Endpoints API répartis en six familles : les nomenclatures de référence (pays, genres, corps, grades, catégories, classes, mentions, spécialités, statuts, fonctions, rôles métiers, domaines REESAO, types et natures, diplômes et leurs niveaux, finalités et voies, modalités d’évaluation, années académiques, semestres, libellés) ; les personnes ( |
Contrôleurs d’import et de correction |
|
Services Métier |
Logique applicative : requêtes complexes, agrégations, filtres. |
Repositories |
Spring Data JPA. Accès base de données, requêtes JPQL optimisées. |
Cache |
Redis. Cache données référentielles peu volatiles (TTL configurable). Éviction des caches de formations à chaque import académique. |
Sécurité |
Intégration X-Road pour authentification. Vérification certificats, traçabilité requêtes. |
5. Vue Exécution
5.1. Pipeline de consolidation des données
Le processus de consolidation transforme les données brutes multi-sources (schémas raw et staging) en référentiel unique (schéma golden, et schéma reference pour les nomenclatures). Cette transformation s’opère par des fonctions PL/pgSQL du schéma mdm, exécutées dans la transaction de l’appel d’import.
Principes de fonctionnement :
-
Les données sources arrivent par l’API d’import en masse (
POST /api/v1/bulk/{referentiel,academique,personnes,planification}) sous forme d’un payload JSON ; les dépôts Excel (planification, UE/EC) sont convertis en payload JSON par le service et suivent le même chemin -
Le payload est conservé intégralement dans
raw.bulk_import, puis éclaté en lignes typées dans les tablesstaging(phase INGEST) -
Chaque ligne
stagingest rapprochée d’un enregistrementgoldenexistant, créé ou mis à jour (phase RECONCILE), soit par le déclencheurAFTER INSERTde sa table, soit par le lotmdm.reconcile_all_<entité>appelé à la fin de l’import -
Une ligne qui ne peut pas être rapprochée reste en
stagingavec le statutERRORet un message ; elle est corrigeable et rejouable depuis l’API/api/v1/staging/errors -
mdm.reconciliation_logjournalise chaque lot ;mdm.field_provenanceconserve la source du dernier apport par champ pour les personnes physiques ;mdm.ingest_errorconserve les éléments non ingérés
Les sections suivantes détaillent le déroulement commun d’un import, puis les flux par domaine métier.
5.2. Déroulement d’un import en masse
Étapes :
-
Réception :
BulkImportServiceenregistre le payload dansraw.bulk_importavec le type (REFERENTIEL,ACADEMIQUE,PERSONNES), le code de source et unbatch_id. Pour une planification déposée par un responsable d’UFR, le service vérifie au préalable que toutes les formations citées appartiennent à son périmètre. -
Déclenchement : dans la même transaction, le service appelle
mdm.process_import(id). La fonction refuse un import qui n’est pas en statutRECEIVED. -
Phase INGEST :
mdm.ingest_importroute versmdm.ingest_referentiel,mdm.ingest_personnesoumdm.ingest_academiqueselon le type ;mdm.ingest_planificationstraite la sectionplanificationsd’un import académique. Chaque élément du payload est normalisé et inséré dans la tablestagingde son entité, avec lebatch_idde l’import. Un élément dont le champ obligatoire manque est comptéskipped; un élément déjà connu (clé exacte ou similarité d’intitulé) est comptématchedet n’est pas inséré ; un élément dont l’insertion échoue est journalisé dansmdm.ingest_erroret comptéerrors. Le lot continue dans tous les cas. -
Rapprochement par déclencheur : pour les entités dont
mdm.trigger_config.auto_reconcileest vrai, le déclencheurAFTER INSERTappelle la fonction unitaire immédiatement, pendant la phase INGEST. Une exception dans la fonction est rattrapée par le déclencheur, qui marque la ligneERRORsans interrompre l’insertion. -
Phase RECONCILE :
mdm.process_importappelle les lotsmdm.reconcile_all_<entité>(batch_id)dans un ordre fixe par type d’import (voir Orchestration globale). Chaque lot ne traite que les lignes encorePENDING: pour une entité à déclencheur actif, le lot ne trouve rien et renvoie des compteurs à zéro ; pour une entité sans déclencheur (corps, mention, affectations, programme de formation, année académique), c’est le lot qui effectue le rapprochement. -
Rapport : la fonction renvoie une ligne par phase et par entité (
total_items,inserted,matched,skipped,errors). Le service en déduit le statutPROCESSED(aucune erreur) ouPARTIAL. Pour les dépôts UE/EC et planification, le service recompte directement sur les lignesstagingdu lot (reconcile_action,status,error_message) et surmdm.ingest_error, afin de restituer les écritures effectuées par les déclencheurs. -
Échec global : si
mdm.process_importlève une exception non rattrapée (type inconnu, statut inattendu), le service journalise l’erreur, la transaction est annulée et l’appel répond en erreur.
Statuts successifs de raw.bulk_import : RECEIVED → PARSING → PARSED → RECONCILING → PROCESSED (ou ERROR).
5.3. Flux 1 : Consolidation des structures organisationnelles
La consolidation des structures (universités, UFR, départements, écoles) résout la hiérarchie par le code ou le sigle du parent.
Étapes du flux :
-
Import : section
structuresd’un payloadacademique. Chaque élément porte un code, un libellé, un sigle, un type de structure et le code ou le sigle de la structure parente. -
Chargement
staging(mdm.ingest_academique) : libellé normalisé ; un élément sans libellé valide est écarté ; un élément dont le code existe déjà enstagingpour la même source, ou dont le libellé est similaire (pg_trgm, seuil 0,85) à une structure déjà enstagingpour la même source ou présente engolden, est comptématchedet n’est pas inséré. Insertion dansstaging.structure_organisationnelle. -
Rapprochement (
mdm.reconcile_structure_organisationnelle, par déclencheur) : résolution du type de structure par code ou libellé dansreference.type_structure; résolution du parent par code ou sigle dansgolden.structure_organisationnelle; recherche de la structure existante par code, sigle ou libellé (insensible à la casse). -
Chargement : si absente, insertion dans
golden.structure_organisationnelle(statutACTIF) ; si présente, seule la structure parente est renseignée lorsqu’elle manquait. Les autres attributs d’une structure existante ne sont pas modifiés par l’import.
5.4. Flux 2 : Consolidation des enseignants
La déduplication des enseignants est critique : un même enseignant peut apparaître dans plusieurs sources avec des variations orthographiques du nom, et certaines sources ne fournissent pas de matricule définitif.
Étapes du flux :
-
Extraction : section
enseignantsd’un payloadpersonnes. Chaque élément porte identité, naissance, nationalité, contacts, adresses, grade, statut, corps, et les sectionsaffectations(rôles) etfonctions. -
Chargement
staging(mdm.ingest_personnes) : matricule et nom obligatoires ; noms et libellés normalisés ; grade et corps résolus par code, sinon par similarité de libellé (mdm.fuzzy_match_grade,mdm.fuzzy_match_corps) ; statut résolu par code ou libellé exact. Un élément dont le matricule ou le NPI existe déjà (enstagingpour la même source, ou engolden), ou dont le nom complet est similaire à 0,90 ou plus à une personne connue, est comptématchedet n’est pas inséré. Insertion dansstaging.personne_physique(avec le JSON brut dansraw_data), puis dansstaging.adresse_postale,staging.coordonnees_contact,staging.affectation_role_personneetstaging.affectation_fonction_personnepour les sections correspondantes. -
Rapprochement (
mdm.reconcile_personne, par déclencheur) :-
si un
corps_codeest fourni, il doit exister dansreference.corps(code ou libellé), sinon la ligne est rejetée avec la liste des corps disponibles ; -
recherche par matricule exact dans
golden.personne_physique; -
pour un matricule provisoire (
PROV-*), recherche par clé de nom normalisée (mdm.person_name_key: minuscules, sans accents, lettres seules, mots triés) ; un seul homonyme vivant est rapproché ; plusieurs homonymes sont départagés par l’établissement des affectations (libellés des structures et de leurs ancêtres) ; sans départage, la ligne est rejetée avec un message de doublon potentiel ; la colonneforce_createpermet au correcteur d’imposer la création.
-
-
Chargement : si absente, insertion dans
golden.personne_physique(statutACTIF, valeurs par défaut pour sexe, nationalité, échelon et catégorie non fournis) ; si présente, mise à jour champ par champ : chaque champ prend la valeur reçue si elle est non vide, et conserve sinon la valeur en place. Les spécialités listées dansraw_datasont liées à la personne. Le matricule effectif est celui de la fiche rapprochée. -
Provenance : pour chaque champ non vide reçu,
mdm.field_provenanceenregistre la source et la date du dernier apport (score constant par champ). -
Entités liées (phase RECONCILE) :
mdm.reconcile_all_adresses_postalesetmdm.reconcile_all_coordonnees_contactstraitent les lignes restantes ; les affectations relèvent du Flux 5.
5.5. Flux 3 : Consolidation des étudiants
Similaire aux enseignants, avec la gestion des doubles cursus et des réorientations (même étudiant inscrit dans plusieurs formations ou universités successivement). Les étudiants sont rattachés au modèle golden par le rôle ETUDIANT de AFFECTATION_ROLE_PERSONNE.
Particularités :
-
Déduplication inter-universités : détection d’un étudiant ayant changé d’établissement (réorientation)
-
Déduplication intra-université : détection d’un double cursus (même étudiant dans deux formations simultanément)
-
Fusion dans la même
PERSONNE_PHYSIQUE, distinction parAFFECTATION_ROLE_PERSONNE(rôleETUDIANT)
5.6. Flux 4 : Consolidation des programmes de formation
Les maquettes pédagogiques arrivent dans un payload academique dont les sections formations, programmes, unitesEnseignement et elementsConstitutifs sont traitées dans cet ordre ; chaque UE référence sa formation et chaque EC référence sa formation et son UE.
Étapes du flux :
-
Extraction : payload
academique(API, ou dépôt Excel UE/EC converti par le service). Le service normalise les codes d’UE (lettres et chiffres, majuscules) sauf pour les lignesaction=DELETE. -
Chargement
staging(mdm.ingest_academique) :-
Formations : intitulé obligatoire ; un intitulé identique en
stagingpour la même source, ou similaire (0,85) à une formation déjà enstagingpour la même source ou présente engolden, est comptématched; sinon insertion dansstaging.formation. -
Programmes (offre de formation) : formation et année académique obligatoires ; insertion dans
staging.programme_formationsans déduplication. -
UE : avec un code, insertion directe dans
staging.unite_enseignement; sans code, déduplication par intitulé similaire (0,85) bornée à la formation. L’année académique de l’offre visée est conservée si fournie. -
EC : même règle que les UE (déduplication par intitulé uniquement en l’absence de code), insertion dans
staging.element_constitutif.
-
-
Rapprochement des formations (
mdm.reconcile_formation, par déclencheur) : type de diplôme résolu par libellé ; formation existante recherchée par code ou intitulé ; insertion si absente ; si présente, aucun attribut de la fiche existante n’est modifié par l’import. -
Rapprochement de l’offre (
mdm.reconcile_programme_formation, phase RECONCILE) : formation et année académique résolues par code ou libellé, sinon rejet ; clé d’unicité (formation, année) sur les offres vivantes ; l’actionVERSIONNERouvre une nouvelle période de validité de la maquette à partir de l’année cible (mdm.reconduire_offre), avec refus explicite si l’année précédente n’est pas couverte ou si la maquette commence déjà à l’année demandée. -
Rapprochement des UE (
mdm.reconcile_unite_enseignement, par déclencheur) : formation résolue par code ou intitulé, sinon rejet ; semestre résolu par libellé sur le modèle en vigueur, avec décomposition des libellés hérités (« S5 Licence ») en numéro et niveau ; clé (formation, code) sur les lignes vivantes ;action=DELETEeffectue une suppression logique, refusée si l’UE possède encore des EC actifs ; l’action effectivement appliquée est mémorisée dansreconcile_action. Après écriture, l’UE est rattachée à l’offre de l’année indiquée, ou de l’année en cours à défaut (mdm.rattacher_ue_a_l_offre) ; un rattachement impossible n’empêche pas l’écriture de l’UE. -
Rapprochement des EC (
mdm.reconcile_element_constitutif, par déclencheur) : UE résolue par code puis par libellé, dans la formation, sur les lignes vivantes, sinon rejet ; clé (UE, code) ;action=DELETErefusée si des planifications actives référencent l’EC ; natures de support et modalités d’évaluation remplacées intégralement ; rattachement à l’offre comme pour l’UE. Le total des crédits de la formation est recalculé par déclencheur surgolden.unite_enseignement.
5.7. Flux 5 : Consolidation des affectations
Les affectations lient une personne, un rôle métier ou une fonction, et une structure, avec temporalité. Elles arrivent dans les sections affectations et fonctions de chaque enseignant du payload personnes et sont traitées en phase RECONCILE, après les personnes.
Étapes du flux :
-
Extraction : pour chaque enseignant, rôles (
affectations: métier, structure, dates) et fonctions (fonctions: fonction, structure, dates, acte de nomination). -
Chargement
staging(mdm.ingest_personnes) : insertion dansstaging.affectation_role_personneetstaging.affectation_fonction_personneavec le matricule, le nom et les prénoms de la personne, et le code ou le libellé de la structure, du métier ou de la fonction. -
Résolution des références (
mdm.reconcile_affectation_role,mdm.reconcile_affectation_fonction, lots sans déclencheur) :-
personne par matricule dans
golden.personne_physique; pour les fonctions, à défaut, par similarité du nom complet (0,90) ; -
structure par code, par libellé exact ou par sigle, sur les structures vivantes ; plusieurs structures homonymes (même sigle dans des universités différentes) entraînent le rejet de la ligne avec la liste des candidats ;
-
métier par code ou libellé dans
reference.role_metier; fonction par code, libellé ou similarité (0,8) dansreference.fonction.
-
-
Chargement : affectation existante recherchée par (personne, structure, métier ou fonction) sur les lignes vivantes ; mise à jour des dates et du statut si présente, insertion sinon.
-
Erreurs : une référence non résolue laisse la ligne en
ERRORavec le motif (« Structure "X" non trouvée », « Métier/rôle "X" non trouvé », candidats homonymes). Ces lignes restent enstagingjusqu’à correction et relance.
5.8. Flux 6 : Consolidation des inscriptions étudiants
Les inscriptions sont modélisées comme des affectations du rôle ETUDIANT, avec un périmètre formation et année académique.
Particularités :
-
Une inscription est une affectation temporaire du rôle
ETUDIANT -
structure_idporte la structure responsable de la formation (UFR, École) -
date_debutetdate_finbornent la période de l’année académique -
Deux affectations
ETUDIANTsimultanées sur des formations différentes permettent le double cursus -
La succession des affectations
ETUDIANTdonne la traçabilité du parcours
5.9. Flux 7 : Planification des cours
La planification affecte un enseignant à un élément constitutif pour une année académique, avec des créneaux.
Étapes du flux :
-
Extraction : section
planificationsd’un payloadacademique, déposée parPOST /api/v1/bulk/planificationou par le dépôt Excel correspondant, après contrôle du périmètre du déposant (formations de son UFR). -
Chargement
staging(mdm.ingest_planifications) : insertion dansstaging.planification_coursavec formation, EC, enseignant (NPI, matricule, nom), année académique et créneaux. -
Rapprochement (
mdm.reconcile_planification_cours, par déclencheur) : formation par code ou intitulé ; EC par code puis par libellé dans la formation, sur les EC vivants ; enseignant par NPI, par matricule, puis par nom complet exact lorsqu’il désigne une seule personne ; année académique par code ou libellé. Toute référence non résolue ou ambiguë rejette la ligne avec le motif. -
Chargement : planification existante recherchée par (EC, année) ; insertion ou mise à jour dans
golden.planification_cours, rattachée à l’offre de l’année lorsqu’elle existe ; les créneaux saisis manuellement sont remplacés intégralement, les créneaux générés sont conservés. Un créneau en chevauchement est ignoré et signalé danserror_messagesans rejeter la ligne.
5.10. Orchestration globale
Ordre d’exécution : l’ordre est fixé par mdm.process_import selon le type d’import. Les entités à déclencheur actif sont rapprochées dès leur insertion en staging, dans l’ordre des sections du payload ; les autres le sont en phase RECONCILE.
Entités et mode de rapprochement :
Entité staging |
Déclencheur AFTER INSERT |
Lot en phase RECONCILE |
|---|---|---|
personne_physique, adresse_postale, coordonnees_contact |
Oui ( |
Oui, lignes restantes |
structure_organisationnelle, type_structure, formation, unite_enseignement, element_constitutif |
Oui |
Oui, lignes restantes |
grade_enseignant, statut_enseignant, domaine_reesao, specialite, nature_support_cours, type_diplome |
Oui |
Oui, lignes restantes (type_diplome : déclencheur seul) |
corps, mention |
Non |
Oui |
affectation_role_personne, affectation_fonction_personne |
Non |
Oui |
programme_formation, annee_academique |
Non ( |
Oui |
planification_cours |
Oui |
Non |
Les nomenclatures importées (corps, grades, statuts, domaines, mentions, spécialités, natures de support, types de structure, types de diplôme, années académiques) sont consolidées dans le schéma reference ; les autres entités le sont dans le schéma golden.
Fréquence d’exécution :
-
Imports : à la demande, par appel de l’API ; l’outil
bdes-migration(CronJob, voir DAT) soumet les personnes parPOST /api/v1/bulk/personnes -
Consolidation : synchrone à l’appel d’import, dans sa transaction
Gestion des erreurs :
| Niveau | Traitement | Trace |
|---|---|---|
Élément du payload |
L’élément n’est pas inséré en |
|
Ligne |
Rejet métier ( |
|
Lot d’une entité |
Compteurs |
|
Import |
Exception non rattrapée : transaction annulée, appel en erreur |
Journal applicatif du service |
Rapport |
|
Réponse HTTP ; |
Workflow de correction (/api/v1/staging/errors) :
-
Consultation : liste paginée des lignes
ERROR(filtres par entité, lot, source) et détail d’une ligne avec toutes ses colonnes. -
Correction : modification des colonnes de la ligne
staging(colonnes réelles de la table uniquement), avec auteur et note de correction. -
Relance :
staging.reset_for_retryremet la ligne enPENDING, puis la fonction unitairemdm.reconcile_<entité>est appelée pour cette ligne. -
Abandon : passage en
SKIPPED; la ligne n’est plus traitée.
6. Vue Déploiement
|
L’infrastructure Kubernetes et les composants transverses sont documentés dans le DAT - Architecture Physique. |
6.1. Vue déploiement bdes-referentiel
|
Le dimensionnement des pods et la configuration Kubernetes sont documentés dans le DAT - Architecture Physique. |
6.2. Composants déployés
| Composant | Rôle |
|---|---|
referentiel-api-ms |
API REST d’exposition des données référentielles via X-Road ; réception des imports en masse et appel du pipeline de consolidation dans PostgreSQL |
bdes-db-migration |
Job Kubernetes exécutant les migrations Flyway du schéma |
bdes-migration |
CronJob d’alimentation (outil Python) qui soumet les données transformées à l’API d’import ; voir DAT |
Aucun composant d’exécution n’est dédié au pipeline de consolidation : les transformations sont des fonctions de la base de données, exécutées par PostgreSQL lors de l’appel de l’API d’import.
6.3. Volumes persistants spécifiques
| Volume | Taille | Usage |
|---|---|---|
postgresql-data |
100 Gi |
Schémas REFERENCE, RAW, STAGING, MDM, GOLDEN, AUDIT |
6.4. Exposition
L’API referentiel-api-ms est exposée aux consommateurs externes — administrations et systèmes gouvernementaux — par X-Road Security Server. Les services de la plateforme l’appellent de service à service, avec un compte de service.
6.5. Stratégie de mise à jour
-
referentiel-api : Rolling update (maxUnavailable: 1)
-
Pipeline de consolidation : livraison par migration Flyway (
CREATE OR REPLACEdes fonctions,CREATE TABLE IF NOT EXISTS), appliquée par le Jobbdes-db-migrationavant la version du service qui en dépend ; scripts de retour arrière fournis au cas par cas (dossierrollback/du dépôt) -
PostgreSQL : Switchover primary/replica (downtime < 30s)
7. Décisions d’architecture
7.1. ADR-001 : Architecture ELT avec transformation PL/pgSQL en base
Contexte : Choix entre ETL externe (Spring Batch, Pentaho), ELT avec un outil de transformation dédié et ELT par fonctions de la base de données.
Décision : Adopter l’ELT avec transformation in-database par des fonctions PL/pgSQL (schéma mdm), livrées par les migrations Flyway et déclenchées par l’API d’import. Les deux autres options, ETL externe et outil de transformation dédié, sont écartées.
Justification :
-
PostgreSQL dispose de capacités de calcul suffisantes pour transformations in-database
-
La consolidation s’exécute dans la transaction de l’import : le client reçoit un rapport complet en réponse à son appel
-
Aucun composant d’exécution ni orchestrateur supplémentaire à exploiter
-
Versionning Git natif des transformations, dans le même dépôt que le schéma (
bdes-db-migration) -
Compétences SQL de l’équipe
Conséquences :
-
Pour : Import et consolidation atomiques (une transaction)
-
Pour : Transformations lisibles en SQL, livrées avec le schéma
-
Pour : Aucun composant à déployer en plus de PostgreSQL et du service
-
Contre : Compétences PL/pgSQL avancées requises
-
Contre : Chaque évolution redéfinit la fonction entière (
CREATE OR REPLACE) -
Contre : Durée de l’appel d’import proportionnelle au volume du lot
Statut : Accepté
7.2. ADR-002 : Architecture multi-schémas (REFERENCE, RAW, STAGING, MDM, GOLDEN, AUDIT)
Contexte : Organisation logique de la base de données référentielle.
Décision : Adopter une architecture à 6 schémas séparés.
Justification :
-
REFERENCE : Nomenclatures (seed et imports
referentiel) -
RAW : Payloads d’import conservés intégralement (
raw.bulk_import) -
STAGING : Une table par entité importée, avec statut de traitement et colonnes de correction
-
MDM : Configuration des sources et des déclencheurs, fonctions du pipeline, journal, provenance
-
GOLDEN : Single Source of Truth, données consolidées
-
AUDIT : Historique des entités JPA (Hibernate Envers)
Conséquences :
-
Pour : Séparation préoccupations claire
-
Pour : Traçabilité (payload conservé, lignes
stagingconservées avec leur statut,mdm.reconciliation_log,mdm.field_provenance) -
Pour : Performance (GOLDEN optimisé lectures)
-
Contre : Complexité accrue (6 schémas vs 1)
-
Contre : Croissance continue de
rawetstaging
Statut : Accepté
7.3. ADR-003 : PostgreSQL
Contexte : Choix SGBD pour référentiel consolidé.
Décision : PostgreSQL 16.
Justification :
-
Données hautement structurées = modèle relationnel optimal
-
ACID requis pour intégrité référentielle
-
Support JSONB pour données semi-structurées (payloads
raw,raw_datades tablesstaging) -
Open-source sans licensing
-
Écosystème mature (
pg_trgmpour la similarité,unaccentpour la normalisation des noms, PL/pgSQL pour le pipeline)
Conséquences :
-
Pour : ACID garanti
-
Pour : Requêtes SQL complexes performantes
-
Pour : Compétences équipe existantes
Statut : Accepté
7.4. ADR-004 : Cache Redis
Contexte : Stratégie cache pour bdes-referentiel-api.
Décision : Utiliser Redis externe.
Justification :
-
Cache distribué partagé entre replicas API = cohérence cache
-
Données référentielles TTL long (24h) = hit rate élevé
-
Observabilité native (redis-exporter Prometheus)
Conséquences :
-
Pour : Cohérence cache multi-pods
-
Contre : Latence réseau Redis (+1-2ms)
-
Contre : Éviction explicite des caches de formations à chaque import académique (écritures hors Hibernate par le pipeline)
Statut : Accepté
8. Risques et Dettes techniques
8.1. Risques technologiques
| ID | Risque | Probabilité | Impact | Mitigation |
|---|---|---|---|---|
RISK-001 |
Déduplication fuzzy matching : Faux positifs |
Moyenne |
Moyen |
Clé de nom normalisée ( |
RISK-002 |
Qualité données sources SI Université |
Élevée |
Moyen |
Contrôles bloquants à l’ingestion (champs obligatoires, résolution des références), journal des éléments en défaut ( |
RISK-003 |
Volumétrie croissante PostgreSQL |
Moyenne |
Moyen |
Alertes Prometheus sur la taille de la base, métriques des requêtes lentes, partitionnement des tables historiques, politique de conservation des zones |
RISK-004 |
Indisponibilité sources SI Université |
Moyenne |
Faible |
Données GOLDEN restent accessibles (obsolètes mais disponibles), TTL cache API 24h. |
RISK-005 |
Dépendance X-Road |
Faible |
Élevé |
X-Road déployé en haute disponibilité (2 Security Servers). Les services de la plateforme ne sont pas affectés : ils appellent le référentiel de service à service. |
RISK-006 |
Compétences SQL avancées requises |
Moyenne |
Moyen |
Formation de l’équipe, transformations versionnées avec le schéma dans |
9. Dictionnaire des données
Ce dictionnaire décrit les tables structurantes du référentiel : le registre des personnes, les affectations qui leur donnent un rôle ou une fonction, l’organigramme des structures, l’offre de formation et ses maquettes, et les nomenclatures dont elles dépendent. Les nomenclatures de typage et les tables de liaison n’y figurent pas.
L’inventaire complet du modèle — cent tables, schéma par schéma, et les cinq fichiers DBML qui
en portent le détail colonne par colonne — figure à l’annexe
Inventaire du modèle de données. Le schéma lui-même est livré
par les migrations Flyway du dépôt bdes-db-migration, qui en est l’autorité. La zone d’atterrissage — schémas RAW et STAGING — est décrite
au chapitre « Contexte et périmètre ». L’historique des écritures est porté par Hibernate Envers,
dans le schéma AUDIT, et non par des tables d’historique dédiées. Toutes les tables ci-dessous
portent en outre le même socle de colonnes de gestion, qui n’est pas répété dans les tableaux :
created_at, updated_at, modified_at, modified_by, deleted_at (suppression logique),
version (verrou optimiste, bigint non nul, défaut 0), locked, ainsi que created_by
(jsonb non nul), last_updated_by et deleted_by (jsonb).
PAYS : Référentiel exhaustif des pays du monde selon la norme ISO 3166. Utilisé pour les nationalités, lieux de naissance, adresses et pièces d’identité, qui le référencent par le code ISO alpha-2.
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
code_iso2 |
varchar(2) |
UNIQUE, NOT NULL |
Code ISO 3166-1 alpha-2 (ex: BJ, FR) ; cible des clés étrangères |
code_iso3 |
varchar(3) |
UNIQUE, NOT NULL |
Code ISO 3166-1 alpha-3 (ex: BEN, FRA) |
libelle |
varchar(255) |
NOT NULL |
Nom officiel du pays (ex: Bénin, France) |
nationalite |
varchar(255) |
NOT NULL |
Gentilé (ex: Béninois, Français) |
actif |
boolean |
NOT NULL |
Indicateur d’activation |
DOMAINE_REESAO : Tête de la nomenclature REESAO des domaines d’études (ex: Sciences et Technologies, Sciences Juridiques, Politiques et Administratives). Elle se décline en mentions, puis en spécialités.
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
code |
varchar(255) |
UNIQUE, NOT NULL |
Code du domaine (ex: ST, SJPA, SEG) ; cible des clés étrangères |
libelle |
varchar(255) |
NOT NULL |
Intitulé du grand domaine |
niveau |
integer |
NOT NULL |
Niveau dans la nomenclature (1 pour le domaine) |
actif |
boolean |
NOT NULL |
Indicateur d’activation |
SPECIALITE : Niveau le plus fin de la nomenclature REESAO : chaque spécialité se rattache à une mention, elle-même rattachée à un domaine. Permet d’affiner la classification des formations selon le contexte béninois.
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
code |
varchar(255) |
UNIQUE, NOT NULL |
Code spécialité (ex: LLA_SPE_001) ; cible des clés étrangères |
libelle |
varchar(255) |
NOT NULL |
Intitulé de la spécialité |
mention_code |
varchar(255) |
FK vers |
Mention de rattachement |
actif |
boolean |
NOT NULL |
Indicateur d’activation |
TYPE_DIPLOME : Référentiel des types de diplômes délivrés (Licence, Master, Doctorat, CAPES, etc.).
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
code |
varchar(255) |
UNIQUE, NOT NULL |
Code type (ex: LICENCE, MASTER, DOCTORAT) ; cible des clés étrangères |
libelle |
varchar(255) |
NOT NULL |
Intitulé complet (ex: Licence, Master) |
sigle |
varchar(255) |
NOT NULL |
Abréviation (ex: LIC, MAS) |
actif |
boolean |
Indicateur d’activation |
NIVEAU_DIPLOME : Référentiel des niveaux de qualification, rattachés à un type de diplôme et positionnés dans les grilles LMD et RNCP.
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
code |
varchar(255) |
UNIQUE, NOT NULL |
Code niveau (ex: L1, L3, M2) ; cible des clés étrangères |
libelle |
varchar(255) |
NOT NULL |
Intitulé (ex: Licence 3) |
niveau_lmd |
integer |
NOT NULL |
Niveau dans le système LMD |
niveau_rncp |
integer |
NOT NULL |
Équivalence RNCP |
ordre |
integer |
Rang d’affichage dans la grille |
|
type_diplome_code |
varchar(255) |
FK vers |
Type de diplôme auquel le niveau appartient |
actif |
boolean |
NOT NULL |
Indicateur d’activation |
TYPE_STRUCTURE : Typologie des structures organisationnelles (Université, Faculté, École, Laboratoire, Chaire, etc.).
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
code |
varchar(255) |
UNIQUE, NOT NULL |
Code type (ex: UNIV, CHAI) ; cible des clés étrangères |
libelle |
varchar(255) |
NOT NULL |
Intitulé complet |
niveau_hierarchique |
integer |
NOT NULL |
Niveau indicatif attaché au type ; le niveau effectif d’une structure est calculé depuis |
actif |
boolean |
NOT NULL |
Indicateur d’activation |
STATUT_MATRIMONIAL : Liste des statuts matrimoniaux (Célibataire, Marié(e), Divorcé(e), Veuf/Veuve, etc.).
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
code |
varchar(255) |
UNIQUE, NOT NULL |
Code statut (ex: CELIBATAIRE, MARIE) ; cible des clés étrangères |
libelle |
varchar(255) |
NOT NULL |
Intitulé complet |
actif |
boolean |
NOT NULL |
Indicateur d’activation |
ANNEE_ACADEMIQUE : Référentiel des années académiques, période de référence des offres de formation et des planifications. Un index unique partiel garantit qu’au plus une année porte le statut EN_COURS.
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
code |
varchar(255) |
UNIQUE, NOT NULL |
Code année (ex: 2026-2027) ; cible des clés étrangères |
libelle |
varchar(255) |
NOT NULL |
Libellé complet |
date_debut |
timestamp(6) with time zone |
NOT NULL |
Début de l’année académique |
date_fin |
timestamp(6) with time zone |
NOT NULL |
Fin de l’année académique |
statut |
varchar(255) |
CHECK (EN_COURS, TERMINE, NON_DEMMARRE) |
Statut de l’année |
PERSONNE_PHYSIQUE : Table centrale du registre des personnes. Elle porte l’identité (nom de famille, prénoms, sexe, date et lieu de naissance), les identifiants pérennes (matricule, npi) et la situation administrative de l’agent (corps, grade, catégorie, classe, échelle, échelon). Le matricule est la clé de rattachement de toutes les tables satellites, qui le suivent par ON UPDATE CASCADE.
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
matricule |
varchar(255) |
UNIQUE, NOT NULL |
Matricule fonctionnel permanent ; cible des clés étrangères des tables satellites |
npi |
varchar(255) |
UNIQUE |
Numéro Personnel d’Identification national |
nom_famille |
varchar(255) |
NOT NULL |
Nom de famille |
nom_usage |
varchar(255) |
Nom d’usage (nom d’épouse notamment) |
|
prenoms |
varchar(255) |
NOT NULL |
Prénoms |
sexe |
varchar(255) |
NOT NULL |
Sexe |
civilite |
varchar(255) |
Civilité |
|
genre_code |
varchar(255) |
FK vers |
Genre |
date_naissance |
timestamp(6) with time zone |
Date de naissance |
|
ville_naissance |
varchar(255) |
Ville de naissance |
|
pays_naissance_code |
varchar(2) |
FK vers |
Pays de naissance |
nationalite_code |
varchar(2) |
FK vers |
Nationalité |
statut_matrimonial_code |
varchar(255) |
FK vers |
Situation matrimoniale |
adresse |
varchar(255) |
Adresse libre saisie sur la fiche |
|
statut |
varchar(255) |
CHECK (ACTIF, INACTIF), NOT NULL |
Validité de la fiche personne |
statut_code |
varchar(255) |
FK vers |
Statut d’enseignant |
corps_code |
varchar(20) |
FK vers |
Corps d’appartenance |
grade_code |
varchar(255) |
FK vers |
Grade |
categorie_code |
varchar(10) |
FK vers |
Catégorie |
classe_code |
varchar(20) |
FK vers |
Classe |
echelle_code |
varchar(255) |
FK vers |
Échelle |
echelon_code |
varchar(255) |
FK vers |
Échelon |
date_recrutement |
timestamp |
Date de recrutement |
|
photo_profil |
text |
Photo de profil |
|
kc_user_id |
varchar(255) |
UNIQUE si renseigné |
Identifiant du compte Keycloak lié à la fiche |
PIECE_IDENTITE : Pièces d’identité détenues par une personne. Une personne peut en détenir plusieurs (CNI, passeport, permis), chacune avec ses dates d’émission et d’expiration et son autorité émettrice.
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
personne_matricule |
varchar(255) |
FK vers |
Personne titulaire |
type_piece_code |
bigint |
FK vers |
Type de pièce |
numero |
varchar(255) |
UNIQUE, NOT NULL |
Numéro de la pièce |
date_emission |
timestamp(6) with time zone |
NOT NULL |
Date d’émission |
date_expiration |
timestamp(6) with time zone |
NOT NULL |
Date d’expiration |
autorite_emission |
varchar(255) |
NOT NULL |
Autorité émettrice |
pays_emission_code |
varchar(2) |
FK vers |
Pays d’émission |
COORDONNEES_CONTACT : Moyens de contact d’une personne (emails, téléphones). Gestion multi-contact avec indication du contact principal et bornes de validité.
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
personne_matricule |
varchar(255) |
FK vers |
Personne concernée |
type_contact_code |
varchar(255) |
FK vers |
Type de contact |
valeur |
varchar(255) |
NOT NULL |
Email, numéro de téléphone, etc. |
principal |
boolean |
NOT NULL |
Contact principal pour ce type |
date_debut_validite |
timestamp(6) with time zone |
Début de validité |
|
date_fin_validite |
timestamp(6) with time zone |
Fin de validité (NULL si actuel) |
ADRESSE_POSTALE : Adresses postales d’une personne avec bornes de validité. Support multi-adresses (domicile, administrative, professionnelle) et désignation de l’adresse principale.
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
personne_matricule |
varchar(255) |
FK vers |
Personne concernée |
type_adresse_code |
varchar(255) |
FK vers |
Type d’adresse |
numero_voie |
varchar(255) |
NOT NULL |
Numéro de voie |
nom_voie |
varchar(255) |
NOT NULL |
Nom de la rue ou de l’avenue |
complement |
varchar(255) |
Complément d’adresse |
|
code_postal |
varchar(255) |
NOT NULL |
Code postal |
ville |
varchar(255) |
NOT NULL |
Ville |
quartier |
varchar(255) |
NOT NULL |
Quartier ou arrondissement |
pays_code |
varchar(2) |
FK vers |
Pays |
principale |
boolean |
NOT NULL |
Adresse principale |
date_debut_validite |
timestamp(6) with time zone |
Début de validité |
|
date_fin_validite |
timestamp(6) with time zone |
Fin de validité |
LIEN_PERSONNE : Relations entre personnes (tuteur légal, contact d’urgence, conjoint, parent). Permet de modéliser le réseau relationnel avec sa temporalité. Les deux extrémités référencent le matricule.
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
personne_source_matricule |
varchar(255) |
FK vers |
Personne source de la relation |
personne_cible_matricule |
varchar(255) |
FK vers |
Personne cible de la relation |
type_lien_code |
varchar(255) |
FK vers |
Type de lien |
date_debut |
timestamp(6) with time zone |
NOT NULL |
Début de la relation |
date_fin |
timestamp(6) with time zone |
NOT NULL |
Fin de la relation |
ROLE_METIER : Référentiel des rôles métier dans l’enseignement supérieur. Un rôle représente une casquette fonctionnelle qu’une personne peut endosser (exemple : Enseignant, Étudiant, Chercheur, Personnel administratif, Recteur).
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
code |
varchar(255) |
UNIQUE, NOT NULL |
Code rôle (ex: ENSEIGNANT, ETUDIANT) ; cible des clés étrangères |
libelle |
varchar(255) |
NOT NULL |
Intitulé du rôle |
description |
text |
Description détaillée |
|
actif |
boolean |
NOT NULL |
Indicateur d’activation |
FONCTION : Référentiel des fonctions organisationnelles (postes de responsabilité). Une fonction représente un poste occupé dans l’organigramme (exemple : Recteur, Vice-Recteur, Directeur UFR, Chef de département).
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
code |
varchar(255) |
UNIQUE, NOT NULL |
Code fonction (ex: RECT, VR_AA) ; cible des clés étrangères |
libelle |
varchar(255) |
NOT NULL |
Intitulé de la fonction |
description |
text |
Description détaillée |
|
niveau_hierarchique |
integer |
NOT NULL |
Rang de la fonction dans l’organigramme |
actif |
boolean |
NOT NULL |
Indicateur d’activation |
AFFECTATION_ROLE_PERSONNE : Affectations des rôles aux personnes avec temporalité et périmètre structurel. Permet de tracer qui a quel rôle, où et quand. Exemple : Jean est Enseignant à la Faculté de Droit de 2020 à 2025, puis Recteur de l’UAC de 2025 à 2030.
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
personne_matricule |
varchar(255) |
FK vers |
Personne affectée |
metier_code |
varchar(255) |
FK vers |
Rôle métier affecté |
structure_code |
varchar(255) |
FK vers |
Structure de rattachement |
date_debut |
timestamp(6) with time zone |
Date de début d’affectation |
|
date_fin |
timestamp(6) with time zone |
Date de fin (NULL si en cours) |
|
statut |
varchar(255) |
CHECK (ACTIF, INACTIF), NOT NULL |
Statut de l’affectation |
date_affectation |
timestamp(6) with time zone |
Date administrative de l’affectation |
|
utilisateur_affectation |
varchar(255) |
Utilisateur ayant créé l’affectation |
AFFECTATION_FONCTION_PERSONNE : Affectations des fonctions organisationnelles aux personnes. Similaire aux affectations de rôle, mais avec traçabilité de l’acte de nomination officiel.
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
personne_matricule |
varchar(255) |
FK vers |
Personne nommée |
fonction_code |
varchar(255) |
FK vers |
Fonction exercée |
structure_code |
varchar(255) |
FK vers |
Structure d’exercice |
date_debut |
timestamp(6) with time zone |
Date de prise de fonction |
|
date_fin |
timestamp(6) with time zone |
Date de fin de fonction |
|
statut |
varchar(255) |
CHECK (ACTIF, INACTIF), NOT NULL |
Statut de la nomination |
date_nomination |
timestamp(6) with time zone |
Date officielle de nomination |
|
acte_nomination |
varchar(255) |
Référence de l’acte administratif |
STRUCTURE_ORGANISATIONNELLE : Table centrale de l’organigramme. Contient toutes les structures quel que soit leur niveau hiérarchique (Université, UFR, Département, Laboratoire, Chaire, etc.). La hiérarchie est matérialisée par l’auto-référence parent_id ; le niveau hiérarchique est calculé à la lecture par la vue golden.v_structure_organisationnelle.
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
code |
varchar(255) |
UNIQUE, NOT NULL |
Code unique structure (ex: UAC, UAC-FDSP) ; cible des clés étrangères |
libelle |
varchar(255) |
NOT NULL |
Nom complet de la structure |
sigle |
varchar(255) |
NOT NULL |
Sigle ou acronyme (ex: UAC, FDSP) |
parent_id |
bigint |
FK vers |
Structure parente directe (NULL pour un établissement autonome) |
type_structure_code |
varchar(255) |
FK vers |
Type de structure |
nature_structure_code |
varchar(10) |
FK vers |
Nature de la structure (public, privé, etc.) |
date_creation |
timestamp(6) with time zone |
Date de création administrative |
|
date_fermeture |
timestamp(6) with time zone |
Date de fermeture (si applicable) |
|
statut |
varchar(255) |
CHECK (ACTIF, INACTIF), NOT NULL |
Statut de la structure |
adresse |
varchar(255) |
NOT NULL |
Adresse de la structure |
telephone |
varchar(255) |
NOT NULL |
Numéro de téléphone |
varchar(255) |
NOT NULL |
Email institutionnel |
PERIODE_VALIDITE_STRUCTURE : Suivi des périodes d’activité des structures (ouverture, fermeture, réouverture). Permet de tracer l’évolution du paysage institutionnel.
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
structure_code |
varchar(255) |
FK vers |
Structure concernée |
date_ouverture |
timestamp(6) with time zone |
NOT NULL |
Date d’ouverture |
date_fermeture |
timestamp(6) with time zone |
NOT NULL |
Date de fermeture |
motif_fermeture |
varchar(255) |
Raison de la fermeture |
|
statut |
varchar(255) |
CHECK (ACTIF, INACTIF), NOT NULL |
Statut de la période |
DIPLOME : Référentiel des diplômes officiels délivrés par l’enseignement supérieur. Représente le titre obtenu à l’issue d’un cursus (Licence ès Lettres, Master en Droit, Doctorat en Sciences, etc.).
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
type_diplome_code |
varchar(255) |
FK vers |
Type (Licence, Master, etc.) |
niveau_diplome_code |
varchar(255) |
FK vers |
Niveau de qualification |
intitule |
varchar(255) |
NOT NULL |
Intitulé complet du diplôme |
domaine_code |
varchar(255) |
FK vers |
Domaine REESAO |
grade |
varchar(255) |
NOT NULL |
Grade universitaire |
statut |
varchar(255) |
CHECK (ACTIF, INACTIF), NOT NULL |
Statut du diplôme |
FORMATION : Cursus de formation complet menant à un diplôme. Une formation est un objet permanent (ex : Licence en Droit) dont les déclinaisons datées sont portées par les PROGRAMME_FORMATION.
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
code |
varchar(255) |
UNIQUE, NOT NULL |
Code formation ; cible des clés étrangères |
intitule |
varchar(255) |
NOT NULL |
Intitulé complet |
type_diplome_code |
varchar(255) |
FK vers |
Type de diplôme visé |
niveau_diplome_code |
varchar(255) |
FK vers |
Niveau de qualification |
finalite_code |
varchar(3) |
FK vers |
Finalité du diplôme |
voie_code |
varchar(1) |
FK vers |
Voie de formation |
habilitation_id |
bigint |
FK vers |
Habilitation dont relève la formation |
duree_annees |
integer |
NOT NULL |
Durée nominale en années |
credits_totaux |
integer |
NOT NULL |
Total de crédits requis |
date_creation |
timestamp(6) with time zone |
NOT NULL |
Date de création de la formation |
statut |
varchar(255) |
CHECK (ACTIF, INACTIF), NOT NULL |
Statut de la formation |
decoupage |
varchar(30) |
Découpage de l’année (SEMESTRIEL, ANNUEL, etc.) |
PROGRAMME_FORMATION : Offre de formation : déclinaison d’une formation sur une plage d’années académiques, sous la responsabilité d’une structure. Une contrainte d’exclusion interdit à deux offres non supprimées de la même formation de se chevaucher dans le temps.
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
formation_code |
varchar(255) |
FK vers |
Formation déclinée |
annee_academique_code |
varchar(255) |
FK vers |
Année académique de l’offre |
annee_debut_code |
varchar(255) |
FK vers |
Première année de validité |
annee_fin_code |
varchar(255) |
FK vers |
Dernière année de validité (NULL si ouverte) |
periode_validite |
tstzrange |
EXCLUDE (formation_code, periode_validite) si non supprimée |
Intervalle de validité calculé depuis les années de début et de fin |
date_approbation |
timestamp(6) with time zone |
NOT NULL |
Date d’approbation officielle |
structure_responsable_code |
varchar(255) |
FK vers |
Structure responsable |
statut |
varchar(255) |
CHECK (ACTIF, INACTIF), NOT NULL |
Statut de l’offre |
PARCOURS : Spécialisations au sein d’une formation. Permet de modéliser les parcours différenciés (ex : dans Master Informatique, parcours Big Data ou parcours Cybersécurité).
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
formation_code |
varchar(255) |
FK vers |
Formation d’appartenance |
code |
varchar(255) |
UNIQUE, NOT NULL |
Code parcours ; cible des clés étrangères |
intitule |
varchar(255) |
NOT NULL |
Intitulé du parcours |
description |
text |
Description détaillée |
|
credits_requis |
integer |
NOT NULL |
Crédits spécifiques au parcours |
UNITE_ENSEIGNEMENT : Unité d’Enseignement (UE) = regroupement cohérent de cours. Chaque UE est rattachée à une formation, éventuellement à un parcours, et positionnée dans la maquette par la période désignée par semestre_id. Le couple (formation, code) est unique parmi les UE non supprimées.
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
code |
varchar(255) |
NOT NULL, unique avec |
Code UE ; cible des clés étrangères |
intitule |
varchar(255) |
NOT NULL |
Intitulé de l’UE |
description |
text |
Description de l’UE |
|
formation_code |
varchar(255) |
FK vers |
Formation d’appartenance |
parcours_code |
varchar(255) |
FK vers |
Parcours d’appartenance (optionnel) |
semestre_id |
bigint |
FK vers |
Période de positionnement dans la maquette |
niveau_id |
bigint |
FK vers |
Niveau de positionnement |
credits |
integer |
NOT NULL |
Crédits de l’UE |
coefficient |
float4 |
NOT NULL |
Coefficient pour le calcul des moyennes |
type_ue |
varchar(255) |
NOT NULL |
Code de la taxonomie pédagogique (fondamentale, méthodologie, etc.) |
obligatoire |
boolean |
NOT NULL |
UE obligatoire ou optionnelle |
ELEMENT_CONSTITUTIF : Élément Constitutif (EC) = cours individuel au sein d’une UE. C’est le niveau atomique de la maquette pédagogique. Chaque EC définit ses volumes horaires (CM = Cours Magistral, TD = Travaux Dirigés, TP = Travaux Pratiques, TPE = Travail Personnel de l’Étudiant). Le couple (UE, code) est unique parmi les EC non supprimés.
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
code |
varchar(255) |
NOT NULL, unique avec |
Code EC ; cible des clés étrangères |
intitule |
varchar(255) |
NOT NULL |
Intitulé du cours |
ue_id |
bigint |
FK vers |
UE parente |
ue_code |
varchar(255) |
NOT NULL |
Code de l’UE parente, conservé dénormalisé |
credits |
integer |
NOT NULL |
Crédits de l’EC |
volume_horaire_cm |
integer |
NOT NULL |
Volume CM en heures |
volume_horaire_td |
integer |
NOT NULL |
Volume TD en heures |
volume_horaire_tp |
integer |
NOT NULL |
Volume TP en heures |
volume_horaire_tpe |
integer |
NOT NULL |
Volume TPE en heures |
PREREQUIS_FORMATION : Conditions d’accès attachées à une formation. Chaque ligne porte un type de prérequis et son caractère strict ou souple pour la formation désignée.
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
id |
bigint |
PK, généré |
Clé primaire technique |
unique_id |
uuid |
UNIQUE, NOT NULL |
Identifiant externe stable |
formation_code |
varchar(255) |
FK vers |
Formation dont l’accès est conditionné |
type_prerequis |
varchar(255) |
NOT NULL |
Type de prérequis |
obligatoire |
boolean |
NOT NULL |
Prérequis strict ou souple |
10. Annexe : inventaire du modèle de données
Le dictionnaire des données décrit les tables structurantes du référentiel. La présente annexe en donne l’inventaire complet, schéma par schéma : cent tables pour les données et leur consolidation, auxquelles s’ajoute l’historique des écritures.
Chaque schéma a son objet. REFERENCE porte les nomenclatures, RAW et STAGING la zone
d’atterrissage des données reçues, MDM la configuration du pipeline et ses journaux, GOLDEN
les données consolidées, et AUDIT l’historique de leurs écritures. Les schémas de structure
figurent au chapitre « Contexte et périmètre », et le fonctionnement du pipeline au chapitre
« Vue d’exécution ».
10.1. Schéma GOLDEN : les données consolidées
Vingt-sept tables, groupées par domaine.
10.1.1. Personnes
| Table | Objet |
|---|---|
|
Fiche d’une personne : identité, état civil, situation administrative. Clé de rattachement : le matricule |
|
Spécialités d’une personne, vers la nomenclature des spécialités |
|
Pièces d’identité détenues, avec leurs dates de validité |
|
Adresses d’une personne, dont une principale |
|
Courriels et numéros de téléphone, dont un principal |
|
Relations entre personnes : tuteur, contact d’urgence, conjoint |
10.1.2. Structures et affectations
| Table | Objet |
|---|---|
|
Organigramme complet. Le rattachement est un parent unique ; le niveau hiérarchique est calculé par la vue |
|
Périodes d’ouverture et de fermeture d’une structure |
|
Affectation d’un rôle métier à une personne, dans une structure, sur une période |
|
Affectation d’une fonction organisationnelle, avec son acte de nomination |
|
Habilitation d’une structure à délivrer une spécialité : numéro, organisme, échéance |
10.1.3. Formations, maquettes et planification
| Table | Objet |
|---|---|
|
Diplôme délivré, rattaché à un type, un niveau et un domaine |
|
Formation, objet permanent : code, intitulé, niveau, durée, crédits |
|
Conditions d’accès attachées à une formation |
|
Parcours au sein d’une formation |
|
Typologie des parcours |
|
Spécialités rattachées à un diplôme |
|
Offre de formation : la formation déclinée sur une plage d’années, sans chevauchement |
|
Rattachement d’une unité d’enseignement à une offre |
|
Rattachement d’un élément constitutif à une unité de l’offre |
|
Unité d’enseignement : semestre, crédits, coefficient, type |
|
Élément constitutif d’une unité : crédits et volumes horaires CM, TD, TP, TPE |
|
Modalités d’évaluation d’un élément constitutif |
|
Natures de support de cours d’un élément constitutif |
|
Enseignement planifié : un élément constitutif, un enseignant, une année |
|
Créneau récurrent servant de modèle à la génération |
|
Créneau d’enseignement, généré depuis un modèle ou saisi |
10.2. Schéma REFERENCE : les nomenclatures
Trente-neuf tables. Les données consolidées s’y réfèrent par le code de la nomenclature, et
par code_iso2 pour les pays.
| Famille | Tables |
|---|---|
Géographie |
|
Identité des personnes |
|
Carrière |
|
Rôles et fonctions |
|
Structures |
|
Diplômes |
|
Taxonomie REESAO |
|
Pédagogie |
|
Calendrier |
|
10.3. Schémas RAW et STAGING : la zone d’atterrissage
Le schéma RAW porte deux tables : bulk_import, où le payload reçu est conservé
intégralement avec le statut du lot, et bulk_data.
Le schéma STAGING porte vingt-six tables, une par entité importée. Chaque ligne y reçoit son
statut de traitement — PENDING, PROCESSING, PROCESSED, ERROR ou SKIPPED — son motif de
rejet le cas échéant, et le bloc de correction humaine qui permet de la reprendre.
personne_physique |
adresse_postale |
coordonnees_contact |
structure_organisationnelle |
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10.4. Schéma MDM : la configuration du pipeline et ses journaux
| Table | Objet |
|---|---|
|
Sources autoritaires déclarées, avec leur niveau de confiance |
|
Entités dont le rapprochement se déclenche à l’insertion |
|
Journal des lots traités, par phase et par entité |
|
Éléments en défaut à l’ingestion, avec leur motif et leur contenu reçu |
|
Source et date du dernier apport, champ par champ, pour les personnes |
|
Historique des valeurs d’un champ |
10.5. Schéma AUDIT : l’historique des écritures
L’historique est tenu par Hibernate Envers. Chaque entité auditée porte sa table
audit.<entité>_aud, qui reçoit une ligne par révision, et audit.revinfo horodate les
révisions. Soixante-six tables d’audit couvrent ainsi les schémas golden et reference.
10.6. Source du modèle
Le modèle est décrit, table par table et colonne par colonne, par cinq fichiers au format DBML,
versionnés avec la documentation dans src/docs/dbml/ :
| Fichier | Tables | Contenu |
|---|---|---|
|
6 |
Le registre des personnes et leurs rattachements |
|
5 |
L’organigramme et les affectations |
|
16 |
L’offre de formation, les maquettes et la planification |
|
39 |
Les nomenclatures du schéma |
|
34 |
Les schémas |
Ces fichiers portent les types, les contraintes et les clés étrangères. Ils se lisent tels quels et se rendent en diagramme par un outil acceptant le format DBML. Les colonnes de gestion communes à presque toutes les tables — identifiant externe, verrou optimiste, dates et auteurs de création, de modification et de suppression — y sont dites une fois, en tête de chaque fichier, plutôt que répétées sur chaque table.
Le schéma lui-même est livré par les migrations Flyway du dépôt bdes-db-migration, qui en est
l’autorité : toute évolution y est tracée et rejouable.
11. Glossaire
|
Le glossaire commun de la plateforme BDES est documenté dans le DAT - Glossaire. |