Aller au contenu

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.

Schéma du domaine catalogue : domaines, sous-thématiques, produits, composition, contenus
  • 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.
Schéma du domaine droits d'accès : comptes, droits, appareils, progression
  • 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.
  • devices et personal_access_tokens : un appareil, un jeton.
  • access_rights : le droit d’accès, à la granularité produit, avec son origine. Le dossier distingue DROIT_ACCES et DROIT_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).

  • settings : un réglage par ligne, typé, avec son onglet, son libellé et son aide ; la valeur est en jsonb pour qu’un entier reste un entier. Le jeu complet est en cache, invalidé à chaque écriture.
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