Vous êtes sur la page 1sur 79

3 Introduction au modèle relationnel

3.1 Concepts de base


 Domaine : ensemble de valeurs
 Relation : ensemble de n-uplets (tuples)
 SQL : multi-ensemble colonne /
attribut

noClient nomClient noTéléphone


10 Luc Sansom (999)999-9999
ligne / 20 Dollard Tremblay (888)888-8888
tuple 30 Lin Bô (777)777-7777
table /
40 Jean Leconte (666)666-6666
50 Hafedh Alaoui (555)555-5555 relation
60 Marie Leconte (666)666-6666
70 Simon Lecoq (444)444-4419
80 Dollard Tremblay (333)333-3333

04/09/23 © Robert Godin. Tous droits réservés. 1


suite
 Deux facettes du concept de table
– Schéma d'une table (table schema)
 définition de son type (intention)
 ex: Client(noClient, nomClient, noTéléphone)

– Instance ou extension d'une table


 état de la table
 ~ variable qui contient un ensemble de lignes
 modifications d ’état
 Schéma relationnel
– ensemble de schémas de tables

04/09/23 © Robert Godin. Tous droits réservés. 2


Instance de BD VentesPleinDeFoin
Table Commande Table Client
noCommande dateCommande noClient noClient nomClient noTéléphone
1 01/ 06/ 2000 10 10 Luc Sansom (999)999-9999
2 02/ 06/ 2000 20 20 Dollard Tremblay (888)888-8888
3 02/ 06/ 2000 10 30 Lin Bô (777)777-7777
4 05/ 07/ 2000 10 40 Jean Leconte (666)666-6666
5 09/ 07/ 2000 30 50 Hafedh Alaoui (555)555-5555
6 09/ 07/ 2000 20 60 Marie Leconte (666)666-6666
7 15/ 07/ 2000 40 70 Simon Lecoq (444)444-4419
8 15/ 07/ 2000 40 80 Dollard Tremblay (333)333-3333
Table DétailLivraison Table Livraison
Table LigneCommande
noLivraison noCommande noArticle quantitéLivrée noLivraison dateLivraison
noCommande noArticle quantité
100 1 10 7 100 3/ 06/ 2000
1 10 10
100 1 70 5 101 4/ 06/ 2000
1 70 5
101 1 10 3 102 4/ 06/ 2000
1 90 1
102 2 40 2 103 5/ 06/ 2000
2 40 2
102 2 95 1 104 7/ 07/ 2000
2 95 3
100 3 20 1 105 9/ 07/ 2000
3 20 1
103 1 90 1
4 40 1
104 4 40 1
4 50 1
105 5 70 2
5 70 3
5 10 5 Table Article
5 20 5
noArticle description prixUnitaire quantitéEnStock
6 10 5
10 Cèdre en boule 10.99 10
6 40 1
20 Sapin 12.99 10
7 50 1
7 95 2 40 Epinette bleue 25.99 10
8 20 3 50 Chêne 22.99 10
60 Erable argenté 15.99 10
70 Herbe à puce 10.99 10
80 Poirier 26.99 10
81 Catalpa 25.99 10
90 Pommier 25.99 10
95 Génévrier 15.99 10
3.2 Contraintes d'intégrité du modèle relationnel
3.2.1 Contrainte de domaine et de valeur non nulle

 T(A1 : D1, A2 : D2, …, An : Dn)


– Di : domaine de Ai
 Valeur nulle
– Comportement particulier
– Valeur inconnue
– Valeur non applicable
– ...

04/09/23 © Robert Godin. Tous droits réservés. 4


3.2.2 Clé primaire et
contrainte d'entité
 Clé unique (unique key)
– ou superclé (superkey )
– identifiant
 Clé candidate (candidate key)
– clé unique minimale
 Clé primaire (primary key)
– sert de mécanisme de référence aux lignes de la table
 Contrainte d'entité (entity constraint)
  clé primaire
– non nulle

04/09/23 © Robert Godin. Tous droits réservés. 5


3.2.3 Contrainte
d'intégrité référentielle
 Clé étrangère non nulle  clé primaire
Clé étrangère Clé primaire

T able C om m ande T able C lient


noCommande dateCommande noClient noClient nomClient noTéléphone
1 01/ 06/ 2000 10 10 Luc Sansom (999)999-9999
2 02/ 06/ 2000 20 20 Dollard Tremblay (888)888-8888
3 02/ 06/ 2000 10 30 Lin Bô (777)777-7777
4 05/ 07/ 2000 10 40 Jean Leconte (666)666-6666
5 09/ 07/ 2000 30 50 Hafedh Alaoui (555)555-5555
6 09/ 07/ 2000 20 60 Marie Leconte (666)666-6666
7 15/ 07/ 2000 40 70 Simon Lecoq (444)444-4419
8 15/ 07/ 2000 40 80 Dollard Tremblay (333)333-3333

04/09/23 © Robert Godin. Tous droits réservés. 6


Représentation UML
<<Table>>
<<Table>>
Article
Client
{Clé primaire : noArticle}
{Clé primaire : noClient}
noArticle : INTEGER
noClient : INTEGER
description : VARCHAR
nomClient : VARCHAR
prixUnitaire : DECIMAL
noTéléphone : VARCHAR
quantitéEnStock : INTEGER

<<Table>> <<Table>>
Commande LigneCommande
{Clé primaire : noCommande} {Clé primaire : noCommande, noArticle}
noCommande : INTEGER noCommande : INTEGER
dateCommande : DATE noArticle : INTEGER
noClient : INTEGER quantité : INTEGER

<<Table>>
<<Table>> DétailLivraison
Livraison {Clé primaire : noLivraison, noCommande, noArticle}
{Clé primaire : noLivraison} noLivraison : INTEGER
noLivraison : INTEGER noCommande : INTEGER
dateLivraison : DATE noArticle : INTEGER
quantitéLivrée : INTEGER

04/09/23 © Robert Godin. Tous droits réservés. 7


Nom clé étrangère 
nom clé primaire
 Étiquette de la relation de dépendance

<<Table>> <<Table>>
Client Commande
{Clé primaire : noClient} {Clé primaire : noCommande}
numéroClient
noClient : INTEGER noCommande : INTEGER
nomClient : VARCHAR dateCommande : DATE
noTéléphone : VARCHAR numéroClient : INTEGER

04/09/23 © Robert Godin. Tous droits réservés. 8


3.3 Conception logique : traduction du modèle
conceptuel de données en schéma conceptuel
relationnel

 Output : schéma relationnel (niveau conceptuel)


– tables
– colonnes
 types, domaines, ...
– contraintes d ’intégrité
 clés primaires, étrangères, ...
 Input à la conception
– modèle conceptuel des données
 MDA
– Platform Specific Model (PSM)

04/09/23 © Robert Godin. Tous droits réservés. 9


3.3.1 Première ébauche du
schéma : une table par classe
<<table>>
Personne

<<table>> <<table>>
Utilisateur Prêt

<<table>> <<table>>
<<table>> <<table>> PrêtArchivé PrêtEnCours
Employé Membre

<<table>>
Exemplaire
<<table>>
<<table>>
Livre
Auteur

<<table>>
Editeur <<table>>
Catégorie

04/09/23 © Robert Godin. Tous droits réservés. 10


3.3.2 Traduction des attributs

 Attribut de la classe -> colonne de la table

<<table>>
Livre Livre
{UNIQUE: ISBN}
ISBN : String {Clé candidate: ISBN}
titre : String ISBN : CHAR(13)
annéeParution : TypeDonnéesAnnée
titre : VARCHAR(50)
annéeParution : DomaineAnnée

04/09/23 © Robert Godin. Tous droits réservés. 11


3.3.2.1 TRADUCTION DES CONTRAINTES
D'IDENTIFICATION (UNIQUE)

 Contrainte UNIQUE -> clé candidate relationnelle


– clé primaire ?
<<table>>
Livre
Livre
{UNIQUE: ISBN} {Clé candidate: ISBN}
ISBN : String
titre : String ISBN : CHAR(13)
annéeParution : TypeDonnéesAnnée
titre : VARCHAR(50)
annéeParution : DomaineAnnée

04/09/23 © Robert Godin. Tous droits réservés. 12


3.3.2.2 TRADUCTION DES
TYPES DE DONNÉES
Type OCL Type SQL2 Oracle 8
Boolean BIT(1) Non supporté (utiliser CHAR(1) + CHECK)
Integer INTEGER ou SMALLINT NUMBER(n)
String CHARACTER (CHAR) (n), CHARACTER VARCHAR2(n), LONG ou LONG
VARYING (VARCHAR) (n) VARCHAR (chaîne jusqu'à 2G), CLOB
(chaîne jusqu'à 4G), NCLOB (chaîne pour
caractères encodés sur plusieurs octets)
Real NUMERIC(p,s) (précision exacte), NUMBER(p,s)
DECIMAL(p,s), REAL, DOUBLE
PRECISION, FLOAT(p)
Enum{v1,…vn} CHARACTER (CHAR) ou VARCHER + Domaine non supporté
CHECK … IN (v1,…,vn) (possibilité de
création de domaine)
DATE DATE inclut TIME
TIME
TIMESTAMP
BIT(n), BIT VARYING(n) RAW(n : max = 255), LONG RAW (binaire
jusqu'à 2G), BLOB (binaire jusqu'à 4G)
BFILE (pointeur à un fichier externe)

04/09/23 © Robert Godin. Tous droits réservés. 13


Types de données déclarés

 Domaine pas toujours supporté par le dialecte


SQL
Livre <<table>>
Livre
{UNIQUE: ISBN}
ISBN : String {Clé candidate: ISBN}
titre : String ISBN : CHAR(13)
annéeParution : TypeDonnéesAnnée titre : VARCHAR(50)
annéeParution : DomaineAnnée

<<datatype>> <<domain>>
TypeDonnéesAnnée DomaineAnnée
{Integer > 0 } {INTEGER CHECK value > 0 }

04/09/23 © Robert Godin. Tous droits réservés. 14


3.3.2.3 TYPES ÉNUMÉRÉS

 Petit domaine invariant


– création d ’un domaine VARCHAR + CHECK
<<table>>
Exemplaire
{Clé candidate : idExemplaire}
Exemplaire idExemplaire : VARCHAR(10)
{UNIQUE: idExemplaire} dateAchat : Date
idExemplaire : String statut : DomaineStatut
dateAchat : Date
statut : enum(prêté, disponible, retiré)

<<domain>>
DomaineStatut
{VARCHAR(15) CHECK value IN ('prêté','disponible','retiré')}

04/09/23 © Robert Godin. Tous droits réservés. 15


Création d ’une table
 Gros domaine ou extensible
– création d ’une table à part
– utilisé comme liste de valeurs (LOV Designer)
– introduction d ’une clé primaire artificielle ?

<<table>>
Exemplaire <<table>>
{Clé candidate : idExemplaire} DomaineStatut
idExemplaire : VARCHAR(10) {Clé primaire : statut}
dateAchat : Date statut : VARCHAR(15)
statut : VARCHAR(15)

04/09/23 © Robert Godin. Tous droits réservés. 16


3.3.2.4 TYPES COMPLEXES
 1. Représentation explicite des attributs du type complexe

<<datatype>> <<table>>
typeDonnéesAdresse Membre
numéroCivique numéroCivique
numéroAppartement numéroAppartement
Membre
nomRue nomRue
adresse : typeDonnéesAdresse nomVille
nomVille
nomProvince nomProvince
nomPays nomPays
codePostal codePostal

04/09/23 © Robert Godin. Tous droits réservés. 17


2. Création d'une nouvelle table

 N.B. Pas de partage de la même adresse !


<<datatype>>
typeDonnéesAdresse
numéroCivique
Membre numéroAppartement
nomRue
adresse : typeDonnéesAdresse
nomVille
nomProvince
nomPays <<table>>
codePostal Adresse
{Clé primaire : idMembre}
<<table>> idMembre
Membre numéroCivique
numéroAppartement
{Clé primaire : idMembre}
nomRue
idMembre
nomVille
nomProvince
nomPays
codePostal

04/09/23 © Robert Godin. Tous droits réservés. 18


3.3.2.5 QUALIFICATEUR
 Colonne dans la table du rôle opposé
– voir 3.3.3.2
Cours
{UNIQUE:sigle} Groupe
numéro
numéro
sigle
session
session nbMaximumInscrits
titre
0..1
nbCrédits 1

<<table>>
<<table>>
Groupe
Cours
{Cl é primaire : sigle, num éro, session}
{Clé prim aire :si gle}
sigle
sigle
numéro
titre
session
nbCrédits
nbMaximumInscrits

04/09/23 © Robert Godin. Tous droits réservés. 19


3.3.2.6 DISCRIMINANT
Utilisateur
 Redondant ? {UNIQUE :idUtilisateur}
idUtilisateur : String
motPasse : String

catégorieUtilisateur
{disjointe, complète}

Employé Membre
{UNIQUE : codeMatricule} téléphoneRésidence : String
codeMatricule : String $ nbMaxPrêts : Integer = 5
catégorieEmployé : enum(bibliothécaire, commis) $ duréeMaxPrêts : Integer = 7

<<table>>
Utilisateur
<<domai n>>
{Clé candidate : idUtilisateur}
DomaineCatégorieUti lisateur
idUtilisateur : VARCHAR(10)
motPasse : VARCHAR(10) {VARCHAR(14) CHECK value IN ('em pl oyé, 'membre')}
catégorieUtilisateur : DomaineCatégorieUtilisateur

04/09/23 © Robert Godin. Tous droits réservés. 20


3.3.2.7 ATTRIBUT MULTIVALUÉ

 Table à part
– clé étrangère + colonne pour l ’attribut
 Petit tableau de taille fixe
– n colonnes (valeurs nulles)
 Encodage
– invisible au SGBD
 Oracle8
– VARRAY, NESTED TABLE

04/09/23 © Robert Godin. Tous droits réservés. 21


3.3.2.8 COMPRESSION DES VALEURS
DES ATTRIBUTS DE GRANDE TAILLE

 Supporté par le SGBD ?


 Multimédia

04/09/23 © Robert Godin. Tous droits réservés. 22


3.3.2.9 CRÉATION DE TABLES
SUPPLÉMENTAIRES POUR LES ATTRIBUTS
DE CLASSE

<<table>>
Membre
Membre téléphoneRésidence : VARCHAR(15)
téléphoneRésidence : String
$ nbMaxPrêts : Integer = 5
$ duréeMaxPrêts : Integer = 7 <<table>>
MembreGénéral
nbMaxPrêts : INTEGER = 5
duréeMaxPrêts : INTEGER = 7

04/09/23 © Robert Godin. Tous droits réservés. 23


3.3.3 Réalisation de l'identité
par les clés primaires
<<table>> <<table>>
Personne Utilisateur
{Clé primaire : noSequence} {Clé primaire : noSequence}
noSequence : INTEGER noSequence <<table>>
nom : VARCHAR2(20) {Clé candidate : idUtilisateur} Prêt
prénom : VARCHAR2(20) idUtilisateur : VARCHAR(10) {Clé primaire : noSequence}
motPasse : VARCHAR(10) noSequence : INTEGER
catégorieUtilisateur : DomaineCatégorieUtilisateur datePrêt : DATE

<<table>> <<table>>
<<table>> <<table>>
Employé Membre
PrêtArchivé PrêtEnCours
{Clé primaire : noSequence} {Clé primaire : noSequence}
{Clé primaire : noSequence} {Clé primaire : noSequence}
noSequence : INTEGER noSequence : INTEGER
noSequence : INTEGER noSequence : INTEGER
{Clé candidate : codeMatricule} téléphoneRésidence : VARCHAR(15)
dateRetour : DATE
codeMatricule : CHAR(6)
catégorieEmployé : DomaineCatégorieEmployé
<<table>>
<<table>> Exemplaire
<<table>> AuteurLivre Livre {Clé primaire : idExemplaire}
Auteur {Clé primaire : noSequence, ISBN} {Clé primaire : ISBN} idExemplaire : VARCHAR(10)
Clé primaire : noSequence} noSequence ISBN : CHAR(13) dateAchat : Date
noSequence ISBN titre : VARCHAR(50) statut : DomaineStatut
annéeParution : DomaineAnnée

<<table>>
MembreGénéral <<table>> <<table>>
{Clé primaire : noSequence} Editeur Catégorie
noSequence {Clé primaire : nomEditeur} {Clé primaire : code}
nbMaxPrêts : INTEGER = 5 nomEditeur : VARCHAR(20) code : VARCHAR(10)
duréeMaxPrêts : INTEGER = 7 ville : VARCHAR(20) descripteur : VARCHAR(20)
04/09/23 © Robert Godin. Tous droits réservés. 24
3.3.3.1 CRÉATION D'UNE CLÉ
PRIMAIRE ARTIFICIELLE
Prêt <<table>>
Prêt
datePrêt : Date {Clé primaire : noSequence}
noSequence : INTEGER
datePrêt : DATE

PrêtArchivé PrêtEnCours
dateRetour : Date <<table>> <<table>>
PrêtArchivé PrêtEnCours
{Clé primaire : noSequence} {Clé primaire : noSequence}
noSequence : INTEGER noSequence : INTEGER
dateRetour : DATE
 De manière systématique ?
 Mécanisme de SEQUENCE Oracle

04/09/23 © Robert Godin. Tous droits réservés. 25


3.3.3.2 UTILISATION D'UN IDENTIFIANT
NATUREL COMME CLÉ PRIMAIRE

 1. Utilisation d'un identifiant naturel (UNIQUE)

<<table>> <<table>>
Livre Livre
{Clé candidate: ISBN} {Clé primaire: ISBN}
ISBN : CHAR(13) ISBN : CHAR(13)
titre : VARCHAR(50) titre : VARCHAR(50)
annéeParution : DomaineAnnée annéeParution : DomaineAnnée
 Si identifiant naturel trop lourd
– introduire clé primaire artificielle

04/09/23 © Robert Godin. Tous droits réservés. 26


2. Utilisation du qualificateur
Cours
{UNIQUE:si gl e} Groupe
numéro
numéro
sigle
session
session nbMaximumInscrits
titre
0..1
nbCrédits 1

<<tabl e>>
<<table>>
Groupe
Cours
{Clé primaire : sigle, num éro, session}
{Clé prim ai re :si gle}
sigle
sigle
numéro
titre
session
nbCrédits
nbMaxi mumInscrits

04/09/23 © Robert Godin. Tous droits réservés. 27


3.3.3.3 IDENTIFIANT NATUREL
POUR UNE SPÉCIALISATION

 Éviter de changer de clé primaire dans le


contexte d ’une hiérarchie de généralisation
 Si la table du parent est omise
– considérer identifiant naturel de la
spécialisation

04/09/23 © Robert Godin. Tous droits réservés. 28


3.3.4 Traduction des associations
<<table>>
<<table>>
<<table>> Utilisateur
Prêt
Personne {Clé primaire : noSequence}
{Clé primaire : noSequence}
{Clé primaire : noSequence} noSequence
noSequenceUtilisateur noSequence : INTEGER
noSequence : INTEGER {Clé candidate : idUtilisateur}
datePrêt : DATE
nom : VARCHAR2(20) idUtilisateur : VARCHAR(10)
noSequenceUtilisateur : INTEGER
prénom : VARCHAR2(20) motPasse : VARCHAR(10)
idExemplaire : VARCHAR(10)
catégorieUtilisateur : DomaineCatégorieUtilisateur

<<table>> <<table>>
<<table>> <<table>>
Employé PrêtArchivé
Membre PrêtEnCours
{Clé primaire : noSequence} {Clé primaire : noSequence}
{Clé primaire : noSequence} {Clé primaire : noSequence}
noSequence : INTEGER noSequence : INTEGER
noSequence : INTEGER noSequence : INTEGER
{Clé candidate : codeMatricule} dateRetour : DATE
téléphoneRésidence : VARCHAR(15)
codeMatricule : CHAR(6)
catégorieEmployé : DomaineCatégorieEmployé <<table>>
Exemplaire
{Un Livre ne peut exister <<table>>
Livre {Clé primaire : idExemplaire}
sans AuteurLivre}
<<table>> idExemplaire : VARCHAR(10)
{Clé primaire : ISBN}
Auteur dateAchat : Date
ISBN : CHAR(13)
statut : DomaineStatut
{Clé primaire : noSequence} <<table>> titre : VARCHAR(50)
ISBN : CHAR(13)
noSequence : INTEGER AuteurLivre annéeParution : DomaineAnnée
nomEditeur : VARCHAR(20)
{Clé primaire : noSequence, ISBN} {Un Livre ne peut exister
code : VARCHAR(10)
noSequence : INTEGER sans Exemplaire}
{Un Auteur ne peut exister {Clé candidate : ISBN, ordreAuteur}
sans AuteurLivre} ISBN : CHAR(13)
ordreAuteur : INTEGER

<<table>>
Catégorie
<<table>> {Clé primaire : code}
<<table>> Editeur code : VARCHAR(10)
MembreGénéral descripteur : VARCHAR(20)
{Clé primaire : nomEditeur}
{Clé primaire : noSequence} codeParent : VARCHAR(10)
nomEditeur : VARCHAR(20)
04/09/23
noSequence ville : VARCHAR(20)© Robert Godin. Tous droits réservés. 29
nbMaxPrêts : INTEGER = 5
3.3.4.1 CAS GÉNÉRAL : TRADUCTION
D'UNE ASSOCIATION PAR UNE TABLE
Livre
{UNIQUE: ISBN}
Auteur
ISBN : String
titre : String
1..* 1..* annéeParution : T ypeDonnéesAnnée

<<table>>
Livre
<<table>>
{Clé primaire : ISBN}
Auteur
ISBN : CHAR(13)
{Clé primaire : noSequence} titre : VARCHAR(50)
noSequence : INTEGER annéeParution : DomaineAnnée

<<table>>
{Un Auteur ne peut exister AuteurLivre {Un Livre ne peut exister
sans AuteurLivre} sans AuteurLivre}
{Clé primaire : noSequence, ISBN}
noSequence : INTEGER
ISBN : CHAR(13)

04/09/23 © Robert Godin. Tous droits réservés. 30


3.3.4.2 TRADUCTION D'UN RÔLE
ORDONNÉ POUR UNE ASSOCIATION
Livre

{ordonné} {UNIQUE: ISBN}


Auteur
ISBN : String
titre : String
1..* 1..* annéeParution : TypeDonnéesAnnée

< < t a b le > >


< < ta b le > > L iv r e
A u te u r {C lé p rim a ir e : IS B N }
{ C lé p rim a ir e : n o S e q u e n c e } IS B N : C H A R ( 1 3 )
n o S eq u en c e : IN T E G E R titr e : V A R C H A R (5 0 )
a n n é e P a r u tio n : D o m a in e A n n é e

< < t a b le > >


A u te u r L iv r e
{C lé p rim a ir e : n o S e q u e n c e , I S B N }
n o S e q u e n c e : IN T E G E R
{C lé c a n d id a te : IS B N , o r d r e A u te u r }
IS B N : C H A R ( 1 3 )
o r d r e A u te u r : IN T E G E R

04/09/23 © Robert Godin. Tous droits réservés. 31


3.3.4.3 CLASSE ASSOCIATIVE
Etudiant Cours
{UNIQUE : codePermanent} {UNIQUE : sigle}
codePermanent sigle
nom * * titre
prénom nbCrédits

<<table>> NoteObtenue <<table>>


Etudiant note Cours
{Clé primaire : codePermanent} session {Clé primaire : sigle}
codePermanent sigle
nom titre
prénom nbCrédits

<<table>>
NoteObtenue
{Clé primaire : codePermament, sigle}
codePermament
sigle
note
session

04/09/23 © Robert Godin. Tous droits réservés. 32


3.3.4.4 CAS UN À PLUSIEURS

 1. Traduction par une table ?


Livre
Catégorie
{UNIQUE: ISBN}
{UNIQUE: code}
ISBN : String
code : String
1 * ti tre : String
descripteur : String
annéeParution : T ypeDonnéesAnnée

< < ta ble> >


< < ta ble> > L ivre
C a té g orie {C lé p rim aire : IS B N }
{C lé p rim aire : co d e} IS B N : C H A R (1 3 )
co d e : V A R C H A R (1 0 ) titre : V A R C H A R (5 0 )
d esc ripteu r : V A R C H A R (2 0 ) a n n é eP a ru tio n : D om a in eA n né e

< < ta ble> >


C a té g orieL ivre
{C lé p rim aire : IS B N }
IS B N : C H A R(1 3 )
c o d e : V A R C H A R (1 0 )

04/09/23 © Robert Godin. Tous droits réservés. 33


2. Traduction par l'ajout d'une
clé étrangère à privilégier
 Navigation plus performante
Livre
Catégorie
{UNIQUE: ISBN}
{UNIQUE: code}
ISBN : String
code : String
1 * titre : String
descripteur : String
annéeParution : T ypeDonnéesAnnée

<<table>>
<<table>> Livre
Catégorie {Clé primaire : ISBN}
{Clé primaire : code} ISBN : CHAR(13)
code : VARCHAR(10) titre : VARCHAR(50)
descripteur : VARCHAR(20) annéeParution : DomaineAnnée
code : VARCHAR(10)

04/09/23 © Robert Godin. Tous droits réservés. 34


Renommer la clé
étrangère au besoin

<<table>>
<<table>>
Utilisateur
Prêt
{Clé primaire : noSequence}
{Clé primaire : noSequence}
noSequence
noSequenceUtilisateur noSequence : INTEGER
{Clé candidate : idUtilisateur}
datePrêt : DATE
idUtilisateur : VARCHAR(10)
noSequenceUtilisateur : INTEGER
motPasse : VARCHAR(10)
idExemplaire : VARCHAR(10)
catégorieUtilisateur : DomaineCatégorieUtilisateur

04/09/23 © Robert Godin. Tous droits réservés. 35


3.3.4.5 CAS UN À UN
 1. Une clé étrangère (du côté obligatoire)
Citoyen
Passeport
{UNIQUE : noAssurranceSociale}
{UNIQUE : noPasseport}
noAssurranceSociale
noPasseport
nom 1 0..1
dateExpiration
prénom

<<table>>
<<table>>
Passeport
Citoyen
{Clé primaire : noPasseport}
{Clé primaire : noAssurranceSociale}
noPasseport
noAssurranceSociale
dateExpiration
nom
{Clé candidate : noAssurranceSociale}
prénom
noAssurranceSociale

04/09/23 © Robert Godin. Tous droits réservés. 36


2. Une nouvelle table
Homme Mariage Femme
{UNIQUE : noAssurranceSociale} grasAVie vieAGras {UNIQUE : noAssurranceSociale}
noAssurranceSociale noAssurranceSociale
nom 0..1 0..1 nom
prénom prénom

<<table>> <<table>>
Homme Femme
{Clé primaire : noAssurranceSociale} {Clé primaire : noAssurranceSociale}
noAssurranceSociale noAssurranceSociale
nom nom
prénom prénom

<<table>>
Mariage
{Clé candidate : noAssSocFemme}
noAssSocFemme
{Clé candidate : noAssSocHomme}
noAssSocHomme

04/09/23 © Robert Godin. Tous droits réservés. 37


3. Fusion
 Cas 1-1 obligatoire

04/09/23 © Robert Godin. Tous droits réservés. 38


3.3.4.6 CAS DE L'AGRÉGATION

 Comme une association normale


Catégorie
enfant
{UNIQUE: code}
code : String
*
descripteur : String

parent 0..1

<<table>>
Catégorie
{Clé primaire : code}
code : VARCHAR(10)
descripteur : VARCHAR(20)
codeParent : VARCHAR(10)

codeParent

04/09/23 © Robert Godin. Tous droits réservés. 39


Composition
 Cas 1-1
– ~ attribut complexe
 Mode SQL CASCADE
 Oracle8
– VARRAY, NESTED TABLE

04/09/23 © Robert Godin. Tous droits réservés. 40


3.3.5 Traduction des relations de
généralisation/spécialisation

 Délégation
 Fusion
 Concaténation

04/09/23 © Robert Godin. Tous droits réservés. 41


3.3.5.1 DÉLÉGATION
<<table>>
Personne
{Clé primaire : noSequence}
noSequence : INTEGER
nom : VARCHAR2(20)
prénom : VARCHAR2(20)

<<table>> <<table>>
Auteur Utilisateur
{Clé primaire : noSequence} {Clé primaire : noSequence}
noSequence : INTEGER noSequence : INTEGER
{Clé candidate : idUtilisateur}
idUtilisateur : VARCHAR(10)
motPasse : VARCHAR(10)
{catégorieUtilisateur doit être / catégorieUtilisateur : DomaineCatégorieUtilisateur
cohérent avec la table
d'appartenance de l'objet}

<<table>> <<table>>
Employé Membre
{Clé primaire : noSequence} {Clé primaire : noSequence}
noSequence : INTEGER noSequence : INTEGER
{Clé candidate : codeMatricule} téléphoneRésidence : VARCHAR(15)
codeMatricule : CHAR(6)
catégorieEmployé : DomaineCatégorieEmployé

04/09/23 © Robert Godin. Tous droits réservés. 42


Changement de clé
primaire ?
 Extraire le téléphone résidence d'un Membre
possédant l'idUtilisateur 12345
<<table>>
<<table>> Utilisateur
Personne {Clé candidate : noSequence}
{Clé primaire : noSequence} noSequence
noSequence : INTEGER {Clé primaire : idUtilisateur}
nom : VARCHAR2(20) idUtilisateur : VARCHAR(10)
prénom : VARCHAR2(20) motPasse : VARCHAR(10)
catégorieUtilisateur : DomaineCatégorieUtilisateur

<<table>> <<table>>
Employé Membre
{Clé primaire : idUtilisateur} {Clé primaire : idUtilisateur}
idUtilisateur : VARCHAR(10) idUtilisateur : VARCHAR(10)
{Clé candidate : codeMatricule} téléphoneRésidence : VARCHAR(15)
codeMatricule : CHAR(6)
catégorieEmployé : DomaineCatégorieEmployé

04/09/23 © Robert Godin. Tous droits réservés. 43


Traduction de la contrainte
{disjointe, complète}

<<table>>
Prêt
{Clé primaire : noSequence}
Prêt noSequence : INTEGER
datePrêt : DATE
datePrêt : Date noSequenceUtilisateur : INTEGER
{Exclusives et une des idExemplaire : VARCHAR(10)
{disjointe, complète} deux est nécessaire}

<<table>>
PrêtArchivé <<table>>
PrêtEnCours PrêtArchivé
PrêtEnCours
dateRetour : Date {Clé primaire : noSequence}
{Clé primaire : noSequence}
noSequence : INTEGER
noSequence : INTEGER
dateRetour : DATE

04/09/23 © Robert Godin. Tous droits réservés. 44


3.3.5.1.1 Cas de la multi-classification
et de l'héritage multiple
<<tab le>>
U tilis ateur
<<table>> {C lé prim aire : n oS equenc e}
Auteur n oS equenc e
{Clé prim aire : noS equenc e} {C lé c andidate : idU tilis ateur}
noS equenc e idU tilis ateur : VAR C HAR(10)
m otP ass e : VAR C HAR (10)
catégorieUtilis ateur : D om aineC atégorieU tilis ateur

<<table>> <<table>>
Em ployé M em bre
{C lé prim aire : noS equenc e} {C lé prim aire : n oS equenc e}
noS equ enc e : IN T EG ER n oS equenc e : INT EG ER
{C lé c an didate : c odeM atricule} téléph oneR ésidenc e : VAR CH AR(15)
cod eM atric ule : C H A R(6)
catégorieE m ployé : D om aineC atégorieEm ployé

AuteurM em bre
{Clé prim aire : noS equ enc e}
noS equ enc e
1. Créer une table de jointure

04/09/23 © Robert Godin. Tous droits réservés. 45


Alternatives
 2. Identité commune sans table de jointure
 3. Identité séparée et redondance de
données

04/09/23 © Robert Godin. Tous droits réservés. 46


3.3.5.2 ANALOGIE AVEC UNE
ASSOCIATION UN À UN
 Clé étrangère
– dans l ’enfant
– dans le parent ???
 Approche Arc de Designer
 Fusion
– vers le parent (approche par fusion)
– vers l ’enfant (approche par concaténation)
 Nouvelle table ???

04/09/23 © Robert Godin. Tous droits réservés. 47


3.3.5.3 FUSION
<<table>>
Prêt <<table>>
{Clé primaire : noSequence} Prêt
noSequence : INTEGER {Clé primaire : noSequence}
datePrêt : DATE noSequence : INTEGER
noSequenceUtilisateur : INTEGER datePrêt : DATE
{Exclusives et une des idExemplaire : VARCHAR(10) noSequenceUtilisateur : INTEGER
deux est nécessaire} idExemplaire : VARCHAR(10)
{catégoriePrêt = 'prêtEnCours' ssi dateRetour nulle}
dateRetour[0..1] : DATE
catégoriePrêt : DomaineCatégoriePrêt
<<table>>
<<table>>
PrêtArchivé
PrêtEnCours
{Clé primaire : noSequence} <<domain>>
{Clé primaire : noSequence}
noSequence : INTEGER DomaineCatégoriePrêt
noSequence : INTEGER
dateRetour : DATE {VARCHAR(15) CHECK valeur IN ('prêtEnCours', 'prêtArchivé')}

04/09/23 © Robert Godin. Tous droits réservés. 48


3.3.5.4 CONCATÉNATION
<<table>>
Utilisateur
Conserver une table {Clé candidate : noSequence}

pour le parent ? noSequence


{Clé primaire : idUtilisateur}
idUtilisateur : VARCHAR(10)
motPasse : VARCHAR(10)
catégorieUtilisateur : DomaineCatégorieUtilisateur

<<table>>
Prêt noSequenceUtilisateur noSequenceUtilisateur
{Clé primaire : noSequence} <<table>>
noSequence : INTEGER <<table>>
PrêtArchivé
datePrêt : DATE PrêtEnCours
{Clé primaire : noSequence}
noSequenceUtilisateur : INTEGER {Clé primaire : noSequence} noSequence : INTEGER
idExemplaire : VARCHAR(10) noSequence : INTEGER
{Exclusives et une des datePrêt : DATE
dateRetour : DATE
deux est nécessaire} datePrêt : DATE
noSequenceUtilisateur : INTEGER
noSequenceUtilisateur : INTEGER
idExemplaire : VARCHAR(10)
idExemplaire : VARCHAR(10)

<<table>>
<<table>>
PrêtArchivé
PrêtEnCours <<table>> {La contrainte de clé
{Clé primaire : noSequence} Exemplaire primaire est globale
{Clé primaire : noSequence}
noSequence : INTEGER {Clé primaire : idExemplaire} pour les deux tables}
noSequence : INTEGER
dateRetour : DATE idExemplaire : VARCHAR(10)
dateAchat : Date
statut : DomaineStatut
ISBN : CHAR(13)

04/09/23 © Robert Godin. Tous droits réservés. 49


Cas d ’une référence au parent
<<table>>
Employé
{Clé primaire : noSequence} {exclusives}
noSequence : INTEGER
nom : VARCHAR2(20)
prénom : VARCHAR2(20)
{Clé candidate : idUtilisateur}
idUtilisateur : VARCHAR(10)
motPasse : VARCHAR(10) <<table>>
catégorieEmployé : DomaineCatégorieEmployé noSequenceEmployé Prêt
{Clé candidate : codeMatricule}
codeMatricule : CHAR(6) {Clé primaire : noSequence}
noSequence : INTEGER
datePrêt : DATE
noSequenceEmployé : INTEGER
<<table>> noSequenceMembre : INTEGER
Membre noSequenceMembre idExemplaire : VARCHAR(10)
{Clé primaire : noSequence}
noSequence : INTEGER
nom : VARCHAR2(20)
prénom : VARCHAR2(20)
{Clé candidate : idUtilisateur}
idUtilisatuer : VARCHAR(10)
motPasse : VARCHAR(10)
téléphoneRésidence : VARCHAR(15)

04/09/23 © Robert Godin. Tous droits réservés. 50


3.3.5.5 TRADUCTION DES GÉNÉRALISATIONS POUR SYLERAT
<<table>>
Utilisateur <<table>>
{Clé primaire : idUtilisateur} PrêtEnCours
idUtilisateur : VARCHAR(10) {Clé primaire : noSequence}
motPasse : VARCHAR(10) noSequence : INTEGER
{CatégorieUtilisateur doit être nom : VARCHAR2(20) datePrêt : DATE
prénom : VARCHAR2(20) idUtilisateur : VARCHAR(10)
cohérente avec la table
/ catégorieUtilisateur : DomaineCatégorieUtilisateur idExemplaire : VARCHAR(10)
d'appartenance}

<<table>>
PrêtArchivé {Lors d'un reto
{Exclusives et une des est généré à p
{Clé primaire : noSequence}
deux est nécessaire} Cours en réutil
noSequence : INTEGER
noSequence}
<<table>> dateRetour : DATE
<<table>> datePrêt : DATE
Employé Membre
idUtilisateur : VARCHAR(10)
{Clé primaire : idUtilisateur} {Clé primaire : idUtilisateur} idExemplaire : VARCHAR(10)
idUtilisateur : VARCHAR(10) idUtilisateur : VARCHAR(10)
{Clé candidate : codeMatricule} téléphoneRésidence : VARCHAR(15)
codeMatricule : CHAR(6)
catégorieEmployé : DomaineCatégorieEmployé
<<table>>
{Un Livre ne peut exister <<table>> Exemplaire
<<table>> sans AuteurLivre} Livre {Clé primaire : idExemplaire}
Auteur {Clé primaire : ISBN} idExemplaire : VARCHAR(10)
{Clé primaire : noSequence} ISBN : CHAR(13) dateAchat : Date
noSequence : INTEGER <<table>> titre : VARCHAR(50) statut : DomaineStatut
nom : VARCHAR2(20) AuteurLivre annéeParution : DomaineAnnée ISBN : CHAR(13)
prénom : VARCHAR2(20) nomEditeur : VARCHAR(20)
{Clé primaire : noSequence, ISBN} {Un Livre ne peut exister
code : VARCHAR(10)
noSequence : INTEGER sans Exemplaire}
{Un Auteur ne peut exister {Clé candidate : ISBN, ordreAuteur}
sans AuteurLivre} ISBN : CHAR(13)
ordreAuteur : INTEGER

<<table>>
Catégorie
<<table>> {Clé primaire : code}
<<table>>
Editeur code : VARCHAR(10)
MembreGénéral
descripteur : VARCHAR(20)
{Clé primaire : noSequence} {Clé primaire : nomEditeur}
codeParent : VARCHAR(10)
noSequence nomEditeur : VARCHAR(20)
nbMaxPrêts : INTEGER = 5 ville : VARCHAR(20)
duréeMaxPrêts : INTEGER = 7
04/09/23 ©{UnRobert Godin. Tous droits
Editeur ne peut exister
réservés.
codeParent 51
sans Livre}
3.3.6 Traduction des autres contraintes
<<table>>
MembreGénéral
{Le nombre de PrêtEnCours d'un {Clé primaire : noSequence}
Membre <= nbMaxPrêts} noSequence
nbMaxPrêts : INTEGER = 5
duréeMaxPrêts : INTEGER = 7

<<table>>
Utilisateur <<table>>
{Clé primaire : idUtilisateur} PrêtEnCours
idUtilisateur : VARCHAR(10) {Clé primaire : idExemplaire}
motPasse : VARCHAR(10) idExemplaire : VARCHAR(10)
nom : VARCHAR2(20) datePrêt : DATE
prénom : VARCHAR2(20) idUtilisateur : VARCHAR(10)
/ catégorieUtilisateur : DomaineCatégorieUtilisateur

<<table>>
PrêtArchivé {statut = 'prêté' si et
{Clé primaire : noSequence} seulement si un Prêt
noSequence : INTEGER EnCours fait référence à
{dateRetour >= datePrêt} l'Exemplaire}
<<table>> dateRetour : DATE
Membre datePrêt : DATE
{Clé primaire : idUtilisateur} idUtilisateur : VARCHAR(10)
idUtilisateur : VARCHAR(10) idExemplaire : VARCHAR(10)
téléphoneRésidence : VARCHAR(15)

<<table>>
Exemplaire
{Clé primaire : idExemplaire}
idExemplaire : VARCHAR(10)
dateAchat : Date
statut : DomaineStatut
ISBN : CHAR(13)
04/09/23 © Robert Godin. Tous droits réservés. 52
3.4 Algèbre relationnelle
 Opérations de manipulation de données
 Entrée
– une table : opération unaire
– deux tables : opération binaire
 Sortie
– une table
– permet la composition
 Origine de SQL (« SQUARE de IBM, San Jose »)

04/09/23 © Robert Godin. Tous droits réservés. 53


3.4.1 Sélection ()
Table Article
noArticle description prixUnitaire quantitéEnStock
10 Cèdre en boule 10.99 10
20 Sapin 12.99 10
40 Epinette bleue 25.99 10
50 Chêne 22.99 10
60 Erable argenté 15.99 10
70 Herbe à puce 10.99 10
80 Poirier 26.99 10
81 Catalpa 25.99 10
90 Pommier 25.99 10
95 Génévrier 15.99 10

 prixUnitaire < 20.00 ET noArticle > 30 (Article)

noArticle description prixUnitaire quantitéEnStock


60 Erable argenté 15.99 10
70 Herbe à puce 10.99 10
95 Génévrier 15.99 10

04/09/23 © Robert Godin. Tous droits réservés. 54


3.4.2 Projection ()
Table Commande
noCommande dateCommande noClient
1 01/ 06/ 2000 10
2 02/ 06/ 2000 20
3 02/ 06/ 2000 10
4 05/ 07/ 2000 10
5 09/ 07/ 2000 30
6 09/ 07/ 2000 20
7 15/ 07/ 2000 40
8 15/ 07/ 2000 40

 noClient, dateCommande (Commande)


noClient dateCommande
10 01/ 06/ 2000
20 02/ 06/ 2000
10 02/ 06/ 2000
10 05/ 07/ 2000
30 09/ 07/ 2000
20 09/ 07/ 2000
40 15/ 07/ 2000

04/09/23 © Robert Godin. Tous droits réservés. 55


3.4.3 Expressions complexes
Table Commande
noCommande dateCommande noClient
1 01/ 06/ 2000 10
2 02/ 06/ 2000 20
3 02/ 06/ 2000 10
4 05/ 07/ 2000 10
5 09/ 07/ 2000 30
6 09/ 07/ 2000 20
7 15/ 07/ 2000 40
8 15/ 07/ 2000 40

 dateCommande > 05/07/2000 Commande


noCommande dateCommande noClient
5 09/ 07/ 2000 30
6 09/ 07/ 2000 20
7 15/ 07/ 2000 40
8 15/ 07/ 2000 40

 noClient, dateCommande ( dateCommande > 05/07/2000 Commande)


noClient dateCommande
30 09/ 07/ 2000
20 09/ 07/ 2000
40 15/ 07/ 2000

04/09/23 © Robert Godin. Tous droits réservés. 56


3.4.4 Produit cartésien
()
Table Client Table Commande
noClient nomClient noTéléphone noCommande dateCommande noClient
10 Luc Sansom (999)999-9999 1 01/ 06/ 2000 10
20
30
Dollard Tremblay
Lin Bô
(888)888-8888
(777)777-7777
... 2
3
02/ 06/ 2000
02/ 06/ 2000
20
10
40 Jean Leconte (666)666-6666 4 05/ 07/ 2000 10
50 Hafedh Alaoui (555)555-5555 5 09/ 07/ 2000 30
60 Marie Leconte (666)666-6666 6 09/ 07/ 2000 20
70 Simon Lecoq (444)444-4419 7 15/ 07/ 2000 40
80 Dollard Tremblay (333)333-3333 8 15/ 07/ 2000 40

Client  Commande
Client.noClient nomClient noTéléphone noCommande dateCommande Commande. noClient
10 Luc Sansom (999)999-9999 1 01/ 06/ 2000 10
10 Luc Sansom (999)999-9999 2 02/ 06/ 2000 20
10 Luc Sansom (999)999-9999 3 02/ 06/ 2000 10
10 Luc Sansom (999)999-9999 4 05/ 07/ 2000 10
10 Luc Sansom (999)999-9999 5 09/ 07/ 2000 30
10 Luc Sansom (999)999-9999 6 09/ 07/ 2000 20
10 Luc Sansom (999)999-9999 7 15/ 07/ 2000 40
10 Luc Sansom (999)999-9999 8 15/ 07/ 2000 40
20 Dollard Tremblay (888)888-8888 1 01/ 06/ 2000 10
20 Dollard Tremblay (888)888-8888 2 02/ 06/ 2000 20
20 Dollard Tremblay (888)888-8888 3 02/ 06/ 2000 10
… … … … … …
04/09/23 © Robert Godin. Tous droits réservés. 57
Exemple. Produire les informations au
sujet des Clients et de leurs Commandes
Client  Commande
Client.noClient nomClient noTéléphone noCommande dateCommande Commande. noClient
10 Luc Sansom (999)999-9999 1 01/ 06/ 2000 10
10 Luc Sansom (999)999-9999 2 02/ 06/ 2000 20
10 Luc Sansom (999)999-9999 3 02/ 06/ 2000 10
10 Luc Sansom (999)999-9999 4 05/ 07/ 2000 10
10 Luc Sansom (999)999-9999 5 09/ 07/ 2000 30
10 Luc Sansom (999)999-9999 6 09/ 07/ 2000 20
10 Luc Sansom (999)999-9999 7 15/ 07/ 2000 40

clé primaire = clé étrangère


10
20
Luc Sansom
Dollard Tremblay
(999)999-9999
(888)888-8888
8
1
15/ 07/ 2000
01/ 06/ 2000
40
10
20 Dollard Tremblay (888)888-8888 2 02/ 06/ 2000 20
20 Dollard Tremblay (888)888-8888 3 02/ 06/ 2000 10
… … … … … …

 Client.noClient = Commande.noClient (Client  Commande)


Client.noClient nomClient noTéléphone noCommande dateCommande Commande. noClient
10 Luc Sansom (999)999-9999 1 01/ 06/ 2000 10
10 Luc Sansom (999)999-9999 3 02/ 06/ 2000 10
10 Luc Sansom (999)999-9999 4 05/ 07/ 2000 10
20 Dollard Tremblay (888)888-8888 2 02/ 06/ 2000 20
20 Dollard Tremblay (888)888-8888 6 09/ 07/ 2000 20
30 Lin Bô (777)777-7777 5 09/ 07/ 2000 30
40 Jean Leconte (666)666-6666 7 15/ 07/ 2000 40
40 Jean Leconte (666)666-6666 8 15/ 07/ 2000 40

04/09/23 © Robert Godin. Tous droits réservés. 58


Exemple. Produire les informations au
sujet des Clients et de leurs Commandes
 Client.noClient = Commande.noClient (Client  Commande)
Client.noClient nomClient noTéléphone noCommande dateCommande Commande. noClient
10 Luc Sansom (999)999-9999 1 01/ 06/ 2000 10
10 Luc Sansom (999)999-9999 3 02/ 06/ 2000 10
10 Luc Sansom (999)999-9999 4 05/ 07/ 2000 10
20 Dollard Tremblay (888)888-8888 2 02/ 06/ 2000 20
20 Dollard Tremblay (888)888-8888 6 09/ 07/ 2000 20
30 Ye San Le Sou (777)777-7777 5 09/ 07/ 2000 30
40 Jean Leconte (666)666-6666 7 15/ 07/ 2000 40
40 Jean Leconte (666)666-6666 8 15/ 07/ 2000 40

Colonne redondante
 Client.noClient, nomClient, noTéléphone, noCommande, dateCommande
10
(…)) nomClient
Client.noClient
Luc Sansom
noTéléphone
(999)999-9999
noCommande dateCommande
1 01/ 06/ 2000
10 Luc Sansom (999)999-9999 3 02/ 06/ 2000
10 Luc Sansom (999)999-9999 4 05/ 07/ 2000
20 Dollard Tremblay (888)888-8888 2 02/ 06/ 2000
20 Dollard Tremblay (888)888-8888 6 09/ 07/ 2000
30 Ye San Le Sou (777)777-7777 5 09/ 07/ 2000
40 Jean Leconte (666)666-6666 7 15/ 07/ 2000
40 Jean Leconte (666)666-6666 8 15/ 07/ 2000

04/09/23 © Robert Godin. Tous droits réservés. 59


3.4.5 Jointure naturelle
() Colonnes communes : colonnes de jointure ou clé de jointure
Table Client Table Commande
noClient nomClient noTéléphone noCommande dateCommande noClient
10 Luc Sansom (999)999-9999 1 01/ 06/ 2000 10
20 Dollard Tremblay (888)888-8888 2 02/ 06/ 2000 20
30 Lin Bô (777)777-7777 3 02/ 06/ 2000 10
40 Jean Leconte (666)666-6666 4 05/ 07/ 2000 10
50 Hafedh Alaoui (555)555-5555 5 09/ 07/ 2000 30
60 Marie Leconte (666)666-6666 6 09/ 07/ 2000 20
70 Simon Lecoq (444)444-4419 7 15/ 07/ 2000 40
80 Dollard Tremblay (333)333-3333 8 15/ 07/ 2000 40

Client  Schéma : union des


colonnes
Commande
noClient nomClient noTéléphone noCommande dateCommande
10 Luc Sansom (999)999-9999 1 01/ 06/ 2000
10 Luc Sansom (999)999-9999 3 02/ 06/ 2000
10 Luc Sansom (999)999-9999 4 05/ 07/ 2000
20 Dollard Tremblay (888)888-8888 2 02/ 06/ 2000
20 Dollard Tremblay (888)888-8888 6 09/ 07/ 2000
30 Lin Bô (777)777-7777 5 09/ 07/ 2000
40 Jean Leconte (666)666-6666 7 15/ 07/ 2000
40 Jean Leconte (666)666-6666 8 15/ 07/ 2000

04/09/23 © Robert Godin. Tous droits réservés. 60


Sélectionner les nomClient qui ont
commandé au moins un plant d'herbe à puce
<<Table>>
<<Table>>
Article
Client
{Clé primaire : noArticle}
{Clé primaire : noClient}
noArticle : INTEGER
noClient : INTEGER
description : VARCHAR
nomClient : VARCHAR
prixUnitaire : DECIMAL
noTéléphone : VARCHAR
quantitéEnStock : INTEGER

<<Table>> <<Table>>
Commande LigneCommande
{Clé primaire : noCommande} {Clé primaire : noCommande, noArticle}
noCommande : INTEGER noCommande : INTEGER
dateCommande : DATE noArticle : INTEGER
noClient : INTEGER quantité : INTEGER

<<Table>>
<<Table>> DétailLivraison
Livraison {Clé primaire : noLivraison, noCommande, noArticle}
{Clé primaire : noLivraison} noLivraison : INTEGER
noLivraison : INTEGER noCommande : INTEGER
dateLivraison : DATE noArticle : INTEGER
quantitéLivrée : INTEGER

04/09/23 © Robert Godin. Tous droits réservés. 61


Sélectionner les nomClient qui
ont commandé au moins un plant
d'herbe à puce <<Table>>
<<Table>>
Article
Client
{Clé primaire : noArticle}
{Clé primaire : noClient}
noArticle : INTEGER
noClient : INTEGER
description : VARCHAR
nomClient : VARCHAR
prixUnitaire : DECIMAL
noTéléphone : VARCHAR
quantitéEnStock : INTEGER

<<Table>> <<Table>>
Commande LigneCommande
{Clé primaire : noCom mande} {Clé primaire : noCommande, noArticle}
noCommande : INTEGER noCommande : INTEGER
dateCommande : DATE noArticle : INTEGER
noClient : INTEGER quantité : INTEGER

<<Table>>
<<Table>> DétailLivraison
Livraison {Clé primaire : noLivraison, noCommande, noArticle}
{Clé primaire : noLivraison} noLivraison : INTEGER
noLivraison : INTEGER noCommande : INTEGER
dateLivraison : DATE noArticle : INTEGER
quantitéLivrée : INTEGER

 nomClient ( description = “Herbe à puce ”


(Client  Commande  LigneCommande  Article))
04/09/23 © Robert Godin. Tous droits réservés. 62
Formulations équivalentes

  nomClient ( description = “Herbe à puce ” (Client 


Commande  LigneCommande  Article))
  nomClient ( description = “Herbe à puce ” (((Client 
Commande)  LigneCommande)  Article))
  nomClient ( description = “Herbe à puce ” (((Client 
LigneCommande)  Commande)  Article))
 …

04/09/23 © Robert Godin. Tous droits réservés. 63


Quelques règles d ’équivalence

 Eclatement d'une sélection conjonctive (SE)


–  e1 ET e2 (T) =  e1 ( e2 (T))
 Commutativité de la sélection (SC)
  e1 ( e2 (T)) =  e2 ( e1 (T))
 Elimination des projections en cascades (PE)
  liste1 ( liste2 (T)) =  liste1 (T)
 Commutativité de la jointure (JC)
– T1  T2 = T1  T2
 Associativité de la jointure (JA)
– T1  (T2  T3) = (T1  T2)  T3

 Voir évaluation des requêtes

04/09/23 © Robert Godin. Tous droits réservés. 64


Représentation sous forme d ’arbre de
l ’expression algébrique

  nomClient ( description = “Herbe à puce ” (((Client  Commande)  LigneCommande)  Article))

nomClient

 description = «Herbe à puce»

Article

LigneCommande

Client Commande

04/09/23 © Robert Godin. Tous droits réservés. 65


Cas d ’une clé de jointure composée

Table LigneCommande Table DétailLivraison


noCommande noArticle quantité noLivraison noCommande noArticle quantitéLivrée
1 10 10 100 1 10 7
1 70 5 100 1 70 5
1 90 1 101 1 10 3
2 40 2 102 2 40 2
2 95 3 102 2 95 1
3 20 1 100 3 20 1
4 40 1 103 1 90 1
4 50 1 104 4 40 1
5 70 3 105 5 70 2
5 10 5
5
6
20
10
5
5
LigneCommande 
6 40 1 DétailLivraison
noCommande noArticle quantité noLivraison quantitéLivrée
7 50 1
7 95 2 1 10 10 100 7
8 20 3 1 10 10 101 3
1 70 5 100 5
1 90 1 103 1
2 40 2 102 2
2 95 3 102 1
3 20 1 100 1
4 40 1 104 1
5 70 3 105 2

04/09/23 © Robert Godin. Tous droits réservés. 66


3.4.6 Opération renommer ()


QuelsTable
sont les Clients qui ont le même numéro de téléphone?
Client Table Client2
noClient nomClient noTéléphone noClient nomClient noTéléphone
10 Luc Sansom (999)999-9999 10 Luc Sansom (999)999-9999
20 Dollard Tremblay (888)888-8888 20 Dollard Tremblay (888)888-8888
30 Lin Bô (777)777-7777 30 Lin Bô (777)777-7777
40
50
Jean Leconte
Hafedh Alaoui
(666)666-6666
(555)555-5555
 Client2 40
50
Jean Leconte
Hafedh Alaoui
(666)666-6666
(555)555-5555
60
70
Marie Leconte
Simon Lecoq
(666)666-6666
(444)444-4419 (Client) 60
70
Marie Leconte
Simon Lecoq
(666)666-6666
(444)444-4419
80 Dollard Tremblay (333)333-3333 80 Dollard Tremblay (333)333-3333

 Client.noClient, Client2.noClient, ( Client.noTéléphone = Client2.noTéléphone (Client   Client2


(Client)))
Client. noClient Client2.noClient
40 60
60 40
10 10
20 20
30 30
40 40
50 50
60 60
70 70
04/09/23 80 80 © Robert Godin. Tous droits réservés. 67
Renommer les colonnes

QuelsTable
sontClient
les Clients qui ont le même numéro de téléphone?
Table Client2
noClient nomClient noTéléphone noClient2 nomClient2 noTéléphone
10 Luc Sansom (999)999-9999 10 Luc Sansom (999)999-9999
20 Dollard Tremblay (888)888-8888 20 Dollard Tremblay (888)888-8888
30 Lin Bô (777)777-7777 30 Lin Bô (777)777-7777
40 Jean Leconte (666)666-6666 40 Jean Leconte (666)666-6666
50 Hafedh Alaoui (555)555-5555 50 Hafedh Alaoui (555)555-5555
60 Marie Leconte (666)666-6666 60 Marie Leconte (666)666-6666
70 Simon Lecoq (444)444-4419 70 Simon Lecoq (444)444-4419
80 Dollard Tremblay (333)333-3333
80 Dollard Tremblay (333)333-3333

 Client2(noClient2, nomClient2, noTéléphone)


(Client)
 noClient, noClient2 (Client   Client2(noClient2, nomClient2, noTéléphone)
(Client))
noClient noClient2
40 60
60 40
10 10
20 20
… …
04/09/23 © Robert Godin. Tous droits réservés. 68
3.4.7 Jointure-
Table Client Table Commande altérée
noClient nomClient noTéléphone noCommande dateCommande numéroClient
10 Luc Sansom (999)999-9999 1 01/ 06/ 2000 10
20 Dollard Tremblay (888)888-8888 2 02/ 06/ 2000 20
30 Lin Bô (777)777-7777 3 02/ 06/ 2000 10
40 Jean Leconte (666)666-6666 4 05/ 07/ 2000 10
50 Hafedh Alaoui (555)555-5555 5 09/ 07/ 2000 30
60 Marie Leconte (666)666-6666 6 09/ 07/ 2000 20
70 Simon Lecoq (444)444-4419 7 15/ 07/ 2000 40
80 Dollard Tremblay (333)333-3333 8 15/ 07/ 2000 40

Client  noClient = numéroClient Commande altérée =


 noClient = numéroClient (Client  Commande
10 altérée)
noClient nomClient noTéléphone noCommande dateCommande numéroClient
Luc Sansom (999)999-9999 1 01/ 06/ 2000 10
10 Luc Sansom (999)999-9999 3 02/ 06/ 2000 10
10 Luc Sansom (999)999-9999 4 05/ 07/ 2000 10
20 Dollard Tremblay (888)888-8888 2 02/ 06/ 2000 20
20 Dollard Tremblay (888)888-8888 6 09/ 07/ 2000 20
30 Ye San Le Sou (777)777-7777 5 09/ 07/ 2000 30
40 Jean Leconte (666)666-6666 7 15/ 07/ 2000 40
40 Jean Leconte (666)666-6666 8 15/ 07/ 2000 40

04/09/23 © Robert Godin. Tous droits réservés. 69


Cherchez les LigneCommandes qui
ont été livrées en une seule livraison Table DétailLivraison
Table LigneCommande noLivraison noCommande noArticle quantitéLivrée
noCommande noArticle quantité 100 1 10 7
1 10 10 100 1 70 5
1 70 5 101 1 10 3
1 90 1 102 2 40 2
2 40 2 102 2 95 1
2 95 3 100 3 20 1
3 20 1 103 1 90 1
4 40 1 104 4 40 1
4 50 1 105 5 70 2
5 70 3
5
5
10
20
5
5
 LigneCommande.noCommande, LigneCommande.noArtilce, quantité,
noLivraison, quantitéLivrée (LigneCommande 
6 10 5
6 40 1
7 50 1
7 95 2
8 20 3
LigneCommande.noCommande = DétailLivraison.noCommande ET

LigneCommande.noArticle = DétailLivraison.noArticle ET quantité =

quantitéLivrée
1
DétailLivraison)
noCommande noArticle
70
quantité noLivraison
5 100
quantitéLivrée
5
1 90 1 103 1
2 40 2 102 2
3 20 1 100 1
4 40 1 104 1

04/09/23 © Robert Godin. Tous droits réservés. 70


3.4.8 Jointure externe
 Inclure les « célibataires »
 La jointure externe à gauche
 T1 = T2 (célibataires de T1 )

 La jointure externe à droite


 T1 = T2

 La jointure externe pleine


 T1 == T2

04/09/23 © Robert Godin. Tous droits réservés. 71


Produire les informations au sujet des Clients
et de leurs Commandes incluant les
informations sur les Clients qui n’ont pas
placé de Commande
noClient
Table Client
nomClient noTéléphone
Table Commande
noCommande dateCommande noClient
10 Luc Sansom (999)999-9999 1 01/ 06/ 2000 10
20 Dollard Tremblay (888)888-8888 2 02/ 06/ 2000 20
30 Lin Bô (777)777-7777 3 02/ 06/ 2000 10
40 Jean Leconte (666)666-6666 4 05/ 07/ 2000 10
50 Hafedh Alaoui (555)555-5555 5 09/ 07/ 2000 30
60 Marie Leconte (666)666-6666 6 09/ 07/ 2000 20
70 Simon Lecoq (444)444-4419 7 15/ 07/ 2000 40
80 Dollard Tremblay (333)333-3333 8 15/ 07/ 2000 40

Client = Commande
noClient nomClient noTéléphone noCommande dateCommande
10 Luc Sansom (999)999-9999 1 01/ 06/ 2000
10 Luc Sansom (999)999-9999 3 02/ 06/ 2000
10 Luc Sansom (999)999-9999 4 05/ 07/ 2000
20 Dollard Tremblay (888)888-8888 2 02/ 06/ 2000
20 Dollard Tremblay (888)888-8888 6 09/ 07/ 2000
30 Lin Bô (777)777-7777 5 09/ 07/ 2000
40 Jean Leconte (666)666-6666 7 15/ 07/ 2000
40 Jean Leconte (666)666-6666 8 15/ 07/ 2000
50 Hafedh Alaoui (555)555-5555 null null
60 Marie Leconte (666)666-6666 null null
70 Simon Lecoq (444)444-4419 null null
80 Dollard Tremblay (333)333-3333 null null

04/09/23 © Robert Godin. Tous droits réservés. 72


3.4.9 Semi-jointure ()
Table Client Table Commande
noClient nomClient noTéléphone noCommande dateCommande noClient
10 Luc Sansom (999)999-9999 1 01/ 06/ 2000 10
20 Dollard Tremblay (888)888-8888 2 02/ 06/ 2000 20
30 Lin Bô (777)777-7777 3 02/ 06/ 2000 10
40 Jean Leconte (666)666-6666 4 05/ 07/ 2000 10
50 Hafedh Alaoui (555)555-5555 5 09/ 07/ 2000 30
60 Marie Leconte (666)666-6666 6 09/ 07/ 2000 20
70 Simon Lecoq (444)444-4419 7 15/ 07/ 2000 40
80 Dollard Tremblay (333)333-3333 8 15/ 07/ 2000 40

Client
Commande
noClient nomClient noTéléphone
10 Luc Sansom (999)999-9999
20 Dollard Tremblay (888)888-8888
30 Lin Bô (777)777-7777
40 Jean Leconte (666)666-6666
04/09/23 © Robert Godin. Tous droits réservés. 73
3.4.10 Opérations
ensemblistes (,, -)
 Schémas compatibles
Table T 1 Table T 2
A B A B
1 1 2 2
2 2 3 3

T1  T2 T1  T2 T1 - T2 T2 – T1
A B A B A B A B
1 1 2 2 1 1 3 3
2 2
3 3

04/09/23 © Robert Godin. Tous droits réservés. 74


Produire les noms et numéros de téléphone des
Employés qui sont aussi des Clients de la pépinière
Table Client
noClient nomClient noTéléphone
10 Luc Sansom (999)999-9999
20 Dollard Tremblay (888)888-8888
30 Lin Bô (777)777-7777 Table Employé
40 Jean Leconte (666)666-6666 codeEmployé nomEmployé noTéléphone
50 Hafedh Alaoui (555)555-5555 CASD1 Dollard Tremblay (888)888-8888
60 Marie Leconte (666)666-6666 PIOY1 Yan Piochuneshot 911
70 Simon Lecoq (444)444-4419 LAFH1 Yvan Lafleur (111)111-1111
80 Dollard Tremblay (333)333-3333 HASC1 Jean Leconte (666)666-6666

( nomPersonne, noTéléphone ( Client (noClient, nomPersonne, noTéléphone) (Client))) 


( nomPersonne, noTéléphone ( Employé (codeEmployé, nomPersonne, noTéléphone)
(Employé)))
nomPersonne noTéléphone équivalent à  si
Dollard Tremblay (888)888-8888
Jean Leconte (666)666-6666
compatibles

04/09/23 © Robert Godin. Tous droits réservés. 75


3.4.11 Division ()
 AB
– plus grande table C qui est telle que B  C  A
– ~ inverse du produit cartésien
 T1 (X)  T2 (Y) =
–  X-Y (T1) - (( X-Y (T1)  T2 ) - T1)

04/09/23 © Robert Godin. Tous droits réservés. 76


Quelles sont les noCommande des Commandes qui
incluent tous les Articles dont le prixUnitaire est
$10.99
 noCommande, noArticle  noArticle ( prixUnitaire = 10.99
(LigneCommande)
noCommande noArticle (Article))noArticle
1 10
1 70
10
1 90 70
2 40
2 95
3 20
 noCommande, noArticle
4 40
4 50 (LigneCommande)   noArticle (
5 70
5 10 prixUnitaire = 10.99 (Article))
5 20 noCommande
6 10 1
6 40 5
7 50
7 95
04/09/23 © Robert Godin. Tous droits réservés. 77
3.4.12 Ensemble minimal
d'opérations de l'algèbre relationnelle

 Sélection ()
 Projection ()
 Produit cartésien ()
 Union ()
 Différence (-)
 Renommage ()

04/09/23 © Robert Godin. Tous droits réservés. 78


3.4.13 Extensions de l'algèbre
relationnelle pour les bases de données

 Fonctions sur colonnes


– opérations arithmétiques (+, - , *, /,…)
– manipulation de chaînes (concaténation, …)
– ...
 Fonctions de groupe (ou d'agrégat)
– e.g. total, moyenne, écart-type, min, max,…
 Récursivité
– e.g. fermeture transitive

04/09/23 © Robert Godin. Tous droits réservés. 79

Vous aimerez peut-être aussi