Place aux concepts au travers d’un exemple
Considérons le bon de commande suivant :
On peut identifier des données spécifiques à des entités distinctes :
Décomposition en tables
Les bases de données relationnelles sont composées de tables (autrement dit des tableaux).
Essayons de décomposer ce bon de commande en tables, en fonction des entités identifiées précédemment (Données de la commande, donnéees du client, données d’un détail). On obtiendrait :
Clients | ||
---|---|---|
numero | nom | adresse |
2 | Vincent Bouvier | 53, rue Emmanuelle Monnier 02510 Lombard-sur-Leleu |
Commandes | ||
---|---|---|
numero | date | total |
5 | 29/07/2024 | €166.00 |
Détails | ||||
---|---|---|---|---|
numero produit | intitulé | prix | quantité | sous-total |
1 | T-shirt | €42.00 | 2 | €84.00 |
3 | Chaussures | €46.00 | 1 | €46.00 |
4 | Casquette | €18.00 | 2 | €36.00 |
Cette première décomposition n’est pas satisfaisante…
-
En l’état il est impossible de reconstruire le document initial
- Comment récupérer le client d’une commande puisque nous avons extrait et rangé ailleurs le fragment décrivant ce client ?
- Comment identifier la commande de laquelle nous avons extrait un détail ?
- il manque des données de références pour effectuer des liaisons entre les données
-
Certaines données sont calculées, e.g., le total de la commande et les sous-totaux des détails
- il n’est pas nécessaire de les stocker
Mettons à jour nos tables en prenant ces remarques en considération.
On va aussi ajouter un bon de commande supplémentaire (soit en ajoutant un client, une commande et des détails en plus) pour étoffer notre exemple
Clients | ||
---|---|---|
numero | nom | adresse |
2 | Vincent Bouvier | 53, rue Emmanuelle Monnier 02510 Lombard-sur-Leleu |
1 | Marie Dupont | 12, rue de la Paix 75000 Paris |
Commandes | ||
---|---|---|
numero | date | numero client |
5 | 29/07/2024 | 2 |
2 | 08/09/2024 | 1 |
Détails | ||||
---|---|---|---|---|
numero commande | numero produit | nom produit | prix | quantité |
5 | 1 | T-shirt | €42.00 | 2 |
5 | 3 | Chaussures | €46.00 | 1 |
5 | 4 | Casquette | €18.00 | 2 |
2 | 3 | Chaussures | €46.00 | 1 |
2 | 4 | Casquette | €18.00 | 3 |
2 | 5 | Sac à dos | €48.00 | 3 |
Un résultat prometteur, mais
Certaines données sont stockées de manière redondantes dans les données de détails
Les colonnes nom produit et prix sont inutilement répétées
- sources d’erreurs lors des mises à jour
- inutile et dangereux
Certaines données ne sont pas stockées de manière atomique
La colonne adresse du client contient une adresse complète
- il serait plus judicieux de la décomposer en plusieurs colonnes (numero, rue, code postal, ville)
- Ceci facilterait les recherches et les tris
Il serait plus pertinent de construire une 4ème table pour stocker de manière unique les informations relatives aux produits, et de créér plusieurs attributs pour l’adresse du client.
Commandes | ||
---|---|---|
numero | date | numero client |
5 | 29/07/2024 | 2 |
2 | 08/09/2024 | 1 |
Clients | ||||
---|---|---|---|---|
numero | nom | rue | code postal | ville |
2 | Vincent Bouvier | 53, rue Emmanuelle Monnier | 02510 | Lombard-sur-Leleu |
1 | Marie Dupont | 12, rue de la Paix | 75000 | Paris |
Détails | ||
---|---|---|
numero commande | numero produit | quantité |
5 | 1 | 2 |
5 | 3 | 1 |
5 | 4 | 2 |
2 | 3 | 1 |
2 | 4 | 3 |
2 | 5 | 3 |
Produits | ||
---|---|---|
numero | nom | prix |
1 | T-shirt | €42.00 |
3 | Chaussures | €46.00 |
4 | Casquette | €18.00 |
5 | Sac à dos | €48.00 |
Ce résultat est satisfaisant !
- Aucune donnée n’est dupliquée, hormis les données qui font références à d’autres tables.
- On peut reconstruire les bons de commandes originaux en utilisant les références (numeros de clients, de commandes et de produits) et en calculant les totaux en multipliant les quantités commandées par les prix des produits
Conclusions
- Une base de données est constituée d’un ensemble de tables
- Chaque table contient les données relatives à des entités de même nature
- Les lignes d’une table peuvent faire référence chacune à une ligne d’une autre table
- On évite de stocker les informations qui peuvent être calculées