Apprendre les BDD relationnelles : Modèle Logique de Données (MLD)
Le Modèle Logique de Données (MLD) est un diagramme qui a pour but d'adapter un MCD à un type de base de données spécifique.
Un modèle détaillé
Une fois notre MCD défini, le MLD va nous permettre de valider sa conformité.
Bien que lui aussi indépendant de toute implémentation physique ou logicielle, le MLD consiste à détailler l’implémentation pour un type de base de données spécifique.
Il ne s’agit pas encore de concevoir la base de données mais de l’implémenter selon un modèle spécifique ; relationnel en ce qui nous concerne. Nous y détaillerons ainsi entre autres nos clés primaires et étrangères.
Le MLD peut s’écrire sous forme textuelle ou via un diagramme ressemblant au MCD. Nous aborderons ici l’écriture textuelle, bien plus synthétique.
Règles de traduction d’un MCD en MLD
Détaillons les étapes permettant de traduire un MCD en MLD pour une base de données relationnelle. Considérons le MCD du chapitre précédent :
Traduction des termes
Un MLD se veut détailler l’implémentation de la base de données pour un modèle spécifique. Notre point de vue change naturellement et il nous faut dans un premier temps adapter notre champ lexical.
Entités -> tables
On réécrit sur chaque ligne nos entités en tant que tables à l’exception des entités relationnelles (Publie
, Possède
…).
On notera généralement le nom de la table en minuscules (lowercase
), au pluriel et sans caractères spéciaux.
Une bonne pratique consiste d’ailleurs à en profiter pour traduire ses entités en anglais, rendant le MLD plus unniversel.
avatars
users
comments
articles
categories
Exemple : Catégorie
du MCD, devient categories
dans un MLD.
Propriétés -> attributs
On spécifie pour chaque table ses attributs entre parenthèses. Il est désormais temps d’adopter une casse pour nos attributs. On utilise généralement la 🐍 snake_case
.
En anglais, pour conserver la même convention de nommage.
avatars(id, path, is_valid)
users(id, email, password, registered_at, role)
comments(id, content, published_at)
articles(id, title, description, content, published_at)
categories(id, name)
Identifiants -> clés primaires
L’identifiant est désormais appelé « clé primaire ». Il doit être le premier attribut listé et être souligné.
avatars(i̲d̲, path, is_valid)
users(i̲d̲, email, password, registered_at, role)
comments(i̲d̲, content, published_at)
articles(i̲d̲, title, description, content, published_at)
categories(i̲d̲, name)
Traduction des relations
Du côté de nos relations, il est temps d’implémenter les notions de clés étrangères et de tables de liaison.
1:1
: création d’une clé étrangère
L’entité relationnelle disparaît pour laisser place à une clé étrangère qui sera soumise à une contrainte d’unicité. La table propriétaire de la clé étrangère est :
- La table de notre choix si la relation est de même cardinalité des deux côtés (
0,1
et0,1
ou1,1
et1,1
) - La table pouvant avoir une multiplicité nulle si la relation est facultative (
0,1
et1,1
et inversement)
avatars(i̲d̲, path, is_valid, #user_id)
users(i̲d̲, email, password, registered_at, role)
comments(i̲d̲, content, published_at)
articles(i̲d̲, title, description, content, published_at)
categories(i̲d̲, name)
Dans cet exemple :
#user_id
dans avatars
- « Un
Utilisateur
Upload
au moins0
et au plus1
Avatar
» - « Un
Avatar
Est uploadé par
au moins1
et au plus1
Utilisateur
»
avatars
est donc le côté potentiellement nul de la relation, c’est lui qui contient la clé étrangère #user_id
1:n
: création d’une clé étrangère
L’entité relationnelle disparaît pour laisser place à une clé étrangère dans la table se trouvant du côté n de la relation.
Une clé étrangère est généralement désignée par le nom de la table qu’elle référence (au singulier - car elle référence un enregistrement précis de cette table), suivi de _id
. On la préfixera d’un #
(« hashtag »). Exemple : #user_id
avatars(i̲d̲, path, is_valid, #user_id)
users(i̲d̲, email, password, registered_at, role)
comments(i̲d̲, content, published_at, #user_id, #article_id)
articles(i̲d̲, title, description, content, published_at, #user_id)
categories(i̲d̲, name)
Dans cet exemple :
#user_id
dans comments
- « Un
Utilisateur
Publie
au moins0
et au plusn
Commentaire
» - « Un
Commentaire
Est publié par
au moins1
et au plus1
Utilisateur
»comments
est donc le côtén
, c’est lui qui contient la clé étrangère#user_id
#article_id
dans comments
- « Un
Article
Possède
au moins 0 et au plus nCommentaire
» - « Un
Commentaire
Est possédé par
au moins 1 et au plus 1Article
»comments
est donc le côté n, c’est lui qui contient la clé étrangère#article_id
#user_id
dans articles
- « Un
Utilisateur
Publie
au moins0
et au plusn
Article
» - « Un
Article
Est publié par
au moins1
et au plus1
Utilisateur
»articles
est donc le côtén
, c’est lui qui contient la clé étrangère#user_id
n:n
: création d’une table de liaison
L’entité relationnelle disparaît pour laisser place à une table dite « de liaison » contenant des clés étrangères vers les tables liées. Le couple formé par les clés étrangères constitue la clé primaire de cette table.
avatars(i̲d̲, path, is_valid, #user_id)
users(i̲d̲, email, password, registered_at, role)
comments(i̲d̲, content, published_at, #user_id, #article_id)
articles(i̲d̲, title, description, content, published_at, #user_id)
categories(i̲d̲, name)
articles_get_categories(#̲a̲r̲t̲i̲c̲l̲e̲_̲i̲d̲, #̲c̲a̲t̲e̲g̲o̲r̲y̲_̲i̲d̲)
Table de liaison articles_get_categories
entre articles
et categories
- « Un
Article
Possède
au moins0
et au plusn
Catégories
» - « Une
Catégorie
Est possédée par
au moins0
et au plusn
Article
»categories
etarticles
sont tous deux du côtén
, on ajoute alors une table de liaisonarticles_get_categories
dans laquelle on forme des couples de clés étrangères#article_id
et#category_id
.