# 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é)
Cliquez pour afficher le corrigé ``` 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 │ └──────────────┘ ```
--- Auteur : Florian Mathieu Licence CC BY NC Licence Creative Commons
Ce cours est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.