Modelisation Base De Donnees

Temps d'étude : 1h. Niveau : Moyen.
Tags : Base de données, cours sql, modélisation, mcd

Modèle MCD

Avant de créer une base de données, il est essentiel de se poser et de réfléchir sur la modélisation.

En effet, une base de données va servir de support à une application informatique. C'est la raison pour laquelle il vaut mieux éviter de se tromper.

Rien est irréversible, mais changer la modélisation d'une base de données en cours de projet n'est pas recommandé car cela forcera certainement à réécrire une bonne partie du code (script) ce qui peux prendre énormément de temps et entrainer des conséquences telles qu'un déréglement d'autres parties de l'application.

Comment modéliser une base de données ?

Nous pouvons modéliser sur papier si celle-ci n'est pas complexe mais dans la plupart des cas nous aurons besoin d'un logiciel pour nous accompagner et avoir une vue d'ensemble.

Un logiciel connu permet de modéliser une base de données : Mysql WorkBench

D'autres outils et logiciels performant existent. Pour une bonne conception de sa base de données, il faut réfléchir en terme de sujet en modélisant ceux du monde réél.

La modélisation se compose de différentes tables (table = sujet).

Par exemple, si nous vendons des produits sur notre site, nous aurons 1 table produit, mais aussi 1 table commande.


Les tables

1 sujet représente 1 table dans une base de données. 1 table est un emplacement de sauvegarde.

Les données sont stockées à l'intérieur de tables. Une table peut être comparée à une liste, qui contient des enregistrements relatifs à un sujet bien défini.

Il faut réfléchir au sujet et à ses conséquences. Si nous vendons des produits, nous aurons certainement des membres. 1 table membre sera donc nécessaire.

En terme de fonctionnalité, si nous souhaitons proposer un abonnement newsletter aux membres, nous aurons besoin d'1 table newsletter repertoriant les membres abonnés.

1 table = 1 sujet



Les colonnes / champs

Chaque table possède généralement plusieurs champs (aussi appelés colonnes).

Les colonnes / champs représentent des caractéristiques relatives au sujet (la table).

Pour savoir, quelle colonne mettre dans quelle table, il faut se poser la question suivante : qu'est-ce qui pourrait décrire mon sujet ? quelles sont les informations sur mon sujet ?

Par exemple, la table membre aura les champs : pseudo, mot de passe, nom, prenom, adresse, etc.

Nous enregistrerons toutes les caractèristiques d'un membre.

Pour la table produit, nous retrouverons des champs comme : titre, catégorie, couleur, taille, poids, prix, etc.

Nous n'irons pas mettre le champ pseudo dans la table produit. Un produit n'a pas de pseudo ! C'est illogique.

De la même manière, nous n'irons pas mettre le champ prix dans la table membre. Un membre représente une personne et n'a pas de prix !


Les types de colonnes / champs

3 grandes catégories de champs ressortent : les types numériques, chaînes de caractères (texte) et temporels (dates).

Voici généralement les plus utilisés :

Type de champ Description Contexte
VARCHAR Chaine (jusqu'à 256 caractères) Nous pourrons choisir ce champ pour enregistrer un pseudo, un email, le titre d'un produit ou d'un article de blog, etc.
TEXT Chaine de caractère (illimité) Nous pourrons choisir ce champ pour enregistrer le texte d'un article de blog
INT numérique Nous pourrons choisir ce champ pour enregistrer les numéros d'un champ servant d'identifiant, un prix, un code postal, le nombre de produits en stock, etc.
DATE Date Nous pourrons choisir ce champ pour enregistrer la date d'enregistrement d'une commande, d'un article de blog, etc.

Il existe d'autres types de champs complémentaires et utiles.


Les identifiants (Clé Primaire - PK Primay Key)

Les identifiants sont des champs (colonnes) un peu particuliers car ils ne décrivent pas le sujet (ce n'est pas une des caractéristiques du sujet) mais ce sont des colonnes (champs) systématiquement présent dans chaque table et ce en première position.

Chaque table possède une colonne (champ) identifiant. Nous appellerons cela une clé primaire (PK).

Par exemple, nous pourrons l'appeler "id" ou encore "idProduit" pour la table produit, et "idMembre" pour la table membre.

Il s'agit d'une liste numérotée permettant de différencier chaque enregistrement de manière unique.

Le produit "tshirt rouge" deviendra (par exemple) le produit n°396 "tshirt rouge".

Pour éviter de choisir le numéro et faire des erreurs nous demanderons à le générer automatiquement avec l'Auto_Increment.


Auto_Increment

Auto_Increment est une option permettant de générer un numéro unique dans une colonne (champ) de type clé primaire (identifiant).

Par conséquent, retenez bien que le 1er champ de chaque table sera systématiquement un "id" qui sera PK (Primary Key) et AI (Auto_Increment).


NULL / NOT NULL

Dans chaque champ, nous pourrons indiquer si nous acceptons les valeurs NULL ou non (NOT NULL).

NULL est un type de valeur en informatique évitant de laisser un champ vide si nous n'avons pas d'informations à y déposer.


Les relations

Il arrive parfois que les sujets interagissent entre eux.

Exemple : 1 membre commande 1 produit (ou 1 produit est commandé par 1 membre), nous devrons enregistrer l'information dans 1 table commande.

Autre exemple : 1 conducteur conduit 1 véhicule (ou 1 véhicule est conduit par 1 conducteur). il nous faudra une table permettant de préciser quel conducteur va avec quel véhicule.

Pour cela, intéréssons nous aux cardinalités !


Les cardinalités

Les cardinalités permettent de connaitre le chiffre minimum et maximum d'enregistrement pour une relation.

Exemple :

image manquante

Dans notre exemple, un homme est le fils d’une femme et d’une seule (minimum = 1, maximum = 1).

En revanche, une femme peut avoir plusieurs enfants ou aucun (minimum = 0, maximum = n).

Autre exemple : 1 livre possède forcément 1 auteur et qu'1 seul. Relation (1,1). Minimum 1 auteur, Maximum 1 auteur.

1 auteur peut avoir écrit plusieurs livre (ou aucun). Relation (0,n). Minimum 0 livre, Maximum N livres

Pour ces raisons, nous pourrions imaginer les tables suivantes :

Auteur
idAuteur nom
1 auteur 1
2 auteur 2
Livre
idLivre titre categorie idAuteur
1 livre 1 romance 2
2 livre 2 drame 1



De cette manière nous savons : quel auteur à écrit quel livre.

Et aussi : quel livre a été écrit par quel auteur.

Au vue des cardinalités, nous n'avons pas besoin de créer une table de jointure spécifique et supplémentaire.


Table de jointure

Une table de jointure permet de faire le lien entre 2 tables.

Par exemple, prenons le cas d'une société taxis qui posséderait des conducteurs (table conducteur) et des véhicules (table véhicule).

Dans notre schéma, nous dirons :

fléche 1 conducteur peut conduire 0 ou plusieurs véhicules.
Relation (0,n). Minimum 0 véhicule, Maximum N véhicule.

fléche 1 véhicule peut être conduit par 0 ou plusieurs conducteur.
Relation (0,n). Minimum 0 conducteur, Maximum N conducteurs.

Comment savoir quel conducteur conduit quel véhicule ? ou dans l'autre sens : quel véhicule est conduit par quel conducteur ?

Une table de jointure nommée : conducteur_vehicule (ou vehicule_conducteur) sera donc créee avec les champs suivants :

- idVehiculeConducteur

- idConducteur

- idVehicule

De cette manière, nous sommes certains d'avoir de la visibilité sur les relations entre les conducteurs et les véhicules.

Conducteur
idConducteur nom
1 alexandre
2 julien

Vehicule
idVehicule modele
1 mercedes
2 bmw
Table de jointure : conducteur_vehicule
idConducteurVehicule idConducteur idVehicule
1 1 2
2 2 2
3 1 1



Avec cette table de jointure, nous savons qu'Alexandre conduit à la fois la mercedes et la bmw tandis que julien conduit uniquement la bmw.


Clé étrangère

Les clés étrangères sont des champs forcément clé primaire dans leur table d'origine, se retrouvant également présent dans une table extérieure.
Un champ clé étrangère (liste numérotée) placé à l'extérieur de leur table d'origine permet de faire la relation avec un autre sujet.

Exemple : le champ idConducteur dans la table conducteur est Primary Key mais se retrouve Foreign Key dans la table conducteur_vehicule.

En tant que Primay Key (clé primaire), nous activerons toujours l'option auto_increment.

Lorsque ces champs sont FK - Foreign Key, ils ne posséderont pas l'option auto_increment (les n° de conducteurs en fonction des véhicules qu'ils conduisent seront totalement aléatoires, il ne s'agira pas de rendre unique un conducteur mais d'effectuer une relation entre un conducteur et un véhicule).

Table : conducteur
champ type specificité
idConducteur INT PK - AI (Primary Key)
nom VARCHAR -

Table : vehicule
champ type specificité
idVehicule INT PK - AI (Primary Key)
modele VARCHAR -

Table : conducteur_vehicule
champ type specificité
idVehiculeConducteur INT PK - AI (Primary Key)
idConducteur INT FK (Foreign Key)
idVehicule INT FK (Foreign Key)


Les Enregistrements

Chaque enregistrement représente 1 ligne dans la table de la base de données.


Les Requêtes

Une requête permet de poser une question afin d'obtenir une réponse, ou encore de donner un ordre.

Comment formuler une requête SQL ?
Une requête se fait en 3 étapes :
Formulation -> Exécution -> Résultat(s).

Il faut d'abord savoir ce que l'on veut en français avant de le formuler en sql.

1 requete = 1 question ou 1 action

Il y a 4 grands types de requetes possibles :

fléche requete de selection
(requête question/réponse, nous faisons une demande via une question et obtenons une réponse)

fléche requete d'insertion
(requête d'action, impact sur les données)

fléche requete de modification
(requête d'action, impact sur les données)

fléche requete de suppression
(requête d'action, impact sur les données)

Nous terminerons toutes nos requêtes par un point-virgule pour que MYSQL sache que nous avons terminé d'écrire et qu'il doit exécuter notre demande.