Base de Données Motivia
Stack technique
- ORM: Prisma
- BDD: PostgreSQL (Neon)
- Fichier schema:
prisma/schema.prisma
Commandes Prisma
# Développement
pnpm prisma generate # Générer le client Prisma
pnpm prisma migrate dev # Créer et appliquer une migration
pnpm prisma migrate dev --name add_feature # Migration nommée
pnpm prisma db push # Push direct (dev seulement)
# Production
pnpm prisma migrate deploy # Appliquer les migrations
# Utilitaires
pnpm prisma studio # Interface graphique
pnpm prisma db seed # Exécuter le seed
pnpm prisma format # Formater le schema
Modèles existants
User (central)
model User {
id String @id @default(cuid())
email String @unique
name String @default("")
firstName String?
lastName String?
profileTitle String?
localisation String?
image String?
emailVerified Boolean @default(false)
freeLetters Int @default(5)
keyAchievements String[]
softSkills String[]
technicalSkills String[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// Relations
accounts Account[]
sessions Session[]
apiKeys ApiKey[]
experiences Experience[]
degrees Degree[]
links Link[]
projects Project[]
motivationLetters MotivationLetter[]
userCV UserCV?
}
Entités métier
| Modèle | Description | Relation | |--------|-------------|----------| | Experience | Expériences pro | User 1:N | | Degree | Diplômes | User 1:N | | Project | Projets portfolio | User 1:N | | Link | Liens sociaux | User 1:N | | MotivationLetter | Lettres générées | User 1:N | | UserCV | CV PDF uploadé | User 1:1 | | ApiKey | Clés API providers | User 1:N |
Auth (Better Auth)
| Modèle | Description | |--------|-------------| | Account | Comptes OAuth/credentials | | Session | Sessions utilisateur | | Verification | Tokens de vérification | | Authenticator | WebAuthn |
Conventions de schéma
Champs obligatoires
model NouveauModele {
id String @id @default(cuid())
// ... champs métier
userId String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@index([userId])
}
Types courants
| Usage | Type Prisma | |-------|-------------| | ID | String @id @default(cuid()) | | Email | String @unique | | Texte court | String | | Texte long | String (pas de @db.Text nécessaire) | | Date | DateTime | | Date optionnelle | DateTime? | | Booléen | Boolean @default(false) | | Entier | Int @default(0) | | Liste de strings | String[] |
Relations
// 1:N (User a plusieurs Experience)
model User {
experiences Experience[]
}
model Experience {
userId String
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
}
// 1:1 (User a un CV)
model User {
userCV UserCV?
}
model UserCV {
userId String @unique
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
}
Enum
enum ApiProvider {
OPENAI
GOOGLE
ANTHROPIC
MISTRAL
XAI
}
model ApiKey {
provider ApiProvider
}
Workflow modification de schéma
1. Modifier le schéma
// prisma/schema.prisma
model User {
// Ajouter un nouveau champ
newField String?
}
2. Créer la migration
pnpm prisma migrate dev --name add_new_field
3. Mettre à jour le code
- Server actions dans
app/actions/ - Schémas Zod dans
utils/schemas.ts
Ajouter un nouveau modèle
1. Définir le modèle
model NewEntity {
id String @id @default(cuid())
name String
description String?
isActive Boolean @default(true)
userId String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@index([userId])
}
2. Ajouter la relation dans User
model User {
// ... existing fields
newEntities NewEntity[]
}
3. Créer la migration
pnpm prisma migrate dev --name add_new_entity
4. Créer les server actions
Créer app/actions/new-entity.ts avec le pattern habituel.
Bonnes pratiques
Indexes
@@index([userId]) // Toujours indexer les FK
@@index([createdAt]) // Si tri fréquent
@@unique([userId, name]) // Contrainte d'unicité
Cascade
Toujours utiliser onDelete: Cascade pour les relations avec User afin de supprimer les données orphelines.
Migrations en production
- Tester localement avec
migrate dev - Commit des fichiers de migration
- En production:
migrate deploy(via script build)
Checklist nouvelle table
- [ ] ID avec
@id @default(cuid()) - [ ]
createdAtetupdatedAt - [ ]
userIdavec relation etonDelete: Cascade - [ ]
@@index([userId]) - [ ] Relation ajoutée dans User
- [ ] Migration créée et testée
- [ ] Server actions créées
- [ ] Schéma Zod ajouté