ajout de script / modif d'enum et simplification du lancement en local
This commit is contained in:
+89
-100
@@ -1,157 +1,146 @@
|
||||
# ENUMS.md — Référentiel des valeurs énumérées
|
||||
|
||||
# ENUMS.md — Référentiel des valeurs énumérées (Sprint 1)
|
||||
Ce document recense **toutes les valeurs énumérées** utilisées dans la base **P’titsPas**, leur **sens fonctionnel**, et les **tables/colonnes concernées**.
|
||||
|
||||
Ce document recense **toutes les valeurs énumérées** utilisées dans la base P’titsPas, leur **sens fonctionnel**, les **colonnes concernées** et les **transitions** attendues côté métier / API.
|
||||
|
||||
> Objectif : garantir la **cohérence** entre la DB, le backend (NestJS) et le frontend (Flutter).
|
||||
> Toute nouvelle valeur ou renommage **doit** être ajouté ici **avant** migration DB.
|
||||
> Objectif : garantir la cohérence entre la **DB**, le **backend (NestJS)** et le **frontend (Flutter)**.
|
||||
> Toute évolution doit être documentée ici **avant** migration DB.
|
||||
|
||||
---
|
||||
|
||||
## Conventions générales
|
||||
|
||||
- Les valeurs ENUM sont **en minuscules** et **sans espace** (snake_case si nécessaire).
|
||||
- Côté DB, elles sont implémentées via **types ENUM PostgreSQL** *ou* via `CHECK` (selon ce qui est en place dans `01_init.sql`).
|
||||
- Côté API, ces valeurs sont **renvoyées telles quelles** et **documentées** dans l’OpenAPI / DTO.
|
||||
* Les valeurs ENUM sont **en minuscules** (snake\_case si nécessaire).
|
||||
* Implémentées via `CREATE TYPE … AS ENUM` dans PostgreSQL.
|
||||
* Les valeurs sont **renvoyées telles quelles** côté API.
|
||||
|
||||
---
|
||||
|
||||
## 1) Rôle utilisateur — `role`
|
||||
## 1) Rôle utilisateur — `role_type`
|
||||
|
||||
**Tables/colonnes** : `utilisateurs.role`
|
||||
**Valeurs autorisées** :
|
||||
**Tables/colonnes** : `utilisateurs.role`
|
||||
|
||||
| Valeur | Description |
|
||||
|---|---|
|
||||
| `super_admin` | Compte technique initial / administration globale |
|
||||
| `gestionnaire` | Gestion / validation des comptes, supervision |
|
||||
| `parent` | Parent ou co-parent |
|
||||
| `am` | Assistante maternelle |
|
||||
| Valeur | Description |
|
||||
| ----------------------- | ------------------------------------------------- |
|
||||
| `parent` | Parent ou co-parent |
|
||||
| `gestionnaire` | Gestion/validation des comptes, supervision |
|
||||
| `super_admin` | Compte technique initial / administration globale |
|
||||
| `assistante_maternelle` | Profil professionnel d’assistante maternelle |
|
||||
| `administrateur` | Administration locale / restreinte |
|
||||
|
||||
---
|
||||
|
||||
## 2) Statut utilisateur — `statut`
|
||||
## 2) Genre utilisateur — `genre_type`
|
||||
|
||||
**Tables/colonnes** : `utilisateurs.statut`
|
||||
**Valeurs autorisées** :
|
||||
**Tables/colonnes** : `utilisateurs.genre`, `enfants.genre`
|
||||
|
||||
| Valeur | Description |
|
||||
|---|---|
|
||||
| `en_attente` | Compte créé mais non validé |
|
||||
| `accepte` | Compte validé et actif |
|
||||
| `rejete` | Demande refusée (peut être recréée ultérieurement) |
|
||||
| Valeur | Description |
|
||||
| ------- | ------------------- |
|
||||
| `H` | Homme |
|
||||
| `F` | Femme |
|
||||
| `Autre` | Autre / non précisé |
|
||||
|
||||
---
|
||||
|
||||
## 3) Statut enfant — `statut`
|
||||
## 3) Statut utilisateur — `statut_utilisateur_type`
|
||||
|
||||
**Tables/colonnes** : `enfants.statut`
|
||||
**Valeurs autorisées** :
|
||||
**Tables/colonnes** : `utilisateurs.statut`
|
||||
|
||||
| Valeur | Description |
|
||||
|---|---|
|
||||
| `a_naitre` | Enfant à naître (date prévue renseignée) |
|
||||
| `actif` | Enfant pris en charge / en cours de garde |
|
||||
| `scolarise` | Enfant scolarisé, garde potentiellement périscolaire |
|
||||
|
||||
**Contraintes associées** :
|
||||
- `a_naitre` → **`date_prevue_naissance` obligatoire**
|
||||
- `actif`/`scolarise` → **`date_naissance` obligatoire**
|
||||
| Valeur | Description |
|
||||
| ------------ | ------------------------------- |
|
||||
| `en_attente` | Compte créé mais non validé |
|
||||
| `actif` | Compte validé et actif |
|
||||
| `suspendu` | Compte temporairement désactivé |
|
||||
|
||||
---
|
||||
|
||||
## 4) Statut dossier — `statut`
|
||||
## 4) Statut enfant — `statut_enfant_type`
|
||||
|
||||
**Tables/colonnes** : `dossiers.statut`
|
||||
**Valeurs autorisées (MVP)** :
|
||||
**Tables/colonnes** : `enfants.statut`
|
||||
|
||||
| Valeur | Description |
|
||||
|---|---|
|
||||
| `envoye` | Dossier soumis par le parent (état initial) |
|
||||
| `en_cours` | Échanges en cours entre parent et AM |
|
||||
| `clos` | Dossier clôturé (contrat généré ou abandon) |
|
||||
| Valeur | Description |
|
||||
| ----------- | ---------------------------------------------- |
|
||||
| `a_naitre` | Enfant à naître (date prévue) |
|
||||
| `actif` | Enfant pris en charge |
|
||||
| `scolarise` | Enfant scolarisé (garde périscolaire possible) |
|
||||
|
||||
---
|
||||
|
||||
## 5) Statut contrat — `statut`
|
||||
## 5) Statut dossier — `statut_dossier_type`
|
||||
|
||||
**Tables/colonnes** : `contrats.statut`
|
||||
**Valeurs autorisées** :
|
||||
**Tables/colonnes** : `dossiers.statut`
|
||||
|
||||
| Valeur | Description |
|
||||
|---|---|
|
||||
| `brouillon` | Contrat en préparation |
|
||||
| `valide` | Contrat finalisé (signatures complètes) |
|
||||
| `archive` | Contrat obsolète / terminé |
|
||||
| Valeur | Description |
|
||||
| --------- | ---------------------------- |
|
||||
| `envoye` | Dossier soumis par le parent |
|
||||
| `accepte` | Dossier validé par l’AM |
|
||||
| `refuse` | Dossier rejeté |
|
||||
|
||||
---
|
||||
|
||||
## 6) Statut avenant — `statut`
|
||||
## 6) Statut contrat — `statut_contrat_type`
|
||||
|
||||
**Tables/colonnes** : `avenants_contrats.statut`
|
||||
**Valeurs autorisées** :
|
||||
**Tables/colonnes** : `contrats.statut`
|
||||
|
||||
| Valeur | Description |
|
||||
|---|---|
|
||||
| `propose` | Avenant proposé (en attente d’accord) |
|
||||
| `valide` | Avenant accepté et appliqué |
|
||||
| `rejete` | Avenant refusé |
|
||||
| Valeur | Description |
|
||||
| ---------------------- | ----------------------------------------- |
|
||||
| `brouillon` | Contrat en préparation |
|
||||
| `en_attente_signature` | Contrat généré, en attente des signatures |
|
||||
| `valide` | Contrat signé et actif |
|
||||
| `resilie` | Contrat résilié |
|
||||
|
||||
---
|
||||
|
||||
## 7) Type d’événement — `type`
|
||||
## 7) Statut avenant — `statut_avenant_type`
|
||||
|
||||
**Tables/colonnes** : `evenements.type`
|
||||
**Valeurs autorisées** :
|
||||
**Tables/colonnes** : `avenants_contrats.statut`
|
||||
|
||||
| Valeur | Description |
|
||||
|---|---|
|
||||
| `absence_enfant` | Enfant absent |
|
||||
| `conge_am` | Congé de l’assistante maternelle |
|
||||
| `conge_parent` | Congé du parent |
|
||||
| `arret_maladie_am` | Arrêt maladie AM |
|
||||
| `evenement_rpe` | Événement RPE |
|
||||
| Valeur | Description |
|
||||
| --------- | --------------------------- |
|
||||
| `propose` | Avenant proposé |
|
||||
| `accepte` | Avenant accepté et appliqué |
|
||||
| `refuse` | Avenant rejeté |
|
||||
|
||||
---
|
||||
|
||||
## 8) Statut d’événement — `statut`
|
||||
## 8) Type d’événement — `type_evenement_type`
|
||||
|
||||
**Tables/colonnes** : `evenements.statut`
|
||||
**Valeurs autorisées** :
|
||||
**Tables/colonnes** : `evenements.type`
|
||||
|
||||
| Valeur | Description |
|
||||
|---|---|
|
||||
| Valeur | Description |
|
||||
| ------------------ | -------------------------------- |
|
||||
| `absence_enfant` | Absence de l’enfant |
|
||||
| `conge_am` | Congé de l’assistante maternelle |
|
||||
| `conge_parent` | Congé du parent |
|
||||
| `arret_maladie_am` | Arrêt maladie de l’AM |
|
||||
| `evenement_rpe` | Événement organisé par le RPE |
|
||||
|
||||
---
|
||||
|
||||
## 9) Statut d’événement — `statut_evenement_type`
|
||||
|
||||
**Tables/colonnes** : `evenements.statut`
|
||||
|
||||
| Valeur | Description |
|
||||
| --------- | ----------------- |
|
||||
| `propose` | Événement proposé |
|
||||
| `valide` | Événement validé |
|
||||
| `rejete` | Événement refusé |
|
||||
| `valide` | Événement validé |
|
||||
| `refuse` | Événement rejeté |
|
||||
|
||||
---
|
||||
|
||||
## 9) Statut de validation compte — `statut`
|
||||
## 10) Statut validation — `statut_validation_type`
|
||||
|
||||
**Tables/colonnes** : `validations.statut`
|
||||
**Valeurs autorisées** :
|
||||
**Tables/colonnes** : `validations.statut`
|
||||
|
||||
| Valeur | Description |
|
||||
|---|---|
|
||||
| `accepte` | Compte validé |
|
||||
| `rejete` | Compte refusé |
|
||||
| Valeur | Description |
|
||||
| ------------ | ------------------------ |
|
||||
| `en_attente` | En attente de validation |
|
||||
| `valide` | Validation acceptée |
|
||||
| `refuse` | Validation refusée |
|
||||
|
||||
---
|
||||
|
||||
## 10) Type de notification — `type`
|
||||
📌 **Mainteneur** : Équipe BDD
|
||||
📌 **Dernière mise à jour** : alignée sur `init.sql` (septembre 2025)
|
||||
|
||||
**Tables/colonnes** : `notifications.type`
|
||||
**Valeurs proposées** :
|
||||
|
||||
| Valeur | Description |
|
||||
|---|---|
|
||||
| `nouveau_message` | Nouveau message sur un dossier |
|
||||
| `validation_compte` | Résultat de la validation de compte |
|
||||
| `maj_contrat` | Contrat mis à jour (avenant / signature) |
|
||||
| `evenement_a_venir` | Rappel d’un événement proche |
|
||||
|
||||
---
|
||||
|
||||
**Mainteneur** : Équipe BDD
|
||||
**Dernière mise à jour** : Sprint 1 — Ticket 9 (ENUMS)
|
||||
---
|
||||
+107
-105
@@ -1,142 +1,144 @@
|
||||
# FK\_POLICIES.md — Politiques de clés étrangères
|
||||
|
||||
# FK_POLICIES.md
|
||||
**Politique des clés étrangères (ON DELETE / ON UPDATE)** – Sprint 1
|
||||
Ce document recense l’ensemble des **relations entre tables** dans la base **P’titsPas**, avec leurs **règles de suppression** et les implications fonctionnelles.
|
||||
|
||||
## 🎯 Objectif
|
||||
Documenter, de façon unique et partagée, les règles de suppression/mise à jour appliquées aux **clés étrangères** de la base P’titsPas pour :
|
||||
- préserver l’**intégrité référentielle** ;
|
||||
- conserver l’**historique** utile (messages, événements…) ;
|
||||
- respecter les exigences **RGPD** (suppression en cascade lorsque pertinent).
|
||||
|
||||
> Par défaut, **ON UPDATE = NO ACTION** (UUID immuables).
|
||||
> Ce document couvre **ON DELETE** table par table.
|
||||
> Objectif : assurer la cohérence entre la **DB**, le **backend** et le **fonctionnel métier**.
|
||||
> Toute nouvelle relation ou modification doit être ajoutée ici avant migration DB.
|
||||
|
||||
---
|
||||
|
||||
## 🧭 Principes généraux
|
||||
## Conventions générales
|
||||
|
||||
- **CASCADE** quand la donnée fille **n’a pas de sens sans le parent**
|
||||
(ex. `dossiers` d’un parent, `avenants` d’un contrat).
|
||||
- **SET NULL** quand on veut **préserver l’historique** mais que le référent peut disparaître
|
||||
(ex. auteur d’un message supprimé, créateur d’un événement).
|
||||
- **RESTRICT/NO ACTION** non utilisé ici pour éviter des blocages au nettoyage.
|
||||
* Les FK sont définies en `REFERENCES ...`.
|
||||
* Sauf précision, `ON UPDATE` est implicite = `NO ACTION`.
|
||||
* Les comportements documentés sont **côté PostgreSQL**.
|
||||
|
||||
---
|
||||
|
||||
## 📚 Récapitulatif rapide (matrice)
|
||||
## 1) Table `assistantes_maternelles`
|
||||
|
||||
| Table (colonne FK) → Référence | ON DELETE | Raison |
|
||||
|---|---:|---|
|
||||
| **assistantes_maternelles(id_utilisateur)** → `utilisateurs(id)` | **CASCADE** | Profil AM supprimé avec son compte |
|
||||
| **parents(id_utilisateur)** → `utilisateurs(id)` | **CASCADE** | Extension parent supprimée avec son compte |
|
||||
| **parents(id_co_parent)** → `utilisateurs(id)` | **SET NULL** | Conserver le parent principal si co-parent disparaît |
|
||||
| **enfants_parents(id_parent)** → `parents(id_utilisateur)` | **CASCADE** | Nettoyage liaisons N:N |
|
||||
| **enfants_parents(id_enfant)** → `enfants(id)` | **CASCADE** | Idem |
|
||||
| **dossiers(id_parent)** → `parents(id_utilisateur)` | **CASCADE** | Dossier n’a pas de sens sans parent |
|
||||
| **dossiers(id_enfant)** → `enfants(id)` | **CASCADE** | Dossier n’a pas de sens sans enfant |
|
||||
| **messages(id_dossier)** → `dossiers(id)` | **CASCADE** | Messages détruits avec le dossier |
|
||||
| **messages(id_expediteur)** → `utilisateurs(id)` | **SET NULL** | Garder l’historique des échanges |
|
||||
| **contrats(id_dossier)** → `dossiers(id)` | **CASCADE** | 1:1, contrat détruit si dossier supprimé |
|
||||
| **avenants_contrats(id_contrat)** → `contrats(id)` | **CASCADE** | Avenants détruits avec le contrat |
|
||||
| **avenants_contrats(initie_par)** → `utilisateurs(id)` | **SET NULL** | Historiser l’avenant sans bloquer |
|
||||
| **evenements(id_enfant)** → `enfants(id)` | **CASCADE** | Événements n’ont plus de sens |
|
||||
| **evenements(id_am)** → `utilisateurs(id)` | **SET NULL** | Garder la trace même si AM supprimée |
|
||||
| **evenements(id_parent)** → `parents(id_utilisateur)` | **SET NULL** | Garder la trace si parent supprimé |
|
||||
| **evenements(cree_par)** → `utilisateurs(id)` | **SET NULL** | Conserver l’historique de création |
|
||||
| **signalements_bugs(id_utilisateur)** → `utilisateurs(id)` | **SET NULL** | Conserver le ticket même si compte supprimé |
|
||||
| **uploads(id_utilisateur)** → `utilisateurs(id)` | **SET NULL** | Fichier reste référencé sans l’auteur |
|
||||
| **notifications(id_utilisateur)** → `utilisateurs(id)` | **CASCADE** | Notifications propres à l’utilisateur |
|
||||
| **validations(id_utilisateur)** → `utilisateurs(id)` | **SET NULL** | Garder l’historique de décision |
|
||||
|
||||
> **ON UPDATE** : **NO ACTION** partout (les UUID ne changent pas).
|
||||
* **FK** : `id_utilisateur → utilisateurs.id`
|
||||
* **ON DELETE CASCADE**
|
||||
* 🔎 Si un utilisateur AM est supprimé, son profil AM est supprimé automatiquement.
|
||||
|
||||
---
|
||||
|
||||
## 🔎 Détail par domaine
|
||||
## 2) Table `parents`
|
||||
|
||||
### Utilisateurs & extensions
|
||||
- `assistantes_maternelles.id_utilisateur` → **CASCADE**
|
||||
- `parents.id_utilisateur` → **CASCADE**
|
||||
- `parents.id_co_parent` → **SET NULL** (interdit d’être co-parent de soi-même via CHECK déjà posé)
|
||||
* **FK** : `id_utilisateur → utilisateurs.id`
|
||||
|
||||
### Enfants & liaisons
|
||||
- `enfants_parents.id_parent` → **CASCADE**
|
||||
- `enfants_parents.id_enfant` → **CASCADE**
|
||||
* **ON DELETE CASCADE** → suppression d’un parent entraîne suppression automatique du parent.
|
||||
* **FK** : `id_co_parent → utilisateurs.id`
|
||||
|
||||
### Dossiers & échanges
|
||||
- `dossiers.id_parent` → **CASCADE**
|
||||
- `dossiers.id_enfant` → **CASCADE**
|
||||
- `messages.id_dossier` → **CASCADE**
|
||||
- `messages.id_expediteur` → **SET NULL**
|
||||
|
||||
### Contrats & avenants
|
||||
- `contrats.id_dossier` → **CASCADE** (unique 1:1)
|
||||
- `avenants_contrats.id_contrat` → **CASCADE**
|
||||
- `avenants_contrats.initie_par` → **SET NULL**
|
||||
|
||||
### Événements
|
||||
- `evenements.id_enfant` → **CASCADE**
|
||||
- `evenements.id_am` → **SET NULL**
|
||||
- `evenements.id_parent` → **SET NULL**
|
||||
- `evenements.cree_par` → **SET NULL**
|
||||
|
||||
### Divers
|
||||
- `signalements_bugs.id_utilisateur` → **SET NULL**
|
||||
- `uploads.id_utilisateur` → **SET NULL**
|
||||
- `notifications.id_utilisateur` → **CASCADE**
|
||||
- `validations.id_utilisateur` → **SET NULL**
|
||||
* **ON DELETE NO ACTION** (par défaut) → suppression du co-parent interdite si référence active.
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Scénarios de test (exemples)
|
||||
## 3) Table `enfants_parents`
|
||||
|
||||
1. **Suppression d’un parent**
|
||||
- Supprimer `utilisateurs(id=parentX)`
|
||||
- Attendu : `parents` (CASCADE), ses `dossiers` (CASCADE), `messages` liés aux `dossiers` (CASCADE) sont supprimés.
|
||||
* **FK** : `id_parent → parents.id_utilisateur`
|
||||
|
||||
2. **Suppression d’un co-parent**
|
||||
- Supprimer `utilisateurs(id=coParentY)`
|
||||
- Attendu : `parents.id_co_parent` passe à **NULL**, aucun dossier supprimé.
|
||||
* **ON DELETE CASCADE** → si le parent est supprimé, le lien avec l’enfant disparaît.
|
||||
* **FK** : `id_enfant → enfants.id`
|
||||
|
||||
3. **Suppression d’un utilisateur auteur de messages**
|
||||
- Supprimer `utilisateurs(id=uZ)`
|
||||
- Attendu : les lignes `messages` **restent**, `id_expediteur` devient **NULL**.
|
||||
|
||||
4. **Suppression d’un enfant**
|
||||
- Supprimer `enfants(id=childA)`
|
||||
- Attendu : `enfants_parents` (CASCADE), `dossiers` du childA (CASCADE), `evenements` du childA (CASCADE).
|
||||
|
||||
5. **Suppression d’un utilisateur AM**
|
||||
- Supprimer `utilisateurs(id=amB)`
|
||||
- Attendu : `evenements.id_am` devient **NULL** (historique conservé).
|
||||
* **ON DELETE CASCADE** → si l’enfant est supprimé, toutes ses associations avec des parents disparaissent.
|
||||
|
||||
---
|
||||
|
||||
## 🛠 Migrations associées
|
||||
## 4) Table `dossiers`
|
||||
|
||||
Les ajustements sont implémentés dans :
|
||||
- **`/bdd/migrations/04_fk_policies.sql`**
|
||||
– redéfinition des contraintes FK avec les bonnes politiques (**DROP puis ADD CONSTRAINT**), de façon idempotente.
|
||||
* **FK** : `id_parent → parents.id_utilisateur`
|
||||
|
||||
* **ON DELETE CASCADE** → si le parent est supprimé, ses dossiers disparaissent.
|
||||
* **FK** : `id_enfant → enfants.id`
|
||||
|
||||
* **ON DELETE CASCADE** → si l’enfant est supprimé, les dossiers liés disparaissent.
|
||||
|
||||
---
|
||||
|
||||
## 📄 Notes & futures évolutions
|
||||
## 5) Table `messages`
|
||||
|
||||
- **RGPD (Sprint 2)** : si vous activez le **soft delete** (`deleted_at`) côté tables métier, ces politiques restent valides (les suppressions logiques se gèrent au niveau applicatif).
|
||||
- **Audit** : si vous voulez tracer les suppressions, ajoutez des triggers d’audit (voir ticket Sprint 2 – Audit log).
|
||||
- **Performance** : chaque FK doit être **indexée côté enfant** (cf. `02_indexes.sql`).
|
||||
* **FK** : `id_dossier → dossiers.id`
|
||||
|
||||
* **ON DELETE CASCADE** → si un dossier est supprimé, les messages disparaissent.
|
||||
* **FK** : `id_expediteur → utilisateurs.id`
|
||||
|
||||
* **ON DELETE CASCADE** → si un utilisateur est supprimé, ses messages disparaissent.
|
||||
|
||||
---
|
||||
|
||||
## ✅ Checklist de conformité
|
||||
## 6) Table `contrats`
|
||||
|
||||
- [ ] Toutes les FK listées existent dans la base
|
||||
- [ ] Politique **ON DELETE** conforme au tableau ci-dessus
|
||||
- [ ] **ON UPDATE = NO ACTION** partout
|
||||
- [ ] Tests de suppression réalisés sur une base seedée
|
||||
- [ ] `04_fk_policies.sql` appliqué sans erreur
|
||||
* **FK** : `id_dossier → dossiers.id`
|
||||
|
||||
* **UNIQUE** + **ON DELETE CASCADE** → si un dossier est supprimé, le contrat disparaît.
|
||||
|
||||
---
|
||||
|
||||
**Mainteneur** : Équipe BDD
|
||||
**Dernière mise à jour** : Sprint 1 – Politique FK consolidée
|
||||
## 7) Table `avenants_contrats`
|
||||
|
||||
* **FK** : `id_contrat → contrats.id`
|
||||
|
||||
* **ON DELETE CASCADE** → si un contrat est supprimé, ses avenants disparaissent.
|
||||
* **FK** : `initie_par → utilisateurs.id`
|
||||
|
||||
* **ON DELETE NO ACTION** → suppression interdite tant que des avenants existent.
|
||||
|
||||
---
|
||||
|
||||
## 8) Table `evenements`
|
||||
|
||||
* **FK** : `id_enfant → enfants.id`
|
||||
|
||||
* **ON DELETE CASCADE** → si un enfant est supprimé, ses événements disparaissent.
|
||||
* **FK** : `id_am → utilisateurs.id`
|
||||
|
||||
* **ON DELETE NO ACTION** → suppression interdite si des événements liés.
|
||||
* **FK** : `id_parent → parents.id_utilisateur`
|
||||
|
||||
* **ON DELETE NO ACTION** → suppression interdite si des événements liés.
|
||||
* **FK** : `cree_par → utilisateurs.id`
|
||||
|
||||
* **ON DELETE NO ACTION** → suppression interdite si référence encore utilisée.
|
||||
|
||||
---
|
||||
|
||||
## 9) Table `signalements_bugs`
|
||||
|
||||
* **FK** : `id_utilisateur → utilisateurs.id`
|
||||
|
||||
* **ON DELETE NO ACTION** → utilisateur non supprimable si bug référencé.
|
||||
|
||||
---
|
||||
|
||||
## 10) Table `uploads`
|
||||
|
||||
* **FK** : `id_utilisateur → utilisateurs.id`
|
||||
|
||||
* **ON DELETE SET NULL** → si un utilisateur est supprimé, ses fichiers restent, mais sans lien utilisateur.
|
||||
|
||||
---
|
||||
|
||||
## 11) Table `notifications`
|
||||
|
||||
* **FK** : `id_utilisateur → utilisateurs.id`
|
||||
|
||||
* **ON DELETE CASCADE** → si un utilisateur est supprimé, ses notifications disparaissent.
|
||||
|
||||
---
|
||||
|
||||
## 12) Table `validations`
|
||||
|
||||
* **FK** : `id_utilisateur → utilisateurs.id`
|
||||
|
||||
* **ON DELETE NO ACTION** → suppression interdite si validations liées.
|
||||
* **FK** : `valide_par → utilisateurs.id`
|
||||
|
||||
* **ON DELETE NO ACTION** → suppression interdite si validations effectuées par l’utilisateur.
|
||||
|
||||
---
|
||||
|
||||
📌 **Mainteneur** : Équipe BDD
|
||||
📌 **Dernière mise à jour** : alignée sur `init.sql` (septembre 2025)
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user