3. Réseau de transports en commun¶
Modèles logiques¶
Créez un diagramme EA pour la base de données d’un réseau de transports en commun, basé sur les informations données ci-dessous.
Partie 1¶
- Le réseau de transports en commun comprend différents types de véhicules : bus, métros et tramways.
- Chaque véhicule a un numéro d’identification unique, une capacité de passagers et une date de mise en service.
- Le réseau est composé de plusieurs lignes. Chaque ligne a un numéro, un nom et un type (bus, métro ou tramway).
- Chaque ligne dessert plusieurs arrêts. Un arrêt a un nom, une adresse et des coordonnées géographiques.
- Les conducteurs sont affectés aux véhicules. Un conducteur a un numéro d’employé, un nom, un prénom et une date d’embauche.
Code
@startuml
entity Vehicule {
* numero_identification : string
--
capacite_passagers : integer
date_mise_en_service : date
type : enum {bus, metro, tramway}
}
entity Ligne {
* numero : string
--
nom : string
type : enum {bus, metro, tramway}
}
entity Arret {
* id : integer
--
nom : string
adresse : string
coordonnees_geo : string
}
entity Conducteur {
* numero_employe : string
--
nom : string
prenom : string
date_embauche : date
}
Ligne "*" -- "*" Arret : dessert
Conducteur "*" -- "*" Vehicule : conduit
Ligne "1" -- "*" Vehicule : utilise
@enduml
Diagramme
Partie 2¶
Ajoutez les éléments suivants au diagramme EA que vous avez obtenu dans la partie précédente.
- Chaque ligne a un horaire qui définit les heures de passage à chaque arrêt. Un horaire peut varier selon le jour de la semaine (jour ouvré, samedi, dimanche et jours fériés).
- Les passagers peuvent acheter différents types de titres de transport : ticket unitaire, carnet de 10 tickets, abonnement mensuel ou annuel.
- Chaque titre de transport a un prix et une durée de validité.
- Les passagers doivent s’enregistrer pour obtenir un abonnement. Un passager a un numéro de client, un nom, un prénom et une adresse e-mail.
Code
@startuml
entity Vehicule {
* numero_identification : string
--
capacite_passagers : integer
date_mise_en_service : date
type : enum {bus, metro, tramway}
}
entity Ligne {
* numero : string
--
nom : string
type : enum {bus, metro, tramway}
}
entity Arret {
* id : integer
--
nom : string
adresse : string
coordonnees_geo : string
}
entity Conducteur {
* numero_employe : string
--
nom : string
prenom : string
date_embauche : date
}
Ligne "*" -- "*" Arret : dessert
Conducteur "*" -- "*" Vehicule : conduit
Ligne "1" -- "*" Vehicule : utilise
entity Horaire {
* id : integer
--
jour_semaine : enum {ouvre, samedi, dimanche, ferie}
heure_passage : time
}
entity TitreTransport {
* id : integer
--
type : enum {unitaire, carnet10, mensuel, annuel}
prix : decimal
duree_validite : integer
}
entity Passager {
* numero_client : string
--
nom : string
prenom : string
email : string
}
Ligne "1" -- "*" Horaire
Arret "1" -- "*" Horaire
Passager "*" -- "*" TitreTransport : achete
@enduml
Diagramme
Partie 3¶
Ajoutez les éléments suivants au diagramme EA que vous avez obtenu dans la partie précédente.
- Le réseau souhaite suivre la fréquentation des lignes. Pour cela, on enregistre le nombre de passagers montant et descendant à chaque arrêt, pour chaque trajet.
- Les véhicules peuvent tomber en panne. On souhaite enregistrer les incidents, avec la date, le type d’incident et la durée d’immobilisation du véhicule.
- Les arrêts peuvent être équipés de différentes installations : abris, bancs, distributeurs de tickets, panneaux d’information en temps réel. On veut pouvoir savoir quelles installations sont présentes à chaque arrêt.
- Le réseau propose un système de vélos en libre-service aux arrêts principaux. Chaque station de vélos a un nombre de places de stationnement et un nombre de vélos disponibles qui varie au cours de la journée.
Code
@startuml
entity Vehicule {
* numero_identification : string
--
capacite_passagers : integer
date_mise_en_service : date
type : enum {bus, metro, tramway}
}
entity Ligne {
* numero : string
--
nom : string
type : enum {bus, metro, tramway}
}
entity Arret {
* id : integer
--
nom : string
adresse : string
coordonnees_geo : string
}
entity Conducteur {
* numero_employe : string
--
nom : string
prenom : string
date_embauche : date
}
Ligne "*" -- "*" Arret : dessert
Conducteur "*" -- "*" Vehicule : conduit
Ligne "1" -- "*" Vehicule : utilise
entity Horaire {
* id : integer
--
jour_semaine : enum {ouvre, samedi, dimanche, ferie}
heure_passage : time
}
entity TitreTransport {
* id : integer
--
type : enum {unitaire, carnet10, mensuel, annuel}
prix : decimal
duree_validite : integer
}
entity Passager {
* numero_client : string
--
nom : string
prenom : string
email : string
}
Ligne "1" -- "*" Horaire
Arret "1" -- "*" Horaire
Passager "*" -- "*" TitreTransport : achete
entity Frequentation {
* id : integer
--
date : date
heure : time
passagers_montants : integer
passagers_descendants : integer
}
entity Incident {
* id : integer
--
date : date
type : string
duree_immobilisation : integer
}
entity Installation {
* id : integer
--
type : enum {abri, banc, distributeur, panneau_info}
}
entity StationVelos {
* id : integer
--
nombre_places : integer
velos_disponibles : integer
}
Arret "1" -- "*" Frequentation
Vehicule "1" -- "*" Incident
Arret "*" -- "*" Installation : equipee_de
Arret "1" -- "0..1" StationVelos
@enduml
Diagramme
Modèle physique¶
Code
@startuml
!define TABLE(name,desc) class name as "desc" << (T,#FFAAAA) >>
!define PK(x) <u>x</u>
!define FK(x) <i>x</i>
hide empty methods
hide empty fields
TABLE(Vehicule, "Vehicule") {
PK(id) : integer
numero_identification : string
capacite_passagers : integer
date_mise_en_service : date
type : type_vehicule
FK(ligne_id) : integer
}
TABLE(Ligne, "Ligne") {
PK(id) : integer
numero : string
nom : string
type : type_ligne
}
TABLE(Arret, "Arret") {
PK(id) : integer
nom : string
adresse : string
coordonnees_geo : string
}
TABLE(LigneArret, "LigneArret") {
PK(FK(ligne_id)) : integer
PK(FK(arret_id)) : integer
ordre : integer
}
TABLE(Conducteur, "Conducteur") {
PK(id) : integer
numero_employe : string
nom : string
prenom : string
date_embauche : date
}
TABLE(Horaire, "Horaire") {
PK(id) : integer
jour_semaine : type_jour
heure_passage : time
FK(ligne_id) : integer
FK(arret_id) : integer
}
TABLE(TitreTransport, "TitreTransport") {
PK(id) : integer
type : type_titre
prix : decimal
duree_validite : integer
}
TABLE(Passager, "Passager") {
PK(id) : integer
numero_client : string
nom : string
prenom : string
email : string
}
TABLE(Frequentation, "Frequentation") {
PK(id) : integer
date : date
heure : time
passagers_montants : integer
passagers_descendants : integer
FK(arret_id) : integer
FK(vehicule_id) : integer
}
TABLE(Incident, "Incident") {
PK(id) : integer
date : date
type : string
duree_immobilisation : integer
FK(vehicule_id) : integer
}
TABLE(Installation, "Installation") {
PK(id) : integer
type : type_installation
}
TABLE(ArretInstallation, "ArretInstallation") {
PK(FK(arret_id)) : integer
PK(FK(installation_id)) : integer
}
TABLE(StationVelos, "StationVelos") {
PK(id) : integer
nombre_places : integer
velos_disponibles : integer
FK(arret_id) : integer
}
Ligne "1" -- "*" Vehicule
Ligne "1" -- "*" LigneArret
Arret "1" -- "*" LigneArret
Ligne "1" -- "*" Horaire
Arret "1" -- "*" Horaire
Arret "1" -- "*" Frequentation
Vehicule "1" -- "*" Frequentation
Vehicule "1" -- "*" Incident
Arret "1" -- "*" ArretInstallation
Installation "1" -- "*" ArretInstallation
Arret "1" -- "0..1" StationVelos
TABLE(ConducteurVehicule, "ConducteurVehicule") {
PK(FK(conducteur_id)) : integer
PK(FK(vehicule_id)) : integer
}
TABLE(PassagerTitreTransport, "PassagerTitreTransport") {
PK(FK(passager_id)) : integer
PK(FK(titre_transport_id)) : integer
date_achat : date
}
Conducteur "1" -- "*" ConducteurVehicule
Vehicule "1" -- "*" ConducteurVehicule
Passager "1" -- "*" PassagerTitreTransport
TitreTransport "1" -- "*" PassagerTitreTransport
@enduml
Diagramme
Création¶
Code
-- Création des types enum
CREATE TYPE type_vehicule AS ENUM ('bus', 'metro', 'tramway');
CREATE TYPE type_ligne AS ENUM ('bus', 'metro', 'tramway');
CREATE TYPE type_jour AS ENUM ('ouvre', 'samedi', 'dimanche', 'ferie');
CREATE TYPE type_titre AS ENUM ('unitaire', 'carnet10', 'mensuel', 'annuel');
CREATE TYPE type_installation AS ENUM ('abri', 'banc', 'distributeur', 'panneau_info');
-- Création des tables
CREATE TABLE Ligne (
id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
numero VARCHAR(20) UNIQUE NOT NULL,
nom VARCHAR(100) NOT NULL,
type type_ligne NOT NULL
);
CREATE TABLE Vehicule (
id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
numero_identification VARCHAR(50) UNIQUE NOT NULL,
capacite_passagers INTEGER NOT NULL,
date_mise_en_service DATE NOT NULL,
type type_vehicule NOT NULL,
ligne_id INTEGER NOT NULL REFERENCES Ligne(id)
);
CREATE TABLE Arret (
id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
nom VARCHAR(100) NOT NULL,
adresse TEXT,
coordonnees_geo VARCHAR(50)
);
CREATE TABLE LigneArret (
ligne_id INTEGER REFERENCES Ligne(id),
arret_id INTEGER REFERENCES Arret(id),
ordre INTEGER NOT NULL,
PRIMARY KEY (ligne_id, arret_id)
);
CREATE TABLE Conducteur (
id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
numero_employe VARCHAR(50) UNIQUE NOT NULL,
nom VARCHAR(100) NOT NULL,
prenom VARCHAR(100) NOT NULL,
date_embauche DATE NOT NULL
);
CREATE TABLE Horaire (
id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
jour_semaine type_jour NOT NULL,
heure_passage TIME NOT NULL,
ligne_id INTEGER NOT NULL REFERENCES Ligne(id),
arret_id INTEGER NOT NULL REFERENCES Arret(id)
);
CREATE TABLE TitreTransport (
id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
type type_titre NOT NULL,
prix DECIMAL(10, 2) NOT NULL,
duree_validite INTEGER NOT NULL
);
CREATE TABLE Passager (
id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
numero_client VARCHAR(50) UNIQUE NOT NULL,
nom VARCHAR(100) NOT NULL,
prenom VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL
);
CREATE TABLE Frequentation (
id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
date DATE NOT NULL,
heure TIME NOT NULL,
passagers_montants INTEGER NOT NULL,
passagers_descendants INTEGER NOT NULL,
arret_id INTEGER NOT NULL REFERENCES Arret(id),
vehicule_id INTEGER NOT NULL REFERENCES Vehicule(id)
);
CREATE TABLE Incident (
id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
date DATE NOT NULL,
type VARCHAR(100) NOT NULL,
duree_immobilisation INTEGER NOT NULL,
vehicule_id INTEGER NOT NULL REFERENCES Vehicule(id)
);
CREATE TABLE Installation (
id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
type type_installation NOT NULL
);
CREATE TABLE ArretInstallation (
arret_id INTEGER REFERENCES Arret(id),
installation_id INTEGER REFERENCES Installation(id),
PRIMARY KEY (arret_id, installation_id)
);
CREATE TABLE StationVelos (
id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
nombre_places INTEGER NOT NULL,
velos_disponibles INTEGER NOT NULL,
arret_id INTEGER UNIQUE NOT NULL REFERENCES Arret(id)
);
CREATE TABLE ConducteurVehicule (
conducteur_id INTEGER REFERENCES Conducteur(id),
vehicule_id INTEGER REFERENCES Vehicule(id),
PRIMARY KEY (conducteur_id, vehicule_id)
);
CREATE TABLE PassagerTitreTransport (
passager_id INTEGER REFERENCES Passager(id),
titre_transport_id INTEGER REFERENCES TitreTransport(id),
date_achat DATE NOT NULL,
PRIMARY KEY (passager_id, titre_transport_id)
);
Utilisation de l’IA
Page rédigée en partie avec l’aide d’un assistant IA. L’IA a été utilisée pour générer des explications, des exemples et/ou des suggestions de structure. Toutes les informations ont été vérifiées, éditées et complétées par l’auteur.