Schémas Entité-Relation (ERD)
Diagrammes entité-relation de la base, générés depuis apps/api/prisma/schema.prisma par pnpm docs:erd. Ils utilisent les noms SQL des tables et colonnes, ceux qu'on écrit dans une requête. Le catalogue commenté des tables est sur la page Modèle Prisma.
Lecture : PK clé primaire, FK clé étrangère, UK valeur unique, nullable colonne facultative. ||--o{ : un parent, zéro ou plusieurs enfants ; |o--o{ : le parent est facultatif (clé étrangère nullable) ; --o| : au plus un enfant par parent. L'étiquette d'une relation est la colonne qui porte la clé étrangère. Les types sont ceux de PostgreSQL (text, int, bool, timestamp, jsonb, float, text[]). Une table sans colonnes dans un diagramme est détaillée dans un autre.
🧭 Les domaines
À retenir avant de lire les diagrammes :
parlementairescontient la personne,mandats_parlementaireschaque siège (législature, circonscription, groupe d'époque) ;parlementaires_identifiantsgarde l'identifiant de la chambre quittée.textes_articlesstocke les articles de chaque version de texte AN (initial, texte de commission…), une ligne par (texte_ref,numero). Les versions ne sont pas chaînées entre elles : un article renuméroté d'une version à l'autre n'est pas suivi. Un amendement retrouve son article partexte_refetarticle_vise(« ART. PREMIER » ↔ « PREMIER »), sans clé étrangère. Le Sénat n'est pas couvert.avis_commissionenregistre ce qu'une commission de l'Assemblée recommande de chaque amendement avant la séance (réunions tenues au titre des articles 86, 88 ou 91 du Règlement), là oùamendements.sortdit ce que l'hémicycle a décidé.intervention_scrutinrelie une prise de parole au scrutin qu'elle précède ;viadit comment (voir Modèle Prisma).- Toutes les tables portent
created_atetupdated_at, sauf les deux tables de jointure implicites :updated_atest tenu par la base et ne bouge que si le contenu de la ligne change (voir Suivi des modifications).
🗺️ Vue d'ensemble des relations
Les 56 relations entre tables, sans les colonnes. Les 7 tables sans clé étrangère (evenements_institutionnels, candidats_mandats_locaux, legi_textes, legi_articles, sync_logs, source_states, feedbacks) n'y figurent pas ; elles sont détaillées plus bas.
Parlementaires, mandats et groupes
Gouvernements et présidence de la République
Travail législatif : dossiers, scrutins, amendements, débats, sujets
Commissions, réunions et agenda
Lobbying (HATVP)
Élections sénatoriales : candidatures et résultats
Index de la base LEGI (DILA) et renvois des amendements
Sans clé étrangère : legi_articles.cid désigne le cid commun aux versions d'un texte de legi_textes, qui n'est pas unique. amendements_renvois désigne articles et textes de l'index par leurs identifiants, dans son JSON.
Tables techniques
Sans relation avec les autres tables.
🔗 Liens logiques sans clé étrangère
Plusieurs rapprochements se font par des identifiants de la source, sans contrainte en base. Ils ne figurent donc pas dans les diagrammes.
| Colonne | Correspond à | Remarque |
|---|---|---|
amendements.auteur_ref | parlementaires.source_id, ou parlementaires_identifiants.source_id pour un député devenu sénateur | Identifiant d'acteur AN (PA…) ; parlementaire_id en est la résolution |
amendements.amendement_parent_ref | amendements.uid | Référence du parent publiée par la source ; amendement_parent_id en est la résolution |
amendements.texte_ref + amendements.article_vise | textes_articles.texte_ref + textes_articles.numero | Version du texte et article visé (clé unique de textes_articles) |
amendements.seance_discussion_ref | reunions.uid | Séance de discussion (AN), quand elle figure à l'agenda |
mandats.organe_ref | commissions.uid | Organe AN (PO…) ; commission_id en est la résolution |
reunions.organe_ref | commissions.organe_ref | Conservé même quand la commission n'est pas résolue |
scrutins.seance_ref | séance du compte rendu | Sert au rattachement des débats |
interventions.seance_uid | compte rendu AN (CRSANR5L17…) | Avec ordre_absolu, situe la prise de parole dans la séance |
interventions.amendements_vises | amendements.numero | Numéros d'amendement nommés dans le paragraphe |
interventions.texte_numero, scrutins.texte_numero | numéro de dépôt du texte | interventions.dossier_id en est la résolution |
avis_commission.numero | amendements.numero | amendement_id en est la résolution, quand elle réussit |
resultats_listes.liste_source_uid | candidatures_listes.source_uid | Volontairement sans clé étrangère : les résultats ne dépendent pas de la vie des lignes de candidature (une liste retirée du fichier ne doit pas emporter ses voix) |
candidats_mandats_locaux (scrutin, nom, prenom, date_naissance) | candidatures (même identité) | Clé d'identité du candidat, indépendante des lignes de candidature |