SAE 2.04

Exploitation d'une base de données

Conception et exploitation d'une base de données relationnelle sur le thème du ski alpin

📅 Mai 2025 👥 Travail en équipe 🗄️ Base de données 💻 SQL / PostgreSQL

Aperçu du projet

🎯 Mission

Concevoir et exploiter une base de données relationnelle complète pour gérer les compétitions de ski alpin, avec modélisation MERISE et requêtes SQL avancées.

👥 Équipe

Groupe de 3 : Lucas Lafosse, Donovan Prevost, Joshua Hermilly

📊 Résultats

7 tables avec contraintes d'intégrité
20+ requêtes complexes avec jointures
Vues et fonctions SQL avancées

Présentation du projet

Cette SAE (Situation d'Apprentissage et d'Évaluation) nous a permis de mettre en pratique nos connaissances en bases de données relationnelles. Le projet portait sur la conception et l'exploitation d'une base de données pour gérer les informations liées aux compétitions de ski alpin.

Nous avons travaillé en équipe de 3 personnes (Lucas Lafosse, Donovan Prevost, Joshua Hermilly) pour concevoir un modèle de données cohérent, implémenter la base en SQL et réaliser des requêtes complexes pour exploiter les données.

🎯 Objectifs

  • Concevoir un modèle de données relationnel
  • Implémenter une base de données en SQL
  • Créer des requêtes d'exploitation complexes
  • Travailler en équipe sur un projet technique

🛠️ Technologies utilisées

  • PostgreSQL pour la base de données
  • SQL pour les requêtes
  • Modélisation avec MERISE
  • Git pour le versioning (travail collaboratif)

Modélisation conceptuelle

La première étape de notre projet était de concevoir un modèle conceptuel de données (MCD) pour représenter fidèlement le domaine des compétitions de ski alpin.

📊 Schéma MCD

🏔️ Modèle Conceptuel de Données

Entités : Station, Skieur, Competition, Discipline

Relations : Qualification, Lieu, Classement

Schéma MCD de la base de données ski alpin

Algèbre relationnelle

Voici quelques exemples de requêtes exprimées en algèbre relationnelle, montrant les opérations fondamentales sur notre base de données.

Sélection des stations françaises :

σpays='France'(Station)

Projection des noms de skieurs suisses :

πnomSkieur,prenomSkieurnationalite='Suisse'(Skieur))

Jointure : Skieurs ayant participé à Saalbach-2025 :

πnomSkieur,prenomSkieur( Skieur ⋈idSkieurnomCompetition='Saalbach-2025'(Competition) ⋈idCompt Classement) )

Architecture de la base de données

Notre base de données modélise un système de gestion des compétitions de ski alpin avec les entités suivantes :

🏔️ Station

Stations de ski avec altitude et pays

  • idStation (PK)
  • nomStation
  • altitude
  • pays

🎿 Skieur

Informations sur les skieurs participants

  • idSkieur (PK)
  • nomSkieur
  • prenomSkieur
  • nationalite

🏆 Competition

Compétitions organisées

  • idCompt (PK)
  • nomCompetition
  • dateDebut

⛷️ Discipline

Disciplines du ski alpin

  • idDiscipline (PK)
  • libelle (Descente, Super-G, Slalom...)

🔗 Relations principales

  • Qualification : Relation N-N entre Skieur et Discipline
  • Lieu : Relation N-N entre Competition et Station
  • Classement : Relation ternaire entre Competition, Skieur et Discipline avec le rang

Réalisations techniques

1️⃣ Création des tables

Implémentation complète du schéma avec contraintes d'intégrité

-- Exemple : Table Station avec contraintes
create table station (
    idStation   integer primary key,
    nomStation  varchar(50) not null,
    altitude    integer not null check (altitude > 0),
    pays        varchar(30) not null
);

2️⃣ Initialisation des données

Insertion de données réalistes pour tester la base

-- Exemple : Insertion des stations
insert into station (idStation, nomStation, altitude, pays) values
    (1, 'Chamonix-Mont Blanc', 3842, 'France'),
    (2, 'Valloire', 2600, 'France'),
    (3, 'Val Cenis', 2800, 'France');

3️⃣ Requêtes d'exploitation

Requêtes complexes avec jointures, agrégations et sous-requêtes

-- Exemple : Skieurs ayant participé à toutes les compétitions
select sk.nomSkieur, sk.prenomSkieur, sk.nationalite
from skieur as sk
inner join classement as cl on cl.idSkieur = sk.idSkieur
group by sk.idSkieur, sk.nomSkieur, sk.nationalite
having count(distinct cl.idCompt) = (select count(*) from competition);