381 lines
10 KiB
Markdown
381 lines
10 KiB
Markdown
|
|
# 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>.
|