ajout de tous les cours et TP préparés cet été
This commit is contained in:
380
BDD_SGBD/TP_StreamFlix.md
Normal file
380
BDD_SGBD/TP_StreamFlix.md
Normal 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>.
|
||||
Reference in New Issue
Block a user