Conventions de schéma
:::danger Règle absolue
Toutes les clés étrangères doivent utiliser le pattern de nommage id_*.
:::
Règles de migration
- Noms de tables explicites
- Index sur les clés étrangères et les filtres fréquents
- Clés étrangères contraintes quand c'est sûr
- Soft deletes quand des enregistrements peuvent être référencés par des logs, audits, permissions ou historique
- Ne jamais renommer des colonnes sans migration et revue de compatibilité
Exemple de clé étrangère
$table->unsignedBigInteger('id_role')->index();
$table->foreign('id_role')->references('id_role')->on('roles');
$table->unsignedBigInteger('id_service')->index();
$table->foreign('id_service')->references('id_service')->on('services');
Checklist migration
- ✅ Convention de clé primaire conforme aux tables existantes
- ✅ Clés étrangères en
id_* - ✅ Colonnes nullable intentionnelles uniquement
- ✅ Contraintes unique conformes aux règles métier
- ✅
deleted_atprésent quand la rétention historique est nécessaire - ✅ Préfixe de module sur le nom de table
Tables partagées (app/)
Ces tables n'ont pas de préfixe et vivent dans database/migrations/ racine :
| Table | Description |
|---|---|
users | Utilisateurs (soft delete) |
roles | Rôles RBAC |
permissions | Permissions atomiques |
services | Services / unités organisationnelles |
core_applications | Applications métier + settings JSON |
Tables de module
Exemples de préfixes :
| Préfixe | Module |
|---|---|
dashboard_ | Dashboard (alias, groupes) |
elevage_ | Élevage |
infrastructure_ | Infrastructure |
ai_ | Module Ai |
thalia_ | Thalia (futur) |