© Your Copyright
Une société décide d’informatiser la gestion de son personnel ou chaque personne exerce une fonction.
Pour chaque personne, on connait son nom, son prénom, son numéro de sécurité sociale (qu’on utilise pour l’identifier au sein de la société) et son adresse.
Une fonction associée à une personne posséde un label unique déterminant cette fonction et un numéro de bureau attaché à la fonction.
On doit également pouvoir connaître la date d’embauche et, éventuellement, la date de licenciement (ou de démission).
« Une société décide d’informatiser la gestion de son personnel ou chaque personne exerce une fonction. »
- Cette phrase (sujet-verbe-complément) nous permet d’identifier les entités (sujet,complément) et une association (verbe) entre ces deux entités.
« Pour chaque personne, on connait son nom, son prénom, son numéro de sécurité sociale … et son adresse. »
- Cette phrase nous permet de connaître les informations (propriétés) importantes qui définissent une personne (entité).
« Une fonction associée à une personne posséde un label unique déterminant cette fonction et un numéro de bureau attaché à la fonction. »
- Cette phrase nous permet de relever les informations (propriétés) qui caractérisent une fonction (entité) dans la société.
Dans ce cahier des charges, rien n’est précisé sur la cardinalité de l’association entre une « Personne » et une « Fonction » identifiée par le verbe « exerce ».
Il faut expliciter cette cardinalité en se posant les questions qui permettront de lever cette ambiguïté :
- Une personne peut-elle exercer plusieurs fonctions ? (\(1..1\) ou \(1..*\) sur l’entité « Fonction » ?)
- Une fonction peut-elle être attribuée à plusieurs employés ? (\(1..1\) ou \(1..*\) sur l’entité « Personne » ?)
Autrement dit :
- cardinalité (\(1..1\)) ou (\(1..*\)) d’un coté ou des deux côtés de l’association ?
Si une personne peut exercer une ou plusieurs fonctions dans la société et qu’une fonction peut être attribuée à une ou plusieurs personnes :
- association plusieurs à plusieurs, cardinalité (\(1..*\)) des deux côtés de l’association, il faudra créer une table associative.
On doit également pouvoir connaître la date d’embauche et, éventuellement, la date de licenciement (ou de démission).
On aura donc un modèle de tables :
- \(personnes(\underline{no\_ss},nom,prenom,adresse)\)
- \(attribution(\underline{\#no\_ss,\#label},debut,fin)\)
- \(fonctions(\underline{label},bureau)\)
Certaines contraintes n’apparaissent pas dans la modélisation précédente.
- format réglementaire du numéro de sécurité sociale
- on doit connaître l’adresse
- la date de début doit être inférieure à la date de fin
- …
Le standard SQL permettra d’implémenter dans une base de données relationnelles le modèle UML et les contraintes relevées à la lecture du cahier des charges.
Lors de la création des tables, le langage SQL permettra leur mise en oe uvre à l’aide de contraintes d’intégrité sur les tables ou de contraintes d’intégrité référentielle sur les associations.
Une entreprise souhaite mettre en place un Système d’Information pour gérer ses employés dans des départements en respectant les contraintes suivantes :
- l”entreprise a un nom, dispose d’un capital et est constituée de départements.
- un département a un nom et est composé de plusieurs postes dont on connaît la fiche (le nom dans un premier temps)
- l’entreprise dispose d”employés qui ont un salaire
- un employé est une personne dont on connaît le nom et le prénom
- on doit disposer de contacts (mail,téléphone …) pour chaque personne de l’entreprise
- une personne peut avoir plusieurs contacts
- un employé est affecté à un poste.
- un employé peut diriger plusieurs autres employés
- un employé peut être responsable d’un département
A partir de ce cahier des charges on peut identifier, dans un premier temps les entités et les association entre entités.
Le diagramme UML ci-dessous représente cette modélisation entité-association:
On peut par la suite identifier les informations « métier » que l’on peut regrouper dans les entités.
Le diagramme UML ci-dessous représente cette modélisation entité-attributs :
Enfin on peut faire apparaître les informations qui représenteront les clés primaires et étrangères à mettre en place dans le cadre d’une structuration de la base de données.
Le diagramme UML ci-dessous représente cette modélisation en représentant sous forme d’attributs les identifiants de clés primaires et étrangères :
A partir de cette dernière modélisation on peut en déduire la structuration de la base de données en créant les tables SQL suivantes :
CREATE TABLE entreprises (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
nom varchar(20),
capital float DEFAULT 0
);
CREATE TABLE departements (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
nom varchar(20),
entreprise_id INTEGER,
responsable_id INTEGER,
FOREIGN KEY (entreprise_id) REFERENCES entreprises
FOREIGN KEY (responsable_id) REFERENCES employes
);
CREATE TABLE personnes (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
nom varchar(20),
prenom varchar(20)
);
CREATE TABLE contacts (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
mail varchar(30),
personne_id INTEGER,
FOREIGN KEY (personne_id) REFERENCES personnes
);
CREATE TABLE employes (
id INTEGER NOT NULL PRIMARY KEY,
salaire SMALLINT,
entreprise_id INTEGER,
poste_id INTEGER,
chef_id INTEGER,
FOREIGN KEY (id) REFERENCES personnes,
FOREIGN KEY (entreprise_id) REFERENCES entreprises,
FOREIGN KEY (poste_id) REFERENCES postes,
FOREIGN KEY (chef_id) REFERENCES personnes
);
CREATE TABLE postes (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
nom varchar(20),
departement_id INTEGER,
FOREIGN KEY (departement_id) REFERENCES departements
);
A partir de ces tables on peut insérer les enregistrements ci-dessous :
INSERT INTO entreprises(nom) VALUES ('ENIB');
INSERT INTO departements(nom,entreprise_id,responsable_id)
VALUES ('Informatique',(SELECT id FROM entreprises WHERE nom='ENIB'),NULL);
INSERT INTO departements(nom,entreprise_id,responsable_id)
VALUES ('Electronique',(SELECT id FROM entreprises WHERE nom='ENIB'),NULL);
INSERT INTO personnes(nom,prenom) VALUES ('Dupont','Jean');
INSERT INTO personnes(nom,prenom) VALUES ('Durand','Albert');
INSERT INTO personnes(nom,prenom) VALUES ('Dupond','Alfred');
INSERT INTO contacts(mail,personne_id)
VALUES ('jean.dupont@enib.fr',(SELECT id FROM personnes WHERE nom='Dupont' AND prenom='Jean'));
INSERT INTO contacts(mail,personne_id)
VALUES ('jean.dupont@gmail.com',(SELECT id FROM personnes WHERE nom='Dupont' AND prenom='Jean'));
INSERT INTO contacts(mail,personne_id)
VALUES ('albert.durand@enib.fr',(SELECT id FROM personnes WHERE nom='Durand' AND prenom='Albert'));
INSERT INTO employes(id,salaire,entreprise_id,poste_id,chef_id)
VALUES (
(SELECT id FROM personnes WHERE nom='Dupont' AND prenom='Jean'),
30000,
(SELECT id FROM entreprises WHERE nom='ENIB'),
NULL,
NULL
);
INSERT INTO employes(id,salaire,entreprise_id,poste_id,chef_id)
VALUES (
(SELECT id FROM personnes WHERE nom='Durand' AND prenom='Albert'),
60000,
(SELECT id FROM entreprises WHERE nom='ENIB'),
NULL,
NULL
);
INSERT INTO postes(nom,departement_id) VALUES ('MdC',(SELECT id FROM departements WHERE nom='Informatique'));
UPDATE employes SET poste_id=(SELECT id FROM postes WHERE nom='MdC') WHERE id=1;
INSERT INTO postes(nom,departement_id) VALUES ('PRAG',(SELECT id FROM departements WHERE nom='Electronique'));
INSERT INTO postes(nom,departement_id) VALUES ('PU',(SELECT id FROM departements WHERE nom='Electronique'));
La base de données étant créé on peut la tester et mettre en place les requêtes correspondant aux cas d’usages
A partir des données précédentes :
- créer la base de données
- insérer des enregistrements
- formuler des requêtes
Répondre aux cas d’usages suivants :
- nom de toutes les entreprises dont le capital est compris entre 0.00 € et 10000.00 €
- nom de tous les départements de l” “ENIB”
- les personnes qui ne sont pas des employés
- les personnes qui sont employés à l” “ENIB”
- la personne qui serait responsable de tous les départements (la créer si elle n’existe pas)
- le salaire moyen des employes de l” “ENIB”
- le nom des personnes qui ont le plus gros salaire à l”“ENIB”
- le nombre de postes par département à l” “ENIB”“
- le nombre d’employes par département à l” “ENIB”
- le nombre d’employes par département à l” “ENIB” pour les départements dont le salaire minimum est inférieur au salaire moyen à l” “ENIB”
On pourra faire évoluer le modèle de données en :
- faisant des mises à jour sur les informations existantes (
UPDATE
)- ajoutant des éléments dans les tables existantes (
INSERT
)- modifiant les tables pour renommer, ajouter de nouvelles colonnes (
ALTER TABLE
…)- définissant des contraintes sur les colonnes (
UNIQUE, NOT NULL,CHECK, PRIMARY KEY
,…)- créant de nouvelles entités (
CREATE TABLE
) et associations (FOREIGN KEY
…)- …
Par exemple :
- ajouter l’âge d’une personne
- créer d’autre contacts pour une personne
- connaître les dates d’arrivée d’un employé dans l’entreprise
- définir des compétences requises pour un poste
- créer des spécialisations d’employés sur des compétences
- …
Une compagnie de réservation de chambres d’hôtels veut mettre en place un Système d’Information sur les réservations de chambres par des clients.
Du client on connaît le nom, prénom, ville un le numéro de téléphone. Les informations dont on disposent sur les hôtels sont : le nom, le nombre de chambres, leur capacité d’accueil (nombre de personnes), la ville où ils se trouvent et leur url. Pour chaque chambre on connaît le nombre de lits, le prix, le confort (douche, salle de bains, mini-bar …), et l’équipement (TV, bureau etc …). Chaque réservation de chambre concernera un hôtel, un client et, bien sûr,une chambre.
A partir de ce cahier des charges proposer :
- une représentation des informations dans une table unique.
- une structuration de la base de données en s’appuyant sur le formalisme de modélisation UML.
- une décomposition de l’ensemble de départ (la table) en plusieurs tables
Après avoir créé une base de données basée sur cette décomposition, vérifiez la cohérence de la décomposition en faisant une jointure entre les différentes tables afin de reconstituer la table d’origine.