TP1re année17 livrables
C'est quoi une base de données ?
Derrière chaque site, chaque appli, il y a une base de données : là où sont rangées toutes les infos — utilisateurs, produits, commandes. On comprend comment c'est organisé, avant de l'interroger en SQL.
Par Josselyn C., prof de BTS SIO. Publié le , mis à jour le .
- Objectif
- comprendre tables, lignes, colonnes, types, clés, relations — et explorer une vraie base
- On manipule
- une vraie base à 2 tables qu'on crée et parcourt dans le navigateur
- Public
- débutant absolu, aucune base de données touchée avant
- Durée
- ~3 h 30 en autonomie
- Pré-requis
- aucun. On part de « pourquoi a-t-on besoin d'une base ? »
- Pour qui
- SLAM et SISR, 1re année
Compétences : C2.3 Gérer les données
On découvre la structure d'une base ; l'interroger (SQL) sera la prochaine séance.
Avant de commencer
Pourquoi les bases de données sont partout
Ton réseau social mémorise des millions de comptes et de messages. Une boutique en ligne, ses produits et commandes. GLPI (que tu as installé), tout ton parc. Tout ça vit dans une base de données : un endroit conçu pour stocker beaucoup d'informations, de façon organisée, et les retrouver vite. C'est la 2e grande compétence du développeur, après savoir construire des pages.
Ce que tu sauras faire à la fin
| Notion | Tu sauras… |
|---|---|
| Base & SGBD | dire ce qu'est une base et ce qui la gère (et ce qu'est le NoSQL) |
| Tables | lire une table (lignes, colonnes) |
| Types, NULL | comprendre les types de données et la valeur absente |
| Clés | clé primaire (identifier) et clé étrangère (relier) |
| Relations & cardinalités | voir comment les tables se relient (1-N) et le penser en MCD |
| Contraintes | les garde-fous : NOT NULL, UNIQUE, index |
| Normalisation | pourquoi on évite de répéter une info |
| Explorer & créer | créer une vraie base à 2 tables et la parcourir |
0. Pourquoi pas juste un fichier ?
On pourrait stocker des infos dans un fichier texte ou un tableur (Excel). Pour quelques lignes, ça va. Mais dès qu'il y a beaucoup de données, ou plusieurs personnes qui y accèdent en même temps, ça casse. La base de données est faite exactement pour ça.
| Avec un fichier / Excel | Avec une base de données |
|---|---|
| lent dès qu'il y a beaucoup de lignes | retrouve une info parmi des millions en un instant |
| une personne à la fois | des milliers d'accès simultanés |
| aucune règle (on met n'importe quoi) | contrôle (types, doublons interdits…) |
| pas de lien entre fichiers | tables reliées entre elles |
Flag A1
Checkpoint
Cite 2 raisons concrètes pour lesquelles un site avec beaucoup d'utilisateurs utilise une base de données plutôt qu'un fichier Excel. Rends : ta réponse.
1. Base de données & SGBD
Une base de données (BDD) est un ensemble de données organisées. Le logiciel qui la gère (stocke, protège, répond aux questions) s'appelle un SGBD (Système de Gestion de Base de Données).
| Mot | Définition |
|---|---|
| Base de données | un ensemble de données organisées et reliées |
| SGBD | le logiciel qui gère la base (MySQL, PostgreSQL, SQLite…) |
| Table | un « tableau » qui stocke un type d'information (les clients, les produits…) |
| SQL | le langage pour interroger la base (prochaine séance) |
Les SGBD que tu croiseras — et quand choisir quoi
| SGBD | Port | Architecture | Usage typique | Tu le croises où ? |
|---|---|---|---|---|
| MySQL 8 | 3306 | client-serveur | sites web, applis métier, fort trafic simultané | GLPI, GSB Ordonnances (ton projet 1A), hébergements web |
| MariaDB 10 | 3306 | client-serveur | 100 % compatible MySQL (fork libre) | Debian / Ubuntu par défaut — remplace MySQL transparentement |
| PostgreSQL 16 | 5432 | client-serveur | SQL le plus rigoureux, types avancés (JSON, géo), gros volumes | projets scientifiques, fintech, entreprises exigeantes |
| SQLite 3 | aucun (fichier local) | embarqué | apprentissage, petites applis mobiles | Firefox, Android, iOS, ce playbook |
| SQL Server | 1433 | client-serveur | éco-système Microsoft (.NET, C#, Azure) | grandes entreprises Windows / Entity Framework |
Et le « NoSQL », c'est quoi ?
Tout ce qu'on voit aujourd'hui, ce sont des bases relationnelles : des tables reliées entre elles. C'est de loin le plus répandu, et c'est le socle. Mais tu entendras parler de NoSQL (« Not Only SQL ») : une autre famille de bases qui ne range pas les données en tables.
Où vit la base ? (client-serveur)
Avec un SGBD comme MySQL, la base ne vit pas « dans l'appli » : elle vit sur un serveur, et plusieurs programmes (le client) lui parlent en même temps. C'est ça qui permet les milliers d'accès simultanés promis au début.
Les clients (appli, phpMyAdmin…) envoient leurs questions au SGBD, seul gardien de la base. Lui seul lit et écrit dans les données : il évite que deux clients se marchent dessus.
Flag A2
Checkpoint
Quelle est la différence entre une « base de données » et un « SGBD » ? Cite un exemple de SGBD. Rends : ta réponse.
2. La table : lignes & colonnes
L'unité de base, c'est la table : un tableau où chaque ligne est un enregistrement (un client, un produit…) et chaque colonne un renseignement (le nom, le prix…).
Une table « visiteur » : 3 colonnes (id, nom, ville) et 2 lignes (2 visiteurs). Chaque ligne décrit UN visiteur.
| Mot | Définition |
|---|---|
| Ligne (enregistrement) | un élément concret (un visiteur précis) |
| Colonne (champ / attribut) | un renseignement commun à tous (le nom, la ville) |
Flag A3
Checkpoint
Dans une table produit avec les colonnes id, nom, prix, stock, qu'est-ce qu'une ligne représente ? Et la colonne prix ? Rends : ta réponse.
À toi : lis une table
Entraîne-toi à lire « comme une base ». Voici une table produit d'une boutique :
| id | nom | prix | stock |
|---|---|---|---|
| 1 | Clavier | 29.90 | 12 |
| 2 | Souris | 15.00 | 0 |
| 3 | Écran 24" | 149.00 | 5 |
Flag B5
Lecture (production)
Réponds en te servant uniquement de la table : (1) combien de lignes (d'enregistrements) ? (2) combien de colonnes ? (3) quel produit n'a plus de stock ? (4) que vaut la case « prix » de la ligne dont l'id est 3 ? Rends : tes 4 réponses.
3. Les types de données
Chaque colonne a un type : il dit quelle sorte de donnée elle accepte. Ça évite de mettre « bonjour » dans un prix.
| Type | Pour quoi | Exemple |
|---|---|---|
INT (entier) | nombres entiers | un stock : 42 |
DECIMAL / FLOAT | nombres à virgule | un prix : 19.99 |
VARCHAR (texte court) | du texte (avec une longueur max) | un nom : "Dupont" |
TEXT | du texte long | une description |
DATE / DATETIME | dates et heures | 2026-09-15 |
BOOLEAN | vrai / faux | actif : true |
Les types MySQL en détail — tailles et limites exactes
| Type MySQL | Taille | Plage / limite | Quand l'utiliser |
|---|---|---|---|
TINYINT | 1 octet | -128 à 127 (ou 0-255 non signé) | statut, indicateur booléen (MySQL stocke BOOLEAN en TINYINT(1)) |
INT | 4 octets | -2 147 483 648 à +2 147 483 647 | identifiant, quantité, compteur — le choix par défaut |
BIGINT | 8 octets | ±9,2 × 10^(18) | clé primaire sur des milliards de lignes (réseaux sociaux, logs) |
DECIMAL(M,D) | variable | M chiffres au total, D après la virgule — ex. DECIMAL(10,2) pour 99 999 999.99 | montants financiers — valeur EXACTE, pas d'arrondi |
FLOAT | 4 octets | ~7 chiffres significatifs | mesures physiques approx. — ne jamais utiliser pour de l'argent |
CHAR(N) | N octets fixe | 1 à 255 caractères, toujours padé à N | code postal, code ISO (longueur toujours identique) |
VARCHAR(N) | 1 à N octets | N max 65 535 octets par ligne | nom, email, titre — longueur variable |
TEXT | jusqu'à 65 535 octets | ~65 000 caractères | commentaire, description longue |
DATE | 3 octets | 1000-01-01 à 9999-12-31 | date seule (naissance, échéance) |
DATETIME | 8 octets | 1000-01-01 00:00:00 à 9999-12-31 23:59:59 | horodatage précis (date + heure) |
NULL : la valeur absente
Parfois, on ne connaît pas une valeur : un client n'a pas donné son numéro de téléphone, une date de validation n'existe pas encore. La case reste vide. En base de données, ce vide a un nom : NULL.
NULL veut dire « pas de valeur / on ne sait pas ». Attention, ce n'est pas la même chose que 0 (le nombre zéro) ni que "" (le texte vide) :
| Valeur | Sens |
|---|---|
0 | un nombre connu : zéro (ex. un stock à 0) |
"" (chaîne vide) | un texte connu, mais vide |
NULL | aucune valeur du tout : on ne sait pas / non renseigné |
Flag A4
Checkpoint
Pour une table etudiant (id, nom, date_naissance, moyenne, boursier), propose un type adapté à chaque colonne. Rends : ta réponse.
4. La clé primaire
Problème : deux visiteurs peuvent s'appeler « Marc Dupont ». Comment les distinguer ? Avec la clé primaire : une colonne dont la valeur est unique pour chaque ligne — souvent un id qui s'incrémente automatiquement.
| id | nom | ville |
|---|---|---|
| 1 | Marc Dupont | Lyon |
| 2 | Marc Dupont | Paris |
Même nom, mais l'id (1 et 2) les distingue sans ambiguïté.
Comment l'id est généré automatiquement
En pratique, tu ne tapes jamais l'id à la main : le SGBD l'attribue seul. Deux mécanismes courants :
| Mécanisme | Syntaxe MySQL | Syntaxe SQLite | Exemple de valeur |
|---|---|---|---|
| AUTO_INCREMENT | id INT AUTO_INCREMENT PRIMARY KEY | id INTEGER PRIMARY KEY (auto par défaut) | 1, 2, 3, 4… (entier croissant) |
| UUID | id CHAR(36) DEFAULT (UUID()) | généré côté application | 550e8400-e29b-41d4-a716-446655440000 |
Flag A5
Checkpoint
Pourquoi a-t-on besoin d'une clé primaire, et pourquoi le nom n'est-il pas un bon choix de clé primaire ? Rends : ta réponse.
5. Relier les tables
La force d'une base, c'est de relier plusieurs tables. Exemple GSB : une table visiteur et une table frais (les notes de frais). Chaque frais appartient à un visiteur.
La table « frais » contient une clé étrangère id_visiteur qui pointe vers la clé primaire de « visiteur ». C'est ce lien qui dit « ce frais appartient à ce visiteur ».
Flag A6
Checkpoint
Dans une base avec client et commande, où mettrais-tu une clé étrangère, et vers quoi pointerait-elle ? Rends : ta réponse (et ce que ça permet d'éviter).
6. Les cardinalités : combien pour combien ?
On vient de relier visiteur et frais. Mais dans quel sens ? Un visiteur a-t-il un seul frais, ou plusieurs ? Et un frais, appartient-il à un ou à plusieurs visiteurs ? Cette « quantité de chaque côté » s'appelle la cardinalité.
Dans GSB, c'est clair : un visiteur engage plusieurs frais (un repas, un péage, un hôtel…), mais chaque frais appartient à un seul visiteur. On dit que c'est une relation « un à plusieurs », notée 1-N (1 d'un côté, N — « plusieurs » — de l'autre).
Le visiteur 1 (Marc) est relié à 3 frais. Côté visiteur = 1, côté frais = N. La clé étrangère id_visiteur (toujours égale à 1 ici) matérialise ce lien.
| Cardinalité | Exemple | Où va la clé étrangère ? |
|---|---|---|
| 1-N (un à plusieurs) | un visiteur → plusieurs frais | côté « plusieurs » (dans frais) |
| 1-1 (un à un) | une personne → une seule carte d'identité | d'un côté ou l'autre |
| N-N (plusieurs à plusieurs) | des étudiants ↔ des cours suivis | dans une 3e table dédiée (à voir plus tard) |
Flag A7
Checkpoint
Une bibliothèque : un auteur écrit plusieurs livres, mais chaque livre a un seul auteur. Quelle cardinalité ? Dans quelle table mets-tu la clé étrangère, et comment l'appelles-tu ? Rends : ta réponse.
7. Penser la base avant de la créer (Merise)
Avant de créer des tables, les pros dessinent la base sur papier. La méthode française pour ça s'appelle Merise (tu la reverras toute l'année). Elle tient en 3 mots.
| Mot Merise | Ce que c'est | Exemple GSB | Devient, dans la base… |
|---|---|---|---|
| Entité | une « chose » dont on stocke des infos | un visiteur, un frais | une table |
| Attribut | une info de cette chose | nom, ville, montant | une colonne |
| Association | le lien entre deux entités | un visiteur « engage » des frais | une clé étrangère (1-N) |
Le dessin qu'on fait avant de coder s'appelle le MCD (Modèle Conceptuel de Données) : des rectangles (entités) reliés par des associations, avec les cardinalités. C'est la « carte » de la base.
2 entités (VISITEUR, FRAIS), 1 association (« engage »). 1,n côté visiteur = un visiteur engage de 1 à plusieurs frais ; 1,1 côté frais = un frais appartient à exactement un visiteur.
Flag B3
Production (modélisation)
Dessine (sur papier ou texte) le MCD d'une mini-bibliothèque : entités auteur et livre, leurs attributs, l'association entre elles et les cardinalités. Rends : ton schéma (2 entités + association + cardinalités).
8. Exemple guidé : du besoin aux tables
On a tous les outils (entités, attributs, relations, cardinalités, clés). On les met bout à bout sur un cas neuf, pas GSB, pour apprendre à transformer un besoin écrit en français en une vraie structure de base.
Étape 1 — Repérer les entités (→ les tables)
On souligne les « choses » dont on stocke des infos. Ici : étudiant et emprunt. Deux entités → deux tables : etudiant et emprunt.
Étape 2 — Lister les attributs (→ les colonnes)
| Entité | Attributs |
|---|---|
etudiant | id, nom, classe |
emprunt | id, titre_livre, date_emprunt |
Étape 3 — Trouver la relation et sa cardinalité
« Un étudiant emprunte plusieurs livres » et « un emprunt concerne un seul étudiant » → relation 1-N entre etudiant (côté 1) et emprunt (côté N).
Étape 4 — Placer la clé étrangère
Règle du chapitre 6 : la clé étrangère va du côté N. On ajoute donc id_etudiant dans emprunt, qui pointe vers etudiant(id).
Étape 5 — Le MLD final (les tables prêtes)
| Table | Colonne | Type | Clé |
|---|---|---|---|
etudiant | id | INT | clé primaire |
nom | VARCHAR | NOT NULL | |
classe | VARCHAR | — | |
emprunt | id | INT | clé primaire |
titre_livre | VARCHAR | NOT NULL | |
date_emprunt | DATE | — | |
id_etudiant | INT | clé étrangère → etudiant(id) |
Flag B4
Production (modélisation guidée)
Même travail pour ce besoin : « Un cinéma a plusieurs salles (numéro, nombre de places). Dans chaque salle se déroulent plusieurs séances (film, horaire). Une séance a lieu dans une seule salle. »
Rends : les 2 entités, leurs attributs, la cardinalité, où va la clé étrangère, et le MLD (tableau Table / Colonne / Type / Clé).
9. Éviter les répétitions : la normalisation
Pourquoi a-t-on séparé visiteur et frais en deux tables, au lieu de tout mettre dans une seule ? Regarde ce qui se passe si on entasse tout dans frais :
| id | montant | nom_visiteur | ville_visiteur |
|---|---|---|---|
| 1 | 45 | Marc Dupont | Lyon |
| 2 | 12 | Marc Dupont | Lyon |
| 3 | 80 | Sophie Martin | Paris |
« Marc Dupont » et « Lyon » sont recopiés à chaque ligne. Avec 500 frais pour Marc, c'est 500 fois la même chose. Trois problèmes :
La solution, c'est ce qu'on a fait : une table visiteur (Marc écrit une seule fois) et une table frais qui ne garde que son id_visiteur. Si Marc déménage, on change une seule case.
Les 3 formes normales (1FN, 2FN, 3FN) — les règles des pros
La normalisation a des règles précises. En pratique on vise la 3FN sur tout projet sérieux :
| Forme | La règle | Violation type | Correction |
|---|---|---|---|
| 1FN | Chaque case = une seule valeur atomique (pas de liste, pas de colonnes répétitives) | telephones = "0612…, 0788…" ou colonnes tel1, tel2, tel3 | table telephone (id, id_personne, numero) reliée par FK |
| 2FN | Toutes les colonnes non-clé dépendent de la clé entière (utile si la clé est composite) | Table commande_produit(id_cmd, id_prod, nom_produit) — nom_produit dépend seulement de id_prod, pas de la paire | Sortir nom_produit dans une table produit |
| 3FN | Pas de dépendance entre colonnes non-clé (une colonne ne doit pas dépendre d'une autre colonne non-clé) | Table employe(id, code_postal, ville) — ville dépend de code_postal, pas de l'id | Sortir code_postal, ville dans une table code_postal |
Flag A8
Checkpoint
Une table commande (id, produit, prix, nom_client, email_client) répète le client à chaque commande. Comment la découperais-tu pour normaliser ? Rends : les tables que tu créerais et le lien entre elles.
À toi : repère les défauts
Voici une table inscription mal conçue pour un club de sport. Lis-la en analyste : qu'est-ce qui cloche ?
| id | membre | tel_membre | activite | jour |
|---|---|---|---|---|
| 1 | Léa Roy | 0612… | Judo | lundi |
| 2 | Léa Roy | 0612… | Natation | jeudi |
| 3 | Tom Fer | 0788… | Judo | lundi |
Indices de réflexion : qui est recopié ? Que se passe-t-il si Léa change de téléphone ? Combien de fois « Judo / lundi » est-il écrit ?
Flag B6
Analyse
Liste au moins 2 défauts de cette table, puis propose un découpage en plusieurs tables reliées (membre, activité, inscription) avec les clés. Rends : les défauts repérés + ton nouveau schéma.
10. Les garde-fous : contraintes & index
Une base sérieuse ne se contente pas de stocker : elle fait respecter des règles pour que les données restent justes. Ces règles s'appellent des contraintes d'intégrité.
| Contrainte | Ce qu'elle impose | Exemple |
|---|---|---|
NOT NULL | la valeur est obligatoire (pas de vide) | un visiteur doit avoir un nom |
UNIQUE | pas deux lignes avec la même valeur | deux comptes ne peuvent partager un email |
PRIMARY KEY | UNIQUE + NOT NULL : l'identifiant | la colonne id |
FOREIGN KEY | doit pointer vers une ligne existante | id_visiteur doit exister dans visiteur |
CHECK | une règle sur la valeur | montant > 0 |
Les messages d'erreur exacts à connaître par cœur
| Contrainte violée | Message MySQL exact (numéro d'erreur) | Ce que ça signifie |
|---|---|---|
NOT NULL | Column 'nom' cannot be null (1048) | tu as inséré sans fournir de valeur pour une colonne obligatoire |
UNIQUE | Duplicate entry 'test@gsb.fr' for key 'email' (1062) | cette valeur existe déjà dans la colonne UNIQUE |
PRIMARY KEY | Duplicate entry '1' for key 'PRIMARY' (1062) | id déjà utilisé — résolu en laissant faire AUTO_INCREMENT |
FOREIGN KEY (INSERT) | Cannot add or update a child row: a foreign key constraint fails (1452) | l'id référencé n'existe pas dans la table parent |
FOREIGN KEY (DELETE) | Cannot delete or update a parent row: a foreign key constraint fails (1451) | on tente de supprimer un parent qui a encore des enfants |
L'index : pour aller (très) vite
Dernier mot à connaître : l'index. Quand une table grossit (des millions de lignes), retrouver « tous les frais du visiteur 1 » peut devenir lent. Un index accélère ces recherches.
| Situation | Sans index (parcours complet) | Avec index B-tree (logarithmique) |
|---|---|---|
| 1 000 lignes, recherche par email | 1 000 comparaisons | ~10 comparaisons |
| 1 000 000 lignes, recherche par email | 1 000 000 comparaisons | ~20 comparaisons |
| Règle | L'index B-tree fonctionne en O(log n) : chaque doublement de la table n'ajoute qu'une comparaison supplémentaire |
Et si tout se perd ? La sauvegarde
Une base, c'est précieux : un disque qui lâche ou une fausse manip peut tout effacer. On en fait donc des sauvegardes régulières. La forme la plus courante s'appelle un dump.
Flag A9
Checkpoint
Sur une table compte (id, email, mot_de_passe), quelle contrainte mets-tu sur email pour empêcher deux comptes identiques ? Et laquelle garantit qu'un email est toujours renseigné ? Rends : tes deux réponses.
Flag E1
Extension
Dans sqliteonline, exporte ta base (menu Export) en fichier .sql, ouvre-le et regarde son contenu. Rends : à quoi ressemblent les premières lignes, et explique en une phrase pourquoi ce fichier suffit à tout reconstruire.
11. Explorer ET créer une vraie base
Assez de théorie : on ouvre un outil, on crée une vraie base à 2 tables (visiteur + frais), on y met des données, et on la parcourt. Tout dans le navigateur, sans rien installer.
Étape 1 — Ouvrir l'outil
Va sur sqliteonline.com (un bac à sable de base de données qui marche dans le navigateur, sans installation). Tu vois trois zones : à gauche l'arbre des tables (vide pour l'instant), au centre une zone blanche où taper du SQL, et un bouton Run (▶) pour l'exécuter.
Étape 2 — Créer la table « visiteur »
Dans la zone centrale, tape ceci puis clique Run :
CREATE TABLE visiteur (
id INTEGER PRIMARY KEY,
nom TEXT NOT NULL,
ville TEXT
);
Étape 3 — Créer la table « frais » (avec la clé étrangère)
CREATE TABLE frais (
id INTEGER PRIMARY KEY,
montant REAL NOT NULL,
date_frais TEXT,
id_visiteur INTEGER,
FOREIGN KEY (id_visiteur) REFERENCES visiteur(id)
);
Étape 4 — Remplir les tables (les données)
INSERT INTO visiteur (id, nom, ville) VALUES
(1, 'Marc Dupont', 'Lyon'),
(2, 'Sophie Martin','Paris');
INSERT INTO frais (id, montant, date_frais, id_visiteur) VALUES
(1, 45.00, '2026-09-15', 1),
(2, 12.50, '2026-09-16', 1),
(3, 80.00, '2026-09-17', 2);
Étape 5 — Regarder ce qu'on a créé
SELECT * FROM frais;
id | montant | date_frais | id_visiteur
1 | 45.0 | 2026-09-15 | 1
2 | 12.5 | 2026-09-16 | 1
3 | 80.0 | 2026-09-17 | 2
Étape 6 — Parcourir dans l'arbre
À gauche, l'arbre montre maintenant tes 2 tables. Déplie frais : tu vois ses colonnes (id, montant, date_frais, id_visiteur). Clique sur le nom de la table pour afficher son contenu. Repère pour chaque table : ses colonnes, sa clé primaire (id), le nombre de lignes, et — pour frais — la clé étrangère.
Étape 7 — Voir la relation fonctionner
Petit avant-goût de SQL (la prochaine séance) pour prouver que la clé étrangère relie bien les données : « montre-moi tous les frais du visiteur n°1 ».
SELECT * FROM frais WHERE id_visiteur = 1;
id | montant | date_frais | id_visiteur
1 | 45.0 | 2026-09-15 | 1
2 | 12.5 | 2026-09-16 | 1
Tu obtiens 2 lignes : les 2 frais de Marc, et pas celui de Sophie. C'est exactement ce que promettait la relation 1-N : retrouver tout ce qui appartient à un visiteur, sans avoir recopié son nom nulle part.
SQLite vs MySQL — les différences à retenir pour GSB Ordonnances
| Sujet | SQLite (ce playbook) | MySQL (GSB Ordonnances) |
|---|---|---|
| Texte court | TEXT | VARCHAR(N) — ex. VARCHAR(100) pour un nom |
| Nombre à virgule | REAL | DECIMAL(8,2) (exact, pour les montants) |
| Entier auto-incrémenté | id INTEGER PRIMARY KEY | id INT AUTO_INCREMENT PRIMARY KEY |
| Booléen | INTEGER (0 / 1) | TINYINT(1) ou BOOLEAN (alias) |
| FK actives par défaut ? | NON — il faut PRAGMA foreign_keys = ON; | OUI (moteur InnoDB) |
| Connexion réseau | (fichier local, pas de réseau) | Server=localhost;Port=3306;Database=gsb_ordonnances;Uid=gsb;Pwd=gsbpass; |
Flag B1
Production (exploration)
Crée la base ci-dessus, puis explore-la. Rends : pour visiteur ET pour frais — la liste des colonnes, la clé primaire, le nombre de lignes, et (pour frais) le nom de la clé étrangère et la table qu'elle vise. Capture l'écran du résultat de SELECT * FROM frais;.
12. Mini-projet : concevoir TA base
Tu joues maintenant l'analyste-développeur : tu conçois une base à 2 tables reliées sur un thème de ton choix (autre que GSB), tu la crées dans l'outil, et tu la documentes — comme un vrai projet.
Choisis un thème
Par exemple : artiste / album, équipe / joueur, client / commande, auteur / livre… L'important : une relation 1-N (un côté « 1 », un côté « plusieurs »).
La mission (dans sqliteonline)
- Décide tes 2 entités et leurs attributs (au moins 3 colonnes par table), avec un type par colonne.
- Choisis la clé primaire de chacune (un
id INTEGER PRIMARY KEY). - Place la clé étrangère du bon côté (le « N ») et fais-la pointer vers l'autre table.
- Écris les
CREATE TABLE(avecNOT NULLsur ce qui est obligatoire) et exécute-les. - Ajoute au moins 2 lignes par table avec
INSERT, dont un côté « 1 » qui possède plusieurs lignes côté « N ». - Vérifie avec
SELECT * FROM ...;sur tes deux tables.
Flag B2
Mini-projet (production)
Crée ta base à 2 tables dans l'outil. Rends : (1) le MCD (2 entités + association + cardinalités), (2) ton code SQL complet (CREATE + INSERT), (3) une capture du SELECT de chaque table montrant la relation 1-N. C'est exactement le genre de base que tu manipuleras dans le projet AP (GLPI/GSB).
Chapitre 12 bis — La base GSB Ordonnances vue de l'intérieur
Tu connais maintenant les tables, les types, les clés, les relations et la normalisation. Voici la base réelle de ton projet de l'année — GSB Ordonnances — lue avec ces outils.
Les entités et leurs colonnes clés
| Table | Rôle | Colonnes principales | Type MySQL |
|---|---|---|---|
personne | données communes à tout utilisateur | id, nom, prenom, login, mdp | INT / VARCHAR(50) / VARCHAR(50) / VARCHAR(25) / VARCHAR(255) (hash !) |
medecin | spécialisation de personne pour les médecins | id (FK→personne), numAdeli, specialite | INT / CHAR(9) / VARCHAR(50) |
patient | patients des ordonnances | id, nom, prenom, dateNaissance, numSecu | INT / VARCHAR(50) / VARCHAR(50) / DATE / CHAR(15) |
ordonnance | lie un médecin à un patient | id, date, id_medecin (FK), id_patient (FK) | INT / DATE / INT / INT |
medicament | catalogue des médicaments prescrits | id, nom, dosage | INT / VARCHAR(100) / VARCHAR(50) |
ligne_ordonnance | table de liaison N-N (ordonnance ↔ médicament) | id_ordonnance (FK), id_medicament (FK), quantite | INT / INT / INT |
GSB Ordonnances : 6 tables, des relations 1-1, 1-N et N-N. Tout ce que tu as appris dans ce playbook, en vrai.
13. Les pièges du débutant
Avant de refermer, les 4 erreurs de conception que tout le monde fait au début. Les connaître, c'est déjà ne plus les commettre. Pour chacune : le piège, pourquoi c'est mauvais, et la bonne réflexe.
Flag B7
Diagnostic
Reprends ta base du Flag B2 (ton mini-projet) et vérifie qu'elle ne tombe dans aucun de ces 4 pièges. Rends : pour chaque piège, une phrase disant pourquoi ta base est OK (ou ce que tu as corrigé).
Pour finir
Ton antisèche (le vocabulaire)
| Mot | En un mot |
|---|---|
| Base de données | des données organisées |
| SGBD | le logiciel qui les gère (MySQL, SQLite…) |
| Table | un tableau pour un type d'info |
| Ligne / Colonne | un enregistrement / un champ |
| Type | la sorte de donnée d'une colonne (INT, VARCHAR, DATE…) |
| NULL | valeur absente (≠ 0, ≠ texte vide) |
| Clé primaire | l'identifiant unique d'une ligne |
| Clé étrangère | le lien vers une autre table |
| Cardinalité | combien de chaque côté (1-N, 1-1, N-N) |
| MCD (Merise) | le plan : entités + associations + cardinalités |
| Normalisation | chaque info à un seul endroit (pas de répétition) |
| Contrainte | une règle imposée (NOT NULL, UNIQUE…) |
| Index | repérage pour chercher vite |
Vérifie tes acquis
- Pourquoi une base de données plutôt qu'un fichier Excel pour beaucoup de données ?
- Différence entre une base de données et un SGBD ?
- Dans une table, qu'est-ce qu'une ligne ? une colonne ?
- À quoi sert le type d'une colonne ? Et que veut dire NULL ?
- À quoi sert la clé primaire ?
- Qu'est-ce qu'une clé étrangère, et que permet-elle ?
- Une relation 1-N : de quel côté place-t-on la clé étrangère ?
- Pourquoi normalise-t-on (séparer en plusieurs tables) ?
- Cite deux contraintes d'intégrité et ce qu'elles imposent.
Glossaire
| Mot | Définition |
|---|---|
| Base de données (BDD) | un ensemble de données organisées et reliées |
| SGBD | le logiciel qui gère la base (MySQL, PostgreSQL, SQLite) |
| Table | un tableau stockant un type d'information |
| Ligne / enregistrement | un élément concret de la table |
| Colonne / champ | un renseignement commun à toutes les lignes |
| Type de données | la sorte de valeur acceptée (INT, VARCHAR, DATE…) |
| NULL | l'absence de valeur (différent de 0 et du texte vide) |
| Clé primaire | la colonne qui identifie une ligne de façon unique |
| Clé étrangère | une colonne qui pointe vers la clé primaire d'une autre table |
| Cardinalité | le nombre d'éléments de chaque côté d'une relation (1-N, 1-1, N-N) |
| Entité / attribut / association | vocabulaire Merise : une « chose » / une de ses infos / le lien entre deux |
| MCD | Modèle Conceptuel de Données : le plan d'une base (entités + associations) |
| Normalisation | organiser les tables pour qu'une info ne soit écrite qu'à un seul endroit |
| Contrainte d'intégrité | règle imposée par le SGBD (NOT NULL, UNIQUE, FOREIGN KEY…) |
| Index | structure de repérage qui accélère les recherches |
| NoSQL | famille de bases sans tables (ex. MongoDB, à voir en 2A) |