07 — Schéma de données révisé¶
Comment faire évoluer le schéma Supabase actuel (migrations
0001-0004) pour porter l'analyse et la refonte (docs 02-06). Proposition de design, pas des migrations prêtes à coder — à affiner avant implémentation.⚠️ Révisé par le doc 08. Aligner
blocssur le schéma réel deblocs.jsonl(theme/titre/niveau/texte/mots/annee/resultat/agence/sourceId/ sourceLien) et séparer corpus RAG vs bibliothèque canonique ; ajoutercadres/rubriques_cadre(avec points) comme pilote de l'éditeur ; rétrograderstatut_mappingen surcharge (la reconnaissance par motifs couvre les 12 agences) ; traiter les références en records structurés, pas en blocs de prose. Voir doc 08 §6.
1. Ce que le schéma actuel couvre déjà (et qu'on garde)¶
agences, users, statut_mapping, appels_offres, documents,
corpus_chunks (pgvector 512 + HNSW), assets_visuels, memoires,
memoire_sections, projets_scores, app_config, RPC match_corpus_chunks,
RLS par agence. → bon socle. Les évolutions ci-dessous étendent ce socle.
2. Étendre appels_offres — porter la qualification (doc 05 §2.1)¶
Ajouts (extraits du DCE par Gemini) :
reference_affaire text -- clé [Lettre][AA][NNN], régularité forte (doc 01 §4)
type_prestation text[] -- tags métier (élagage, débroussaillage, sylvicole…)
nature_marche text -- forfait | accord_cadre | accord_cadre_pluriannuel
type_procedure text -- mapa | ao_ouvert | …
montant_estime_ht numeric -- (déjà montant_estime ; préciser HT)
montant_estime_ttc numeric
nb_lots int
duree_mois int
date_limite_remise date -- (déjà présent)
validite_offre_j int
emetteur_type text -- collectivite | etablissement_public | grand_compte
cadre_impose boolean -- cadré (true) vs libre (false)
ponderations jsonb -- {prix: 40, technique: 60, delais: 0} (⚠ ex RC)
extraction_status text -- pending | extracted | validated
extraction_meta jsonb -- confiance, modèle, date
3. Nouvelle table criteres_ao — la grille de notation (doc 03 §4)¶
Pilote le mapping critère → section du mémoire.
criteres_ao(
id, ao_id → appels_offres,
intitule text, -- « Valeur technique », « Prix », « Délais »…
ponderation numeric, -- % ou points
sous_criteres jsonb, -- détail si le RC en donne
ordre int
)
4. Enrichir memoires / memoire_sections — l'éditeur (doc 06 §5)¶
memoires : ajouter mode (libre | cadre), limite_pages int,
trame_source (réf. du template/mémoire similaire), statut
(brouillon|en_relecture|depose).
memoire_sections : refléter les 3 types de sections.
memoire_sections(
... (existant : id, memoire_id, ordre, titre, contenu, genere_par, valide)
type_section text, -- fige | parametree | selection
critere_id → criteres_ao, -- rattachement à un critère du RC (nullable)
bloc_id → blocs, -- si figée : quel bloc/version inséré
statut text, -- a_faire | genere | valide
source_generation jsonb, -- réf. similaire, contraintes, prompt, tokens
assets jsonb -- visuels/annexes rattachés
)
5. Nouvelles tables — la bibliothèque (Module C, docs 04 §2, 06 §7)¶
Source unique de vérité du corpus réutilisable — c'est le quick win.
blocs( -- blocs figés + trames réutilisables
id, agence_id (null = groupe),
titre, type text, -- fige | trame | asset
verticale text, -- toutes | sncf | dreal | collectivite | …
frequence_maj text, -- stable | annuel | quotidien
externe_url text, -- ex. portail Attestations Légales (doc 04 §2.C)
contenu text, -- pour les blocs texte
embedding vector(512) -- pour retrouver le bon bloc
)
blocs_versions( -- versionnement daté (fin des désynchros)
id, bloc_id → blocs, version text, contenu text,
publie_le date, publie_par → users, actif boolean
)
references_clients( -- base de références taggée (doc 04 §2.B)
id, agence_id,
maitre_ouvrage text, contact text, objet text,
montant_ht numeric, annee int,
type_prestation text[], -- pour filtrer par pertinence
ao_source_id → appels_offres -- alimentée par les affaires gagnées
)
materiel( -- parc matériel / fiches engins (doc 03 §5)
id, designation, categorie text,
photo_url text, fiche_technique_url text,
rendement text, quantite_groupe int, quantite_agence int
)
moyens_humains( -- table maître RH filtrable (doc 03 §2 §8)
id, agence_id, nom, poste,
diplomes text[], caces text[], habilitations text[]
)
6. Contraintes / solutions taggées (doc 03 §3)¶
Générateur « contrainte → réponse type ». Peut vivre comme un bloc de type
parametree OU une table dédiée si on veut un moteur fin :
contraintes_solutions(
id, tag text, -- urbain | rural | cours_eau | route | site_classe…
contrainte text, -- formulation de la contrainte
reponse_type text, -- engagement Serpe associé
embedding vector(512)
)
7. Qualification agrégée (doc 05 §2.3) & scoring de similarité¶
- Les stats agrégées (répartition, taux, montants) se calculent en vues SQL
sur
appels_offres— pas de table dédiée nécessaire. projets_scores(déjà présent) porte le scoring de similarité entre un nouvel AO et les affaires de référence (RAG) — précisercriteresavec les axes de similarité du doc 05 §1 :{type_prestation, montant, zone, acheteur}.
8. Ingestion & RLS¶
- Ingestion Drive : read-only (métadonnées d'abord, cf. audit de l'autre
instance), puis contenu → OCR/extraction →
corpus_chunks+ champsappels_offres. La cléreference_affairesert d'ancrage. - RLS : les nouvelles tables métier (
criteres_ao,references_clients,moyens_humains) suivent le cloisonnement paragence_iddéjà en place ;blocs/blocs_versions/materielgroupe sont lisibles par tous les authentifiés (référentiel commun) mais écrits par admin (source de vérité).
9. Résumé des évolutions¶
| Objet | Action | Sert |
|---|---|---|
appels_offres (+ colonnes) |
étendre | Qualification (doc 05) |
criteres_ao |
créer | Mapping critère→section (doc 03 §4) |
memoires / memoire_sections (+ colonnes) |
étendre | Éditeur section par section (doc 06 §5) |
blocs / blocs_versions |
créer | Source unique de vérité (quick win, doc 04 §1) |
references_clients · materiel · moyens_humains |
créer | Blocs sélection (doc 03 §7) |
contraintes_solutions |
créer | Générateur contraintes/solutions (doc 03 §3) |
projets_scores |
préciser | Similarité RAG (doc 05 §1) |
À valider avant d'écrire les migrations : dimension d'embedding (512, imposée), granularité
blocsvscontraintes_solutions, et le modèle exact des versions.