Schéma relationnel

Objectifs

  • Savoir décrire une relation grâce à un schéma relationnel ;

  • Savoir représenter les différents types de clé.

Mise en situation

Le modèle relationnel décrit, comme son nom l'indique, des relations : elles font intervenir plusieurs concepts, comme les attributs, les domaines, les clés primaires, les clés étrangères...

Afin de formaliser les relations, il faut bien écrire quelque part leur “fiche”, qui décrit les différents attributs ainsi que leur nature.

On pourrait décrire les relations en langage naturel, mais il y aurait alors des risques d’ambiguïté.

Une solution, c'est d'utiliser un schéma relationnel, qui permette de décrire une relation sans ambiguïté et dans son intégralité : vous allez voir comment dans ce module.

DéfinitionSchéma d'une relation

Le schéma d'une relation définit cette relation en intension. Il est composé :

  • du nom de la relation,

  • de la liste de ses attributs avec les domaines respectifs dans lesquels ils prennent leurs valeurs,

  • de la clé primaire,

  • des clés étrangères,

  • des clés candidates.

DéfinitionSchéma relationnel d'une base de donnée

Le schéma relationnel d'une BD est la définition en intension de cette BD (par opposition à l'instance de la BD qui est une extension de la BD). Il est composé de l'ensemble des schémas de chaque relation de la BD.

SyntaxeRelation

1
Relation (attribut1:domaine1, attribut2:domaine2, ... , attributN:domaineN)

La relation "Relation" contient N attributs chacun défini sur son domaine.

SyntaxeClé primaire

1
Relation (#attribut1:domaine1, ... , #attributM:domaineM, ... , attributN:domaineN)

La clé de la relation « Relation » est composée des attributs « Attribut1 » à « AttributM » (attributs précédés du caractère #)

En général on note la clé primaire en premier dans la relation.

SyntaxeClé étrangère

1
Relation1 (..., attributM=>Relation2, ... , attributN=>Relation2)

La relation « Relation1 » comporte une clé étrangère (composée des attributs « attributM » à « attributN ») référençant la clé primaire de « Relation2 ».

En général on note les clés étrangères en dernier dans la relation, sauf pour les clés étrangères qui font partie de la clé primaire (clés identifiantes).

Complément

  • Bien sûr il peut exister plusieurs clés étrangères vers plusieurs relations distinctes.

  • Une clé étrangère et sa clé primaire référencée sont toujours composées du même nombre d'attributs.

  • Il n'est pas nécessaire de préciser les domaines des attributs appartenant à la clé étrangère car ce sont forcément les mêmes que ceux de la clé primaire référencée.

  • Il n'est pas non plus en général nécessaire de préciser dans le schéma relationnel quels attributs de la clé étrangère référencent quels attributs de la clé primaire (cela est généralement évident) mais il est possible de la faire en notant « Attribut=>Relation.Attribut ».

SyntaxeClé candidates

1
Relation1 (..., attributM:DomaineM, ...) avec attributM clé

Les clés candidates doivent être notées sur le schéma relationnel :

  • S'il n'y a qu'une ou deux clés candidates, les noter directement après la définition de la relation.

  • S'il y a beaucoup de clés, pour ne pas trop alourdir la notation, renvoyer à un tableau à part.

ExempleAvion et Compagnie Aérienne

On peut exprimer en relationnel ces tables de cette façon :

1
Avion(#immatriculation:chaîne, modele:chaîne, heures_de_vol:entier, oaci=>CompagnieAerienne)
2
3
CompagnieAerienne(#oaci:chaîne, denomination:chaîne, siege_social:chaîne) avec denomination clé

AttentionClés candidates et clé primaire

La notation R(#a,#b) signifie toujours que R a comme clé primaire (a,b), et non que R aurait deux clés a et b (dont on ne saurait pas laquelle est primaire).

La notation R(#a,b) avec b clé signifie bien que a et b sont deux clés de R, et que a est primaire.

Il ne faut pas confondre une clé composée de deux attributs avec deux clés.

ComplémentTraduction des contraintes

Si le modèle conceptuel contient des contraintes spécifiques aux classes, alors on les liste après la relation associée.

Par exemple, le modèle conceptuel suivant :

@startumlskinparam defaultFontName Inconsolataskinparam classFontStyle boldskinparam linetype orthohide circleclass Inscription {année: integer {unique}note: realects: integer}note left of Inscriptionnote dans [0, 20]end note@enduml

Se traduit comme :

1
Inscription(#annee:entier, note:réel, ects:entier) avec note dans [0, 20]

Cela vaut aussi pour certaines contraintes dues aux cardinalités des associations. Par exemple, le modèle conceptuel suivant :

@startumlskinparam defaultFontName Inconsolataskinparam classFontStyle boldskinparam linetype polylineskinparam nodesep 100hide circleclass Medicament {nom: varchar {unique}description: varchardescription_longue: varcharconditionnement: integer}class Composant {code: varchar {unique}intitule: varchar}Medicament "1"--"1..*" Composant: utilise@enduml

Se traduit comme :

1
Medicament(#nom:varchar, description:varchar, description_longue:varchar, conditionnement:entier) avec au moins un Composant référant
2
3
Composant(#code:varchar, intitule:varchar, medicament=>Medicament) avec medicament non null