Transformation des associations N:M
Impossible d'accéder à la ressource audio ou vidéo à l'adresse :
La ressource n'est plus disponible ou vous n'êtes pas autorisé à y accéder. Veuillez vérifier votre accès puis recharger la vidéo.
Objectif
Savoir intégrer des associations de type N:M dans des relations.
Mise en situation
De nombreux modèles conceptuels contiennent des associations N:M. Pensez par exemple à un système d'emprunt de bibliothèque, où chaque livre peut être emprunté par plusieurs personnes, et où chaque personne peut emprunter plusieurs livres.
Au moment de passer au modèle relationnel, une problématique forte se pose : impossible de représenter cette association en ajoutant une clé étrangère représentant le livre dans la relation personne. En effet, si cette manière de faire permet de dire quel livre a été emprunté par quelle personne, impossible de représenter le fait qu'une personne ait emprunté plusieurs livres !
Comment faire ? C'est ce que vous allez découvrir dans ce module.
Méthode :
Pour chaque association de type M:N
:
on crée une nouvelle table,
composée de deux clés étrangères, une vers chaque table associée aux classes liées,
et dont la clé primaire est la concaténation de ces deux clés étrangères.
Table1 (#a:type, b:type)
Table2 (#c:type, d:type)
Assoc (#a=>Table1,#c=>Table2)
Exemple :
@startuml
skinparam defaultFontName Inconsolata
skinparam classFontStyle bold
skinparam linetype polyline
skinparam nodesep 100
hide circle
class Hotel {
nom : string {unique}
adresse : string
codePostal : string
ville : string
étoiles : integer
}
class Restaurant {
nom : string {unique}
étoiles : integer
}
Hotel "1..1" - "*" Restaurant : est-situé <
class Chef {
nom : string
prénom : string
}
Restaurant "*" - "*" Chef : cuisine-dans <
@enduml
Hotel(#nom:string, adresse:string, codePostal:string, ville:string, étoiles:integer)
Restaurant (#nom::string, étoiles:integer, hotel=>Hotel) avec hotel non null
Chef (#id:integer, nom:string, prénom:string)
Cuisine (#chef=>Chef, #restaurant=>Restaurant)
Complément : Expressions des contraintes de cardinalité minimale
Si la cardinalité est au moins 1 (1..N
) d'un côté et/ou de l'autre, alors des contraintes d'existence simultanée de tuples devront être ajoutées. Cela peut être exprimé avec des projections.
Table1 (#a:type, b:type)
Table2 (#c:type, d:type)
Assoc (#a=>Table1, #c=>Table2)
Contraintes : PROJECTION(Table1,a) = PROJECTION(Assoc,a) AND PROJECTION(Table2,c) = PROJECTION(Assoc,c)
Si la cardinalité est 0..N:1..N
, alors seule une des deux contraintes est exprimée.
Impossible d'accéder à la ressource audio ou vidéo à l'adresse :
La ressource n'est plus disponible ou vous n'êtes pas autorisé à y accéder. Veuillez vérifier votre accès puis recharger la vidéo.