Académique Documents
Professionnel Documents
Culture Documents
<<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
<<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
<<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
<<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
<<datatype>> <<domain>>
TypeDonnéesAnnée DomaineAnnée
{Integer > 0 } {INTEGER CHECK value > 0 }
<<domain>>
DomaineStatut
{VARCHAR(15) CHECK value IN ('prêté','disponible','retiré')}
<<table>>
Exemplaire <<table>>
{Clé candidate : idExemplaire} DomaineStatut
idExemplaire : VARCHAR(10) {Clé primaire : statut}
dateAchat : Date statut : VARCHAR(15)
statut : VARCHAR(15)
<<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
<<table>>
<<table>>
Groupe
Cours
{Cl é primaire : sigle, num éro, session}
{Clé prim aire :si gle}
sigle
sigle
numéro
titre
session
nbCrédits
nbMaximumInscrits
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
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
<<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
<<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
<<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
<<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
<<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)
<<table>>
NoteObtenue
{Clé primaire : codePermament, sigle}
codePermament
sigle
note
session
<<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)
<<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
<<table>>
<<table>>
Passeport
Citoyen
{Clé primaire : noPasseport}
{Clé primaire : noAssurranceSociale}
noPasseport
noAssurranceSociale
dateExpiration
nom
{Clé candidate : noAssurranceSociale}
prénom
noAssurranceSociale
<<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
parent 0..1
<<table>>
Catégorie
{Clé primaire : code}
code : VARCHAR(10)
descripteur : VARCHAR(20)
codeParent : VARCHAR(10)
codeParent
Délégation
Fusion
Concaténation
<<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é
<<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é
<<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
<<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
<<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)
<<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 »)
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
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
<<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
<<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
Article
LigneCommande
Client Commande
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
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
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
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
Sélection ()
Projection ()
Produit cartésien ()
Union ()
Différence (-)
Renommage ()