ajout de tous les cours et TP préparés cet été

This commit is contained in:
2026-01-17 23:10:49 +01:00
parent ed9415bc81
commit 301cf5a98f
125 changed files with 21614 additions and 542 deletions

380
BDD_SGBD/TP_StreamFlix.md Normal file
View File

@@ -0,0 +1,380 @@
# TP : Modéliser StreamFlix - La base de données d'une plateforme de streaming
> **Thème** : Conception de bases de données et schémas relationnels
---
## Contexte
En 2026, les plateformes de streaming (Netflix, Disney+, Prime Video, Apple TV+) dominent le marché du divertissement. Derrière leurs interfaces élégantes se cachent des **bases de données massives** qui gèrent des millions d'utilisateurs, de contenus et de visionnages.
Vous êtes embauché(e) comme stagiaire chez **StreamFlix**, une nouvelle plateforme de streaming française qui veut concurrencer les géants américains. Votre mission : **concevoir la base de données** qui fera tourner la plateforme.
---
## Partie 1 : Analyse des besoins
### Les fonctionnalités de StreamFlix
La plateforme doit permettre :
- Aux utilisateurs de **créer un compte** et de **s'abonner**
- De **parcourir un catalogue** de films et séries
- De **regarder** des contenus et de **reprendre** là où on s'est arrêté
- De créer une **liste de favoris** ("Ma Liste")
- De **noter** les contenus (1 à 5 étoiles)
### Exercice 1 : Identifier les entités
À partir de la description ci-dessus, identifiez les **entités** principales de la base de données.
**Indice** : Une entité est un "objet" du monde réel qu'on souhaite représenter. Pensez aux noms communs dans la description.
---
## Partie 2 : Le Modèle Entité-Association
### Exercice 2 : Définir les attributs
Pour chaque entité identifiée, listez les **attributs** pertinents.
**Exemple** :
```
Entité : Utilisateur
Attributs : ID, Email, Mot_de_passe, Nom, Prénom, Date_naissance, Date_inscription
```
Faites de même pour :
- Film
- Série
- Épisode
- Abonnement
### Exercice 3 : Identifier les associations
Quelles sont les **relations** entre les entités ? Pour chaque relation, précisez :
- Les entités concernées
- Le nom de l'association
- Les **cardinalités** (1-1, 1-n, n-n)
**Exemple** :
```
Utilisateur ---< possède >--- Abonnement
Cardinalités : Un utilisateur possède 0 ou 1 abonnement actif.
Un abonnement appartient à 1 et 1 seul utilisateur.
→ Relation 1-1
```
### Exercice 4 : Dessiner le MCD
Représentez le **Modèle Conceptuel de Données** complet sous forme de schéma.
Utilisez la notation suivante :
```
┌─────────────┐ ┌─────────────┐
│ ENTITE1 │ │ ENTITE2 │
├─────────────┤ 1,n ├─────────────┤
│ #clé │◄───────►│ #clé │
│ attribut1 │ nom │ attribut1 │
│ attribut2 │ │ attribut2 │
└─────────────┘ └─────────────┘
```
---
## Partie 3 : Du MCD au Schéma Relationnel
### Rappel des règles de conversion
| Élément MCD | Conversion en relationnel |
|-------------|---------------------------|
| Entité | Table |
| Attribut | Colonne |
| Association 1-1 | Clé étrangère dans l'une des tables |
| Association 1-n | Clé étrangère côté "n" |
| Association n-n | Table de liaison |
### Exercice 5 : Convertir en schéma relationnel
Transformez votre MCD en **schéma relationnel**. Utilisez la notation :
```
NomTable(#cle_primaire, attribut1, attribut2, cle_etrangere*)
```
**Convention** :
- `#` indique la clé primaire
- `*` indique une clé étrangère
---
## Partie 4 : La gestion des visionnages
### Le problème
StreamFlix veut permettre aux utilisateurs de **reprendre un contenu là où ils l'ont arrêté**. Il faut donc enregistrer :
- Quel utilisateur a regardé quel contenu
- À quelle date/heure
- Jusqu'à quelle minute du contenu
- Si le visionnage est terminé ou non
### Exercice 6 : Modéliser les visionnages
1. Créez une entité/table `Visionnage` avec les attributs appropriés.
2. Quelles sont les clés étrangères nécessaires ?
3. Quelle est la clé primaire de cette table ?
**Réflexion** : Un utilisateur peut-il regarder le même contenu plusieurs fois ? Comment gérer ce cas ?
---
## Partie 5 : Les contraintes d'intégrité
### Exercice 7 : Identifier les contraintes
Pour chaque table de votre schéma, identifiez :
- Les contraintes d'**intégrité d'entité** (clé primaire unique et non nulle)
- Les contraintes d'**intégrité référentielle** (clés étrangères valides)
- Les contraintes de **domaine** (types de données, valeurs autorisées)
**Exemple** :
```
Table Utilisateur :
- ID_Utilisateur : entier, clé primaire, non nul, unique
- Email : chaîne, non nul, unique, format email valide
- Date_naissance : date, non nul, doit être dans le passé
```
### Exercice 8 : Que se passe-t-il si...
Répondez aux questions suivantes en justifiant :
1. On essaie d'insérer un utilisateur avec un email déjà existant ?
2. On essaie de supprimer un film qui a été visionné par des utilisateurs ?
3. On essaie d'ajouter un visionnage pour un utilisateur qui n'existe pas ?
---
## Partie 6 : Normalisation
### Exercice 9 : Vérifier la normalisation
Voici une proposition de table pour gérer les séries :
| ID_Serie | Titre | Genre | Nb_Saisons | Acteur1 | Acteur2 | Acteur3 |
|----------|-------|-------|------------|---------|---------|---------|
| 1 | Stranger Things | SF | 5 | Millie Bobby Brown | Finn Wolfhard | Gaten Matarazzo |
| 2 | The Crown | Drame | 6 | Claire Foy | Olivia Colman | Imelda Staunton |
1. Cette table est-elle en **1NF** ? Pourquoi ?
2. Proposez un schéma **normalisé** pour gérer les séries et leurs acteurs.
---
## Partie 7 : Schéma final
### Exercice 10 : Synthèse
Proposez le **schéma relationnel complet** de StreamFlix avec :
- Toutes les tables
- Toutes les clés (primaires et étrangères)
- Les types de données principaux
### Exemple de format attendu
```
Utilisateurs(
#ID_Utilisateur INT,
Email VARCHAR(255) UNIQUE NOT NULL,
Mot_de_passe VARCHAR(255) NOT NULL,
Nom VARCHAR(100),
Prénom VARCHAR(100),
Date_naissance DATE,
Date_inscription DATE DEFAULT CURRENT_DATE
)
Films(
#ID_Film INT,
Titre VARCHAR(255) NOT NULL,
...
)
...
```
---
## Bonus : Pour aller plus loin
### Réflexion 1 : L'algorithme de recommandation
Netflix utilise un algorithme de recommandation basé sur :
- Les contenus déjà visionnés
- Les notes attribuées
- Les contenus similaires (même genre, mêmes acteurs)
Quelles informations de notre base de données seraient utiles pour cet algorithme ?
### Réflexion 2 : Passage à l'échelle
StreamFlix a maintenant 10 millions d'utilisateurs et chacun regarde en moyenne 2 contenus par jour.
1. Combien d'enregistrements sont ajoutés dans la table `Visionnage` chaque jour ?
2. Quels problèmes cela peut-il poser ?
3. Avez-vous entendu parler des bases de données **NoSQL** ? Pourquoi pourraient-elles être utiles ici ?
---
## Résumé des notions travaillées
| Notion | Application dans ce TP |
|--------|------------------------|
| Entité | Utilisateur, Film, Série, etc. |
| Attribut | Email, Titre, Durée, etc. |
| Association | "regarde", "possède", etc. |
| Clé primaire | ID_Utilisateur, ID_Film |
| Clé étrangère | ID_Utilisateur dans Visionnage |
| Cardinalités | 1-1, 1-n, n-n |
| Contraintes d'intégrité | Unicité, référence, domaine |
| Normalisation | Éviter la redondance |
---
## Annexe : Schéma relationnel de référence (corrigé)
<details>
<summary>Cliquez pour afficher le corrigé</summary>
```
Utilisateurs(
#ID_Utilisateur,
Email,
Mot_de_passe,
Nom,
Prenom,
Date_naissance,
Date_inscription
)
Abonnements(
#ID_Abonnement,
Type, -- "Basic", "Standard", "Premium"
Prix_mensuel,
Date_debut,
Date_fin,
ID_Utilisateur*
)
Films(
#ID_Film,
Titre,
Annee,
Duree_minutes,
Synopsis,
ID_Genre*
)
Series(
#ID_Serie,
Titre,
Annee_debut,
Annee_fin,
Synopsis,
ID_Genre*
)
Episodes(
#ID_Episode,
Numero_saison,
Numero_episode,
Titre,
Duree_minutes,
ID_Serie*
)
Genres(
#ID_Genre,
Nom_genre
)
Acteurs(
#ID_Acteur,
Nom,
Prenom,
Date_naissance
)
Films_Acteurs(
#ID_Film*,
#ID_Acteur*,
Role
)
Series_Acteurs(
#ID_Serie*,
#ID_Acteur*,
Role
)
Visionnages(
#ID_Visionnage,
Date_heure,
Minute_arret,
Est_termine,
ID_Utilisateur*,
ID_Film*, -- NULL si c'est un épisode
ID_Episode* -- NULL si c'est un film
)
MaListe(
#ID_Utilisateur*,
#ID_Film*, -- ou ID_Serie selon le contenu
Date_ajout
)
Notes(
#ID_Utilisateur*,
#ID_Film*, -- ou ID_Serie
Note, -- 1 à 5
Date_note
)
```
**MCD correspondant** :
```
┌──────────────┐ 1,1 ┌──────────────┐
│ UTILISATEUR │◄────────────┤ ABONNEMENT │
├──────────────┤ possède ├──────────────┤
│ #ID │ │ #ID │
│ Email │ │ Type │
│ Nom │ │ Prix │
└──────┬───────┘ └──────────────┘
│ 0,n
▼ 0,n ┌──────────────┐
REGARDE ─────────────────► │ FILM │
│ ├──────────────┤
│ │ #ID │
│ │ Titre │
│ 0,n │ Duree │
│ └──────────────┘
┌──────────────┐
│ EPISODE │◄──── appartient ──── SERIE
├──────────────┤ 1,n
│ #ID │
│ Numero │
│ Titre │
└──────────────┘
```
</details>
---
Auteur : Florian Mathieu
Licence CC BY NC
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.