Base info : Schéma Relationnel (MLDR)

1 - Individu et attributs

Chaque objet du système d'information peut être défini comme une relation entre l'individu et les attributs qui le décrivent.

Exemple : pour l'objet BUS, il y a une relation entre l'individu BUS et les attributs numéro, modèle, motorisation, nombre de places, date de mise en service.

2 - Atomicité des attributs

Chaque attribut est le plus élémentaire possible : c'est l'atomicité.

Exemple : une donnée adresse 8 rue Foch 38000 Grenoble peut etre décomposée en trois attributs élémentaires :

adresse rue 8 rue Foch

code postal 38000

ville Grenoble

3 - Clé primaire

Un attribut permet d'identifier sans ambiguïté un individu parmi les autres : c'est la clé primaire.

Exemple : pour le BUS, c'est manifestement le numéro qui permet de repérer sans ambiguïté un bus parmi les autres bus de la compagnie.

La clé primaire obéit à trois règles :

  • unicité : la clé primaire permet d'accéder à un individu unique, comme une clé permet d'ouvrir une porte. Deux individus ne pourront avoir la même clé primaire sinon, on les confondrait (si une clé permet d'ouvrir plusieurs portes, on ne pourra pas savoir quelle porte sera ouverte à la simple vue de la clé...) ;

  • existence : tout individu doit pouvoir se voir affecter une valeur de clé primaire (une valeur de clé primaire ne doit pas être vide) ;

  • stabilité : la valeur de la clé primaire d'un individu ne doit pas pouvoir changer (exemple dans le tableau du point 5: le bus GX317 mis en service le 01/03/2002 gardera toujours le numéro 25).

De plus, la clé primaire ne doit pas être empruntée à une autre organisation (ici, le numéro d'immatriculation automobile attribué par la Préfecture ne conviendrait donc pas).

4 - Présentation des relations

La relation BUS sera représentée comme suit :

BUS (Numéro_bus, Modèle_bus, Motorisation_bus, Nb_places_bus, Date_mise_serv_bus)

La clé primaire est soulignée. La relation LIGNE sera représentée comme suit :

LIGNE (Numéro-ligne, Départ_ligne, Terminus-ligne)

Afin que chaque attribut soit repéré par son nom sans aucune hésitation, on distingue ici les deux numéros pour ne pas les confondre : Numéro_bus d'une part, Numéro_ligne d'autre part. Pour mieux repérer les attributs, on peut faire suivre le nom strict de l'attribut par le nom (ou le début du nom) de la relation (comme ici avec bus ou ligne).

Pour faciliter leur manipulation, certains attributs peuvent se voir affecter un nom symbolique (Nb_places_bus, Date_mise_serv_bus).

5 - Tuples de la relation (occurrence)

Il est possible de visualiser différents exemples d'une relation.

Ainsi, de même qu'il y a différents bus, la relation BUS prendra des valeurs pour chacun de ses attributs.

Une ligne de la relation = un individu = un tuple = une occurrence

Exemple: le bus 21 est un tuple de la relation BUS.

6 - Valeurs des attributs

Chacun des attributs prend une valeur pour un individu (tuple) donné (le bus 21 n'a qu'une seule valeur de Numéro_bus - 21 -, une seule valeur de Modèle_bus - GX317 -, une seule valeur de Motorisation_bus Diesel-, une seule valeur de Nb_places_bus - 107 -, une seule valeur de Date_mise_serv_bus - 12/10/2000).

L'ensemble des valeurs que peut prendre un attribut s'appelle le domaine de valeurs : ce domaine peut être un ensemble de valeurs, un intervalle (de 1 à 100) ou défini par rapport à la taille (e.g. entier -> nombres décimaux non possibles).

Exemple : Motorisation_bus ne peut prendre que Diesel ou Gaz comme valeur : le domaine de valeurs est donc {Diesel, Gaz} ; si on affecte à Motorisation_bus la valeur Essence, on ne respecte pas la contrainte d'intégrité de domaine, Essence ne figurant pas dans le domaine de valeurs de l'attribut.

8.1 - Lien entre les relations, Cas simple

Il existe une interdépendance entre les deux objets BUS et LIGNE: les 150 bus desservent 17 lignes, chaque bus desservant une seule ligne. Comment la représenter dans la base de données ?

Si je me place du côté de la ligne, je peux avoir plusieurs bus (150 bus desservent 17 lignes) -> la représentation nous obligerait à ajouter plusieurs numéros de bus (mais combien ?) dans la relation LIGNE.

Si, par contre, je me place dans la relation BUS, il suffit d'ajouter un attribut qui permettrait de voir à quelle ligne est affectée le bus : chaque bus dessert une seule ligne.

Quel attribut est le mieux placé pour montrer sans ambiguïté la ligne ? La clé primaire de la relation LIGNE, ici le Numéro_ligne.

Cela conduit au schéma relationnel complet:

BUS (Numéro_bus, Modèle bus, Motorisation_bus, Nb_places_bus, Date_mise_serv_bus, #Numéro-ligne) LIGNE (Numéro_ligne, Dépard_ligne, Terminus_ligne)

L'attribut ajouté qui « représente » la clé primaire s'appelle clé étrangère.

Pour ne pas confondre clé primaire et clé étrangère, les attributs clés étrangères des relations peuvent être préfixés d'un #.

8.2 - Lien entre les relations, Cas complexe

Supposons que l'affection des bus aux lignes est la suivante: les 150 bus desservent 17 lignes, chaque bus pouvant desservir plusieurs lignes.

Extrait des affectations: ligne 1 : bus n° 2,14,15,16,24 ; ligne 2 : bus n° 3,11,15,18 ; ligne 3 : bus n° 1, 5,11

Puisqu'une ligne se voit affecter plusieurs bus, et que chaque bus peut desservir plusieurs lignes (dans cet exemple), il est difficile de trouver une représentation qui évite la répétition des attributs.

Dans ce cas, on ajoute une relation (Desservir) pour apparier les bus et les lignes :

BUS (Numéro_bus, Modèle_bus, Motorisation_bus, Nb_places_bus, Date_mise_serv_bus)

LIGNE (Numéro_ligne, Dépard_ligne, Terminus_ligne)

DESSERVIR (#Numéro_bus, #Numéro_ligne)

Pour définir la clé primaire de la relation DESSERVIR, on utilise la clé primaire des deux autres relations.

Bien entendu, comme pour n'importe quelle relation, cette relation peut avoir d'autres attributs.

9 - Présentation du schéma relationnel

Pour une meilleure visualisation du lien entre les relations, le schéma relationnel présenté en ligne peut être visualisé sous forme graphique.

BUS (Numéro_bus, Modèle_bus, Motorisation_bus, Nb_places_bus, Date_mise_serv_bus)

LIGNE (Numéro liqne, Dépard_ligne, Terminus_ligne)

DESSERVIR (#Numéro_bus,# Numéro_ligne)