← Web Dev
🗃️

Bases de Données pour le Web

Intermédiaire
🧠Comprendre en lisant n'est pas savoir écrire.🧠Un module est fini quand tu peux le reproduire fenêtre fermée.🧠Écris le problème en français avant d'écrire du code.🧠Une question impossible cache trois questions faciles.🧠Retape le code à la main. Puis referme et réécris-le.🧠Essaie d'abord, cherche ensuite.🧠Cherche « comment on écrit ça », jamais « qu'est-ce que je dois faire ».🧠Pour comprendre du code, casse-le.⌨️Une fonction qui plante sur un cas limite n'est pas finie.⌨️Si un bloc a un nom clair, il mérite d'être une fonction.⌨️Savoir lire une erreur vaut plus que connaître dix méthodes.⌨️Diagnostiquer, c'est éliminer dans l'ordre — pas essayer au hasard.⌨️Une optimisation sans mesure avant/après est une croyance.🔍Regarde le fichier avant de le charger.🔍Une performance anormalement bonne est une hypothèse à réfuter.🔍Cette valeur existe-t-elle à l'instant où je dois prédire ?🔍fit sur le train, transform partout.🔍Un chiffre qu'on ne sait pas raconter est un chiffre qu'on n'a pas compris.🔍Un graphique sans question n'a rien à dire.🤖Un score d'entraînement parfait n'est jamais une bonne nouvelle.🤖Le jeu de test ne se regarde qu'une fois.🤖Plus tu essaies de configurations, plus ton meilleur score est optimiste.🤖Un seuil de décision est un arbitrage économique, pas un réglage technique.🤖Commence toujours par une baseline. Note son score.🤖Le meilleur modèle n'est pas le plus précis, c'est celui qu'on peut maintenir.🚀Un modèle en production n'est pas un livrable, c'est un système vivant.🚀Un secret publié est un secret compromis.🚀Pour chaque permission : que se passe-t-il si cette machine est compromise ?🚀Un post-mortem qui cherche un coupable ne produit aucune amélioration.🚀« Nous n'utilisons pas cette variable » n'est pas une garantie d'équité.🚀Rends l'arbitrage explicite et chiffré. Ne le tranche pas en silence.🚀Un résultat qu'on ne sait pas reproduire est une anecdote.

🎯 Objectifs d'apprentissage

À l'issue de ce module, tu seras capable de :

  • 01Concevoir un schéma relationnel normalisé pour une application web
  • 02Écrire des requêtes typées et des migrations avec un ORM
  • 03Sécuriser l'accès aux données par des politiques au niveau des lignes
  • 04Diagnostiquer et corriger une requête N+1

Prérequis

Module TypeScript

PostgreSQL avec Prisma ORM

60 min

Prisma est l'ORM moderne pour Node.js/TypeScript. Il génère un client typé depuis ton schéma, évite les injections SQL et simplifie les migrations.

Initialiser Prisma

npm install @prisma/client
npm install --save-dev prisma
npx prisma init          # crée prisma/schema.prisma + .env

Schéma Prisma — définir le modèle de données

// prisma/schema.prisma
generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model User {
  id        Int      @id @default(autoincrement())
  email     String   @unique
  name      String
  xp        Int      @default(0)
  createdAt DateTime @default(now())
  lessons   CompletedLesson[]
  quizzes   QuizResult[]
}

model CompletedLesson {
  id       Int    @id @default(autoincrement())
  lessonId String
  user     User   @relation(fields: [userId], references: [id])
  userId   Int
  completedAt DateTime @default(now())

  @@unique([userId, lessonId])
}

Requêtes Prisma dans Express

const { PrismaClient } = require("@prisma/client");
const prisma = new PrismaClient();

// Créer un utilisateur
const user = await prisma.user.create({
  data: { email: "emile@ml.ca", name: "Emile", xp: 0 }
});

// Lire avec relations
const userWithProgress = await prisma.user.findUnique({
  where: { id: userId },
  include: { lessons: true, quizzes: true }
});

// Mettre à jour l'XP
await prisma.user.update({
  where: { id: userId },
  data: { xp: { increment: 50 } }
});

Migrations

npx prisma migrate dev --name add-xp-field
npx prisma studio                            # GUI de la BDD

✍️ Exercices de la leçon

2 exercices

Fais-les dans l'ordre, dans un vrai fichier .py — pas dans ta tête. Ne déplie la correction qu'après avoir écrit quelque chose, même faux.

🔧

Exercice AUn schéma Prisma avec relations

Application directe · Tu appliques ce que tu viens de lire.

Modélise une plateforme de cours avec Prisma :

  1. 1.User — id, email unique, nom, xp
  2. 2.Module — id, slug unique, titre
  3. 3.Lecon — id, titre, appartient à un Module
  4. 4.LeconTerminee — relie un User à une Lecon, avec une date, et un utilisateur ne peut terminer une leçon qu'une fois

Puis :
- lance la migration

- écris un script de peuplement (seed) créant 3 utilisateurs et 2 modules avec leurs leçons

- écris une requête qui retourne un utilisateur avec ses leçons terminées et le module de chacune

🎯

Exercice BLa page qui fait 201 requêtes SQL

Page blanche · Aucun squelette : à toi de choisir la méthode.

Page blanche. Diagnostic de performance.

Cette page affiche 200 leçons avec le nom de leur module. Elle met 4 secondes à répondre.

const lecons = await prisma.lecon.findMany({ take: 200 });

const affichage = [];
for (const lecon of lecons) {
  const module = await prisma.module.findUnique({ where: { id: lecon.moduleId } });
  affichage.push({ titre: lecon.titre, module: module.titre });
}
  1. 1.compte exactement combien de requêtes SQL partent, et explique le nom du problème
  2. 2.montre comment voir ces requêtes plutôt que de les deviner
  3. 3.corrige-le
  4. 4.mesure le gain
  5. 5.donne deux autres situations où le même problème apparaît sans boucle explicite — c'est là qu'il est vraiment dangereux

Le point 5 est le plus important : la version avec une boucle visible est la forme facile à repérer.

🤖

Question sur cette leçon ? Clique sur 💬 Demander au tuteur en bas à droite.