Modèle de données
La base est PostgreSQL 16. Le schéma s’appuie sur ce qu’elle sait faire : horodatages avec fuseau, contraintes CHECK sur les valeurs métier, index partiels, jsonb pour les réglages. Les règles vivent dans la base, pas seulement dans le code. La référence colonne par colonne est dans Référence des tables.
Domaine catalogue
Section intitulée « Domaine catalogue »
themes→sub_themes: la taxonomie à deux niveaux.products: tout ce qui se vend, avec son type, son domaine, sa sous-thématique facultative, son prix et sa fenêtre promotionnelle.product_compose: l’arbre réflexif parent → enfant, ordonné. Un enfant peut avoir plusieurs parents ; la base refuse l’auto-référence, le code refuse les boucles indirectes.product_contents: les segments d’un produit, ordonnés, avec leur clé de stockage privée et le marquage d’extrait gratuit.product_prerequisites: un produit en exige un autre, avec une règle. Distinct de la composition.
Domaine comptes et droits
Section intitulée « Domaine comptes et droits »
users: apprenants et administrateurs ; e-mail ou téléphone ; rôle, état, langue.otp_challenges: les codes de connexion en attente, hachés, avec expiration et compteur de tentatives.devicesetpersonal_access_tokens: un appareil, un jeton.access_rights: le droit d’accès, à la granularité produit, avec son origine. Le dossier distingueDROIT_ACCESetDROIT_ACCES_SOURCE; la plateforme les tient aujourd’hui en une table, une ligne par origine — la séparation viendra avec les commandes et les remboursements.
Ce qui figure sur le schéma et n’est pas encore en base : la progression (lot L5), les commandes et le panier (lot L7), les abonnements (selon ADR-0004), les certificats (lot L14).
Domaine réglages
Section intitulée « Domaine réglages »settings: un réglage par ligne, typé, avec son onglet, son libellé et son aide ; la valeur est enjsonbpour qu’un entier reste un entier. Le jeu complet est en cache, invalidé à chaque écriture.
Conventions
Section intitulée « Conventions »| Sujet | Convention |
|---|---|
| Clés | entiers auto-incrémentés ; identifiants d’URL (slug) uniques pour ce qui a une page |
| Contenu | colonnes suffixées _ar ; pas de traduction du contenu en base |
| Montants | entiers en centimes, devise ISO 4217 à côté |
| Dates | timestamptz ; promo_starts_at / promo_ends_at, granted_at / expires_at / revoked_at |
| Valeurs métier | contraintes CHECK nommées {table}_{colonne}_allowed |
| Suppression | en cascade pour ce qui appartient à un produit ou à un compte ; mise à vide pour les références facultatives |