Comment faire une Base de Données proprement...
Si tu es jeune, tu te poses des questions existentielles qui ramènent Spinoza aux conversations de pochtrons qui se terminent à l'alcool de bois à 5 h du mat' au Macumba.
Si tu es vieux (comme moi), tu as vu tellement d'horreurs qui feraient passer l'Enfer de Dante pour le dernier film de Bob l'Eponge.
Alors, comme faire ?
Rassure-toi, point n'est besoin de se farcir l'Algèbre Relationnelle d'Edgar Codd (1).
Pas plus que des diagrammes UML (2), mais ça viendra après.
On a dû vous parler des Formes Normales, surtout les 3 premières, mais, connaissez-vous celle de Boyce-Codd ? la 4ème ? la 5ème ? Les définitions formelles sont assez obscures.
Alors, je vais vous parler plutôt des Dépendances Fonctionnelles (3) (4), et surtout de graphes de dépendances fonctionnelles, car c'est une approche simple et sûre pour modéliser une base de données.
Car arriver à une base de données normalisée à partir d'un schéma UML me semble franchement difficile.
Il est bien sûr très intéressant de raisonner de manière abstraite dans un premier temps, et un schéma d'objet est tout à fait approprié.
Quand on arrive à la phase plus concrète d'implémentation de schéma base de données, on se retrouve vite avec des redondances vicieuses bien cachées qui sont de véritables bombes à retardement.
Il vaut mieux partir d'une base de données normalisées et introduire des redondances après les avoir mûrement réfléchies que se retrouver des années plus tard avec une BdD complètement pourrie et bricoler du code pour corriger les données...
Les Dépendances Fonctionnelles
Et avant tout, qu'est-ce qu'une dépendance fonctionnelle ?
Avec des mots simples que peuvent comprendre les gens normaux que nous sommes qui se promènent avec des Santiag ou des Doc Marten's et qui écoutent de la musique avec des vrais instruments, c'est ceci :
"Si une caractéristique A permet de déterminer une autre caractéristique B, alors il y a une dépendance fonctionnelle entre A et B que l'on notera A --> B."
Prenons un exemple tout simple avec une plaque d'immatriculation et un véhicule.
Qui de la poule et l'œuf était avant ?... le dinosaure !
Euh... est-ce que c'est le véhicule qui permet de connaître la plaque ?
Si je vous dis "Fiat 500 Abarth rouge", arriverez-vous à trouver la plaque d'immatriculation, sachant qu'il y a une foule de Fiat 500 de ce modèle et cette couleur ?
Ne serait-ce pas plutôt la plaque d'immatriculation qui me permet d'identifier, de retrouver "LA Fiat 500 Abarth rouge" bien particulière que je recherche... ?
Plaque Immatriculation --> Véhicule
Autre exemple : N° INSEE (ou n° de sécurité sociale) et Personne.
Est-ce le fait de connaître Pierre Martin me permet de déterminer facilement son n° INSEE ?
J'en doute...
Par contre, si j'ai le n° INSEE "1 65 05 13 155 666", je retrouve bien LE Pierre Martin que je recherche.
N° INSEE --> Personne
Précisons maintenant la limite des exemples précédents, il s'agissait de vulgariser le concept, et dans les faits, on va réfléchir un peu plus finement, car dans la théorie des Bases de Données Relationnelles que je vous dispense de dévorer pour justement vous simplifier la vie la définition des "caractéristiques" est très précise.
Je vais donc vous proposer en apéro (ouais !!!) sans alcool (...ooooh...) un petit exercice de modélisation qui permettra d'arriver à un graphe de dépendances fonctionnelles, et de là, la définition d'une entité de base de donnée coulera de source.
Voici l'exercice : "Comment modéliser une personne ?", soit plus simplement :
- Comment représenter abstraitement une personne ?
- Quelles sont les informations qui caractérisent une personne ?
- Et en particulier, quelles sont les informations qui m'intéressent pour définir une personne ?
Car je ne vais pas avoir besoin des mêmes infos si je gère une salle de sport, ou un club de musique. C'est un point important à garder dans le coin de la tête, mais...
Une personne a un prénom, un nom, est née quelque part à une date bien précise.
Contentons nous de ceci:
- PRENOM,
- NOM,
- DATE DE NAISSANCE,
- LIEU DE NAISSANCE,
Est-ce que ceci est suffisant pour définir précisément une personne ? D'un point de vue abstrait bien, n'entrons pas dans des considérations philosophiques, complexes !
Voici les 5 premiers noms de famille les plus répandus en France :
- Martin : 250 013
- Bernard : 131 330
- Thomas : 118 331
- Petit : 115 217
- Robert : 112 998
Et voici les prénoms :
- Marie 2 231 347
- Jeanne 564 247
- Françoise 401 427
- Monique 399 616
- Catherine 394 699
- Jean 1 911 457
- Pierre 892 384
- Michel 820 560
- André 712 248
- Philippe 538 712
C'est bien pour ça qu'a été inventé le n° INSEE qui est unique et attribué à une seule et unique personne. Il faut rajouter cette information à notre liste:
- N° INSEE,
- PRENOM,
- NOM,
- DATE DE NAISSANCE,
- LIEU DE NAISSANCE,
En reprenant la notation des dépendances fonctionnelles "A --> B", on a ceci :
- N° INSEE --> PRENOM,
- N° INSEE --> NOM,
- N° INSEE --> DATE DE NAISSANCE,
- N° INSEE --> LIEU DE NAISSANCE,
Si l'on poursuit la réflexion sur ce petit exemple, qu'est-ce qu'un lieu de naissance ?
C'est une commune.
Oui, mais il y a :
- 13 Saint-Sauveur
- 12 Sainte-Colombe
- 11 Beaulieu
Donc la commune ne suffit pas, il faut préciser le département pour faire la différence entre Mars dans la Loire (42) et Mars dans l'Ardèche (07).
Oui, en France, on peut aller sur Mars. Deux fois... Elon Musk en rêve...
Voici notre liste mise à jour :
- N° INSEE --> PRENOM,
- N° INSEE --> NOM,
- N° INSEE --> DATE DE NAISSANCE,
- N° INSEE --> COMMUNE DE NAISSANCE,
- N° INSEE --> DEPARTEMENT DE NAISSANCE,
- N° INSEE --> PAYS DE NAISSANCE
Et on peut ajouter le pays de naissance.
Représentation graphique avec le Graphe des D.F.
Le graphe des dépendances fonctionnelles se dessine comme suit :
Et... de ce graphe à la définition d'une entité "Personne", il n'y a qu'un pas !
PERSONNE( N° INSEE , PRENOM, NOM, DATE DE NAISSANCE, COMMUNE DE NAISSANCE, DEPARTEMENT DE NAISSANCE, PAYS DE NAISSANCE)
Voici l'entité "PERSONNE", une conceptualisation, une définition abstraite d'une personne dans une système d'information, et plus particulièrement, dans une base de données.
L'identifiant est, vous vous en doutez, le N° INSEE.
Si vous ne voyez pas encore l'intérêt de passer par les Dépendances Fonctionnelles et le Graphe qui le représente, ça va sera peut-être plus clair avec l'exemple suivant.
On continue ? On continue ! 😺
On va manipuler maintenant des clients, des commandes, des articles, des fournisseurs.
Définition du client dans le contexte:
Un nom de société, un nom de contact, un numéro de téléphone principal, un numéro de téléphone mobile, une adresse mail, une adresse principale, plusieurs adresses de livraison
Définition des commandes dans le contexte:
Un client passe une commande à une date bien précise d'un ou plusieurs articles.
La commande sera livrée à une adresse de livraison.
Définition des articles dans le contexte:
Un article a un nom court mais clair, une description plus détaillée, un prix à une certaine date, il est fabriqué par un fournisseur.
Définition des fournisseurs dans le contexte:
Un nom de société, un nom de contact, un numéro de téléphone principal, un numéro de téléphone mobile, une adresse mail, une adresse principale, plusieurs adresses d'approvisionnement
Ca va ? Pas trop les chocottes ?
Bien !Alors...
On attaque !
La modélisation du client.
- un nom de société,
- un nom de contact,
- un numéro de téléphone principal,
- un numéro de téléphone mobile,
- une adresse mail,
- une adresse principale,
- plusieurs adresses de livraison
La question de l'identification du client se pose comme celle de la personne dans le petit exercice précédent.
Donc, sans plus attendre, on va parler de "code client".
Ca, c'est fait.
On a les D.F. suivantes :
- CODE_CLIENT --> NOM_SOCIETE
- CODE_CLIENT --> NOM_CONTACT
On peut se poser des questions sur les numéros de téléphones.
Est-ce qu'il y aura seulement un numéro principal et un numéro de mobile ?
Est-ce qu'il n'y aurait pas plus de numéros que ça ?
Nous allons choisir l'hypothèse simple de 2 numéros et rien de plus. Voici les D.F. qui suivent :
- CODE_CLIENT --> TELEPHONE_PRINCIPAL
- CODE_CLIENT --> TELEPHONE_MOBILE
- CODE_CLIENT --> MAIL
Il y a plusieurs adresses de livraison. Plusieurs, cela sous-entend un ensemble possible de 1 à "n" adresses de livraison, "n" pouvant être 2, 3, 4, 5, ...
La modélisation des adresses
- le TYPE_ADRESSE (principale, livraison), et selon l'AFNOR :
- DENOMINATION
- DESTINATAIRE
- BATIMENT
- VOIE
- MENTION_SPECIALE
- CODE_POSTAL
- COMMUNE
- CEDEX
- LIBELLE_CEDEX
- CODE_CLIENT, NUMERO_ADRESSE --> TYPE_ADRESSE
- CODE_CLIENT, NUMERO_ADRESSE --> DENOMINATION
- CODE_CLIENT, NUMERO_ADRESSE --> DESTINATAIRE
- CODE_CLIENT, NUMERO_ADRESSE --> BATIMENT
- CODE_CLIENT, NUMERO_ADRESSE --> VOIE
- CODE_CLIENT, NUMERO_ADRESSE --> MENTION_SPECIALE
- CODE_CLIENT, NUMERO_ADRESSE --> CODE_POSTAL
- CODE_CLIENT, NUMERO_ADRESSE --> COMMUNE
- CODE_CLIENT, NUMERO_ADRESSE --> CEDEX
- CODE_CLIENT, NUMERO_ADRESSE --> LIBELLE_CEDEX
- CODE_CLIENT, NUMERO_ADRESSE --> TYPE_ADRESSE
- CODE_CLIENT, NUMERO_ADRESSE --> DENOMINATION
- CODE_CLIENT, NUMERO_ADRESSE --> DESTINATAIRE
- CODE_CLIENT, NUMERO_ADRESSE --> BATIMENT
- CODE_CLIENT, NUMERO_ADRESSE --> VOIE
- CODE_CLIENT, NUMERO_ADRESSE --> MENTION_SPECIALE
- CODE_CLIENT, NUMERO_ADRESSE --> CODE_POSTAL
- CODE_CLIENT, NUMERO_ADRESSE --> CEDEX
- CODE_CLIENT, NUMERO_ADRESSE --> LIBELLE_CEDEX
et
- CODE_POSTAL --> COMMUNE
La modélisation des commandes
L'interlude des Articles
Un article, c'est un nom court, un code pas trop ésotérique, compréhensif juste ce qu'il faut.Le méta-interlude des Fournisseurs...
Revenons à nos moutons ...
Euh... aux commandes !
Et sous vos applaudissements, voici le graphe complet des D.F.
Et tout ça pour quoi ?
En êtes-vous si sûrs ?
- Le CRU, soit la zone de production du vin.
- La REGION, une zone un peu plus large.
- Le PAYS, zone encore plus large.
- La QUALITE, appréciation selon les œnologues
Ne nous arrêtons pas en si bon chemin !
- F.N. = les champs sont atomiques, càd, il n'existe pas d'information complexe rassemblant plusieurs notions, comme par exemple ADRESSE qui serait composé de NUMERO, VOIE, CODE POSTAL, VILLE, ...
- F.N. = tout attribut n'appartenant pas à une clé ne dépend d'une partie de la clé
- F.N. = pas de transitivité, soit : tout attribut n'appartenant pas à une clé ne dépend pas d'un autre attribut non-clé.
La 4ème Forme Normale
NON, ce n'est pas fini !
La 5ème Forme Normale
Finalement...
Notes
(1) Edgar Codd : A relational model of data for large shared data banks
(2) Microsoft : Guide to UML diagramming and database modeling
(3) Définition formelle des DF
(4) Edgar Codd : FURTHER NORMALIZATION OF THE DATA BASE RELATIONAL MODE






















Aucun commentaire:
Enregistrer un commentaire