Ce fichier explique comment utiliser et maintenir les différents formats de schéma de base de données.
Le schéma TypeScript Drizzle ORM est le fichier source principal. C'est lui qui définit la structure réelle de la base de données.
Utilisation :
# Générer une nouvelle migration après modification
npm run db:generate
# Appliquer les migrations à la base
npm run db:push
# Voir le schéma actuel
npm run db:studioLe fichier DBML est utilisé pour visualiser le schéma dans des outils comme :
schema.ts.
Comment l'utiliser :
- Ouvrez dbdiagram.io ou DrawDB.io
- Importez le fichier
schema.dbml - Visualisez le diagramme ER complet
Mise à jour :
Après avoir modifié schema.ts, mettez à jour schema.dbml pour refléter les changements.
Documentation complète de la base de données avec :
- Description de chaque table
- Exemples de requêtes Drizzle
- Guide des migrations
- Bonnes pratiques
Mise à jour : Documentez toute modification majeure du schéma dans ce fichier.
Authentification :
POR_USERS- Utilisateurs adminPOR_SESSIONS- Sessions d'authentification
Blog :
POR_POSTS- Articles de blogPOR_TAGS- Tags pour les articlesPOR_POSTS_TAGS- Liaison Many-to-Many posts ↔ tags
Projets :
POR_PROJECTS- Projets portfolioPOR_TECHNOLOGIES- Technologies (partagée)POR_PROJECTS_TECHNOLOGIES- Liaison Many-to-Many projets ↔ technologies
Expériences :
POR_EXPERIENCES- Expériences professionnelles/éducativesPOR_EXPERIENCES_TECHNOLOGIES- Liaison Many-to-Many expériences ↔ technologies
Compétences :
POR_SKILL_CATEGORIES- Catégories de compétencesPOR_SKILLS- Compétences techniques
Passions :
POR_PASSIONS- Passions et hobbiesPOR_SOFT_SKILLS- Compétences transversalesPOR_PASSIONS_SOFT_SKILLS- Liaison Many-to-Many passions ↔ soft skills
Tous les champs de contenu utilisent JSONB avec la structure :
{
"fr": "Texte en français",
"en": "Text in English"
}Tables avec contenu multilingue :
- POR_POSTS : title, description, content
- POR_PROJECTS : title, description
- POR_TECHNOLOGIES : name
- POR_EXPERIENCES : company, role, description
- POR_SKILL_CATEGORIES : name
- POR_SKILLS : name, context
- POR_PASSIONS : title, description
- POR_SOFT_SKILLS : name, description
Les tables de liaison utilisent des clés primaires composites :
-- Exemple : POR_POSTS_TAGS
PRIMARY KEY ("POS_ID", "TAG_ID")Tables concernées :
POR_POSTS_TAGS: (POS_ID, TAG_ID)POR_PROJECTS_TECHNOLOGIES: (PRJ_ID, TEC_ID)POR_EXPERIENCES_TECHNOLOGIES: (EXP_ID, TEC_ID)POR_PASSIONS_SOFT_SKILLS: (PAS_ID, SSK_ID)
// src/lib/server/db/schema.ts
export const MA_NOUVELLE_TABLE = pgTable('MA_NOUVELLE_TABLE', {
ID: uuid('ID').primaryKey().defaultRandom(),
NAME: varchar('NAME', { length: 255 }).notNull()
});npm run db:generate
npm run db:push// schema.dbml
Table MA_NOUVELLE_TABLE [headercolor: #123456] {
ID uuid [ pk, not null ]
NAME varchar(255) [ not null ]
}
Ajoutez une section dans docs/DATABASE.md pour expliquer la nouvelle table.
# Avec Drizzle Studio (interface graphique)
npm run db:studio-
Drizzle Studio : Interface graphique pour explorer la DB
npm run db:studio
-
dbdiagram.io : Visualisation ER interactive
- Importez
schema.dbml
- Importez
-
pgAdmin / DBeaver : Gestion PostgreSQL avancée
- ✅ Les mots de passe sont hashés avec Argon2id
- ✅ Les sessions utilisent des tokens UUID aléatoires
- ✅ Toutes les routes admin nécessitent authentification
- ✅ Foreign keys avec CASCADE pour éviter les orphelins
- ✅ Paramètres bindés (protection SQL injection)
docker exec portfolio-db pg_dump -U portfolio portfolio > backup.sqldocker exec -i portfolio-db psql -U portfolio portfolio < backup.sqlPour toute question sur le schéma, consultez :
docs/DATABASE.md- Documentation détailléeschema.dbml- Visualisation ERsrc/lib/server/db/schema.ts- Définitions TypeScript