Gap MEA

Gilles Thomassin

Copyright (C) 2016 Gilles Thomassin. Vous avez la permission de copier, distribuer ou modifier ce document selon les termes de la licence GNU de documentation libre, dans sa version 1.3 ou dans toute version ultérieure publiée par la Free Software Foundation . Cette licence est consultable ici.

Dédicace

Ce manuel ainsi que le logiciel associé est dédié à tous les étudiants qui découvrent le développement d'application. C'est un plaisir pour moi de leur partager les connaissances que j'ai acquises au fil des années. Il est dédié aussi à la communauté de développeur Linux qui partage sans compter et grâce à laquelle on peut disposer d'un environnement de développement performant.

Table des matières

Introduction
Présentation
Prologue
L'auteur
Exemple de schéma
Exemple de code sql produit
Enregistrement au format xml des modèles
Les Concepts
Entité
Association
Propriété
Identifiant
gapMea pas à pas
Fonctionnalités contextuelles de gapMea
Menu contextuel du modèle
Menu contextuel d'un objet
Menu contextuel d'une propriété
Menu contextuel d'un lien
L'analyse des données
L'historique
Statégie moderne de Modélisation des données

Liste des illustrations

1. MEA Gestion d'une AMAP
2. sql Create script
3. Extrait du source xml du modèle
4. Entité pointDeVente
5. Une association
6. Une CIF
7. Une DF
8. Une association simple
9. Une association porteuse
10. Une association ternaire
11. Une entité faible
12. Une DF réflexive
13. Une Association réflexive
14. gapmea après lancement
15. création de l'entité
16. création de l'entité
17. Après sélection de l'entité Client
18. Ajout de Commande
19. personnalisation du modèle
20. Mode Liaison
21. création d'une relation
22. Génération du SQL
23. code sql
24. SAT

Liste des tableaux

1. Dictionnaire Des Données
2. Matricice des df

Liste des exemples

1. Extrait des entités du domaine gestion d'un Lycée
2. Association porteuse d'information
3. Exemples de propriétés
4. Entité à deux identifiants
5. Liste d'objets gérés

Ce document présente le logiciel de modélisation des données <program>gapMea</program>, il présente aussi les différents concepts mis en oeuvre qui permettent de concevoir des bases de données utilisables

Introduction


Présentation

Prologue

GapMea est un outil de modélisation des données visuel écrit en C++ à l'aide de la bibliothèque QT.

Il permet de formaliser des schémas recueillant et structurant les informations nécessaires à un domaine de gestion.

Le schéma obtenu est enregistré dans un fichier texte au format xml. Le logiciel permet la génération du code sql nécessaire à la création des tables de la base de donnée qui vont accueillir les informations.

L'auteur

L'auteur "Gilles Thomassin" est professeur d'informatique en Section de Technicien Supérieur "Services Informatiques aux Organisations". Cette section post-bac plus communément nommée BTS SIO www.btsinfogap.org a été créée en 1984 au sein du Lycée Dominique Villars . Il enseigne la supervision des réseaux, l'analyse des données, le développement d'applications Web (PHP,javascript/ajax,Html/css), Evenementielles(Qt), Objet(C++), graphiques ou non ainsi que la conception des réseaux d'entreprise (Cisco, HP), la configuration des éléments actifs entre autres réjouissances bien nécessaires comme le développement d'applications android(Java). Ce lycée est situé à Gap préfecture des Hautes-Alpes département montagnard du sud-est de la France frontalier avec l'Italie.

Note de l'auteur: Ce logiciel est sous licence GPL.Mais qui dit libre ne dit pas gratuit. J'ai choisi de ne pas forcer à l'achat d'une licence. Mais je vous engage fortement si vous voulez que ce logiciel perdure et s'améliore à participer financièrement au projet.Donate via Paypal.

Exemple de schéma

Voici un Modèle Entité Association permettant la gestion d'une AMAP

Figure 1. MEA Gestion d'une AMAP

Une illustration des modèles produits par le logiciel

Exemple de code sql produit

CREATE TABLE `produit`(numeroproduit INTEGER,libelleproduit VARCHAR(25),primary key(numeroproduit));

CREATE TABLE `Fournisseur`(numeroFournisseur INTEGER,libelleFournisseur VARCHAR(25),primary key(numeroFournisseur));

CREATE TABLE `Proposer`(prix NUMERIC(6,2),numeroFournisseur INTEGER,numeroproduit INTEGER, foreign key (numeroFournisseur) references Fournisseur(numeroFournisseur), foreign key (numeroproduit) references produit(numeroproduit),primary key(numeroFournisseur,numeroproduit));

CREATE TABLE `Client`(numeroClient INTEGER,libelleClient VARCHAR(25),primary key(numeroClient));

CREATE TABLE `Commande`(numeroCommande INTEGER,libelleCommande VARCHAR(25),numeroClient INTEGER, foreign key (numeroClient) references Client(numeroClient),primary key(numeroCommande));

CREATE TABLE `contenir`(quantite INTEGER,numeroFournisseur INTEGER,numeroproduit INTEGER,numeroCommande INTEGER, foreign key (numeroFournisseur,numeroproduit) references Proposer(numeroFournisseur,numeroproduit), foreign key (numeroCommande) references Commande(numeroCommande),primary key(numeroFournisseur,numeroproduit,numeroCommande));
				

Figure 2. sql Create script

SQL LDD avec coloration syntaxique

Enregistrement au format xml des modèles

Tous les modèles construits par l'utilisateur sont des fichiers textes au format "XML" et peuvent donc être aisément partagés.

On peut même les éditer avec un simple éditeur de texte.

				

Figure 3. Extrait du source xml du modèle

Extrait de code xml

Les Concepts

Tout d'abord, ne perdons pas de vue l'objectif principal de la modélisation des données: Créer des bases de données utilisables. Pour cela, nous allons définir les quelques notions nécessaires à toute analyse des données.

Nous parlerons des objets gérés: les entités, des relations entre ces objets: les associations et enfin des propriétés et des identifiants.

Entité

Une entité est créée lorsque on aura à gérer des éléments de cette nature. Lorsqu'on a au moins trois exemplaires d'une chose alors il est à peu près certain qu'i faut créer une entité correspondante.

Par conséquent si l'on gère un garage automobile, nos objets (entités) seront:

  • Client
  • Vehicule
  • Mecanicien
  • Piece
  • Forfait
  • Promo
  • Facture
  • Devis

Par contre nous n'auront pas d'entité "Garage" car on n'a qu'un seul garage à gérer.

Nous n'avons pas non plus d'entité Animal car ce n'est pas dans le domaine de gestion de l'application.

Attention

On a toujours tendance à oublier ce qui pourtant est au centre de nos préoccupations: les "RendezVous" par exemple dans le cas "Garage".

Formalisme de l'entité

Dans le M.E.A. l'entité est représentée dans un rectangle portant pour titre le nom de l'entité.

Sous le titre se trouvent les propriétés de l'entité

Figure 4. Entité pointDeVente

Entité Point de Vente

Une entité a un identifiant qui est souligné et des propriétés.

Association

Elle n'a pas d'existence propre. Elle est un lien entre au moins deux objets et peut être porteuse ou non de propriétés.

Elle n'a pas d'identifiant propre, son identifiant est constitué des identifiants des entités associées.

Détecter les associations se fait en s'interrogeant sur les liens existant entre deux objets.

Exemple 1. Extrait des entités du domaine gestion d'un Lycée

Dans le domaine gestion d'un Lycée on a détecté les entités suivantes:
  • Salle
  • Classe
  • Matiere
  • Etudiant
  • ...

On voit qu'il y a un rapport entre les "Classes" et les "Matières" en effet il est indiqué dans le référentiel national qu'en terminale ES on doit enseigner les mathématiques, l'histoire/géo l'économie etc... alors qu'en première ES il y a du Français etc...

Lorsqu'on s'interroge sur la nature de ce rapport on trouve une relation du type plusieurs-----plusieurs

Q : Pour une Classe combien y a-t-il de Matières correspondantes?
Q : Lorsque je considère une Matière à combien de Classes est-elle enseignée?

Q :

Pour une Classe combien y a-t-il de Matières correspondantes?

R :

Plusieurs

Q :

Lorsque je considère une Matière à combien de Classes est-elle enseignée?

R :

Plusieurs

On en déduit alors qu'il y a une association entre ces deux objets

Comment la nommer ? Enseigner, Concerner, Enseignement ?

Je préfère et de loin un nom plutôt qu'un verbe.

Car un verbe a un sens de lecture et l'association doit pouvoir se lire dans n'importe quel sens

Aussi si l'on peut dire qu'une Matiere "estEnseignee" dans une Classe

Dans l'autre sens la phrase "une classe estEnseignee dans une Matiere" n'a aucun sens.

Si l'on marque Enseignement comme nom d'association on sait que l'on y trouvera un Enseignement d'une Matiere et un Enseignement dispensé à une classe.

Figure 5. Une association

Association entre Classe et Matière

Les types d'association

On compte différents types d'associations (relation entre objets):

la CIF

La cif indique un rapport trés fort entre deux objets: la source de la cif et la cible de la cif

Elle est assez facile à trouver:

Soient 2 objets A et B, si quand on connait 1 A on connait 1 et un seul B alors il y a une CIF entre A(la source) et B(la cible)

Elle se dessine par une flêche partant de la source et se plantant dans la cible

Au milieu est dessiné un disque avec en son coeur le mot "CIF"

Dans notre exemple précédent, quand je connais un élève, je connais sa classe, une et une seule classe.

J'ai donc une CIF entre Eleve et Classe

Figure 6. Une CIF

Cif entre Commande et Client

On remarque le bout pointu de la flêche ainsi que les cardinalités Commande---1,1--CIF---0,n--->Client

Cela ne changera pas. Pour toute cif ce seront ces cardinalités là: 1,1 du côté de la source et 0,n du côté de la cible.

la DF

La DF indique un rapport trés fort entre deux objets: la source de la df et la cible de la df

Elle est assez facile à trouver:

Soient 2 objets A et B, si quand on connait un A on peut ne pas connaitre de B mais si on en connait un alors il est unique alors il y a une DF entre A(la source) et B(la cible)

Elle se dessine par une flêche partant de la source et se plantant dans la cible

Au milieu est dessiné un disque avec en son coeur le mot "DF"

Dans notre exemple précédent, quand je connais un cours, je peux ne pas connaître sa salle

(si je ne l'ai pas encore plannifiée ou si c'est un cours à l'extérieur)

Mais si j'en connait une alors elle est unique: Ce "Cours là" aura lieu dans "cette Salle là".

J'ai donc une DF entre Cours et Salle

Figure 7. Une DF

Cif entre Commande et Client

On remarque le bout pointu de la flêche ainsi que les cardinalités Cours---0,1--DF---0,n--->Salle

Cela ne changera pas. Pour toute "DF ce seront ces cardinalités là: 0,1 du côté de la source et 0,n du côté de la cible.

L'association classique

Elle indique un rapport entre deux objets.

Du type plusieurs...plusieurs

Elle dispose d'au moins deux pattes reliées à des objets du système.

Chaque patte comporte un couple de cardinalité (cardmin,cardmax) mesurant la participation de l'objet relié à l'association.

Figure 8. Une association simple

Lors d'une commande il peut ne pas y avoir de supplément comme il peut y en avoir plusieurs.

Les cardinalités 0,n entre Option et Supplément indiquent qu'une Option peut ne pas encore avoir été choisie et qu'elle peut être choisie plusieurs fois. Option --0,n---Supplement

Ainsi l'option "Pack Securité" qui vient d'être ajoutée n'est encore choisie par personne, par la suite elle pourra être choisie plusieurs fois et donc constituer plusieurs suppléments de commande

Les cardinalités 0,n entre Commande et Supplément indiquent qu'une Commande peut ne pas comporter de supplément et qu'elle peut tout aussi bien en comporter plusieurs. Commande --0,n---Supplement

Ainsi une commande peut concerner uniquement un modèle sans option.

Mais une autre commande pourra comporter l'option "GPS" ainsi que l'option "Peinture métallisée" et pourquoi pas "le Pack Sécurité" portant ainsi à trois le nombre de Supplément pour la même commande.

Une association peut comporter des propriétés on dit alors qu'elle est porteuse(d'informations).

Association porteuse

Elle peut être porteuse d'informations

Exemple 2. Association porteuse d'information

On pourrait indiquer pour chaque matière enseignée dans une classe le volume horaire hebdomadaire prévu par le référentiel.

Cette information trouve sa place dans l'association Enseignement qui je le rappelle est l'enseignement d'une matière dans une classe.

Figure 9. Une association porteuse

Quand je connais la matière et la classe je connais le volume horaire hebdomadaire prévu.


les Associations ternaires

Ce sont des associations à trois pattes.

On peut modéliser certains objets gérés avec des associations ternaires ainsi dans un magasin de prêt à porter on vend des vêtements disponibles en différentes tailles et différentes couleurs.

Figure 10. Une association ternaire

Quand je connais le vêtement, la taille et la couleur je connais la quantité qu'il me reste en stock

les MillesPattes

Le nombre de patte n'est pas limité.

Dans l'exemple précédent on pourrait trés bien ajouter une patte reliée à l'entité Matière si l'on avait le même vêtement disponible en laine ou en coton ou en cuir ou que sais-je encore.

Mais en pratique, il y a de forte chance qu'il ne soit pas au même prix et qu'il donne lieu à la création de vêtements différents

Avertissement

Une association possédant un grand nombre de patte est souvent le signe d'une erreur de conception.
les Entités faibles

Elles n'existent que parce que l'entitée Mère existe. Elles sont identifiée par l'identifiant de leur entité mère auquel est ajouté leur propre identifiant.

Dans l'exemple ci-dessous, on gère les chambres de plusieurs hôtels.

Le numéro de chambre n'identifie pas à lui-seul la chambre il faut lui ajouter l'identifiant de l'hôtel où se trouve la chambre.

Figure 11. Une entité faible

La chambre est entité faible de l'hôtel

Elle est représentée comme une CIF avec comme source l'entité faible et comme cible l'entité mère. la cardinalité côté source est indiquée entre parenthèses.

les Réflexives

On peut trouver des réflexives du type DF ou du type association

Imaginons une structure hiérarchique où chaque employé a un supérieur qui est lui-même un employé.

Nous avons donc une DF entre employé et employé

Figure 12. Une DF réflexive

Chaque employé a zero ou un chef

Mais on peut aussi avoir des associations réflexives

Ainsi dans l'exemple ci-dessous, on pourra enregistrer les incompatibilités entre les médicaments.

Figure 13. Une Association réflexive

Incompatibilité médicamenteuse

Propriété

Les propriétés d'un objet sont les caractéristiques de cet objet dont vous avez besoin pour votre ou vos applications.

Elles ont un nom et un type. Le nom est choisi avec soin, il doit être significatif de la nature de la propriété et il faut éviter les mots réservés du SQL.

On évitera les espaces les _ et caractères accentués. Le mieux est de faire comme pour les variables en programmation.

Le type est à choisir parmi les types de base: entier, texte, réel etc...

Exemple 3. Exemples de propriétés

  • dateDeNaissance date
  • salaire float
  • nom varchar(35)
  • prenom varchar(30)

Une propriété doit être élémentaire c'est à dire qu'elle ne doit contenir qu'une seule information. On remplacera donc une propriété composée comme "l'adresse" par plusieurs propriétés élémentaires comme: rue1,rue2, codePostal, Bureau distributeur, Pays

Les propriétés mutivaluées n'existent pas non plus, on évitera donc d'écrire des propriétés avec un nom au pluriel comme "noTelephones". et on créera à la place plusieurs propriétés monovaluées telFixe, telMobile etc...

Identifiant

On appelle identifiant d'un objet l'ensemble minimum de propriétés qui permet la connaissance d'une et d'une seule occurrence de l'objet concerné.

Cet identifiant peut-être naturel (rare) ou artificiel (courant)

Il est en général du type entier. Et c'est souvent un numéro séquentiel incrémenté à chaque nouvelle occurence de l'objet

Caractéristiques de l'identifiant

  • L'identifiant est obligatoire.
  • L'identifiant doit occuper peu de place en mémoire car il est souvent dupliqué.
  • Il est stable: une fois attribué, on ne doit pas changer sa valeur.
  • Il est unique. Il ne peut y avoir deux exemplaires de l'objet ayant même valeur d'identifiant.
  • On ne réattibue pas un identifiant à un autre objet

Voici des exemples d'identifiants connus:

  • numéro de carte d'identité identifie une carte d'identité
  • IBAN international Bank account Number identifie un compte bancaire
  • Numéro de sécurité social identifie une personne couverte par la sécurité sociale
  • Numéro d'immatriculation identifie un véhicule circulant
  • ISBN identifie un livre

Attention

Toute entité doit avoir un identifiant.

Un objet peut avoir plusieurs identifiants.

Exemple 4. Entité à deux identifiants

L'entité utilisateur:(numUtilisateur, nom, prenom, login, email)

a deux identifiants: numUtilisateur et login.

Un des deux est choisi comme identifiant ici le numéro.

l'autre est dit identifiant secondaire et peut au niveau physique faire l'objet de la création d'un index unique empêchant les doublons.

					CREATE UNIQUE INDEX cleSecondaireUtilisateur on Utlisateur(login);
					

gapMea pas à pas

  1. Ouverture de gapmea

    Lancez gapmea

    Vous obtenez cet écran

    Figure 14. gapmea après lancement

    Tout est vide

  2. Création de l'entité Client

    On remplit la zone de saisie nom de l'entité

    Vous obtenez cet écran

    Figure 15. création de l'entité

    On a saisi le nom de l'entité

  3. Cliquer sur ajouter

    Après avoir cliqué sur le bouton "Ajouter"

    L'entité "Client" apparait dans le modèle.

    Figure 16. création de l'entité

    Elle dispose de deux propriétés "identifiantClient" et "libelleClient"

  4. Selection l'entité Client

    En cliquant sur l'entité vous la sélectionnez

    Les propriétés de l'entité apparaissent alors dans la zone "Propriétés de l'objet"située à gauche.

    Figure 17. Après sélection de l'entité Client

    On va saisir une autre entité commande

  5. Création de l'entité Commande

    On procède de même pour l'entité "Commande"

    On saisi "Commande" dans le nom de l'entité

    Figure 18. Ajout de Commande

    On a saisi le nom de l'entité

  6. Réorganisation du modèle

    On déplace nos entités où on veut sur le modèle

    Une entité sélectionnée a sa bordure tracée en pointillés.

    Figure 19. personnalisation du modèle

    Déplacement des entités sélectionnées

  7. Sélection de l'outil "Liaison"

    On est soit en mode déplacement soit en mode liaison

    Sélectionnez l'outil liaison désigné par la souris dans la figure ci-dessous.

    Figure 20. Mode Liaison

    On a sélectionné l'outil "Liaison"

  8. Création d'une CIF

    On clique sur la barre de titre de la source de la CIF ("Commande") et on relâche sur la barre de titre de l'entité cible: "Client"

    Vous obtenez cet écran qui permet de choisir le type de relation. On choisit CIF et on valide

    Figure 21. création d'une relation

    On a validé la relation

  9. Visualisation de la Cif créée

    On va générer le code sql correspondant à notre modèle.

    Le bouton "SQL" se trouve dans la barre d'outils supérieure.

    Figure 22. Génération du SQL

    On clique sur le bouton "SQL"

  10. On apprécie le résultat

    Le code SQL apparait alors dans la zone "SQL" située sous le modèle.

    La coloration syntaxique est activée.

    Figure 23. code sql

    Le code SQL est généré

Fonctionnalités contextuelles de gapMea

Beaucoup de fonctionnalités de gapMea sont accessibles avec les menus contextuels de la zone de visualisation du modèle.

Ces menus contextuels sont fonction de l'objet auquel ils s'appliquent.

Ils s'obtiennent en cliquant avec le bouton droit de la souris sur l'objet le lien ou la propriété que l'on souhaite modifier.

Menu contextuel du modèle

Menu contextuel du modèle

Il permet d'imprimer le modèle.

Menu contextuel d'un objet

Menu contextuel d'un objet

Il permet de supprimer l'objet ou d'y ajouter une propriété.

Menu contextuel d'une propriété

Menu contextuel d'un objet

Il permet de supprimer la propriété sélectionnée ou de la modifier

Menu contextuel d'un lien

Menu contextuel d'un objet

Il permet de supprimer le lien ou de modifier son rôle.

L'analyse des données

L'historique

L'analyse ascendante consistait à recenser les informations à gérer à partir de documents circulants dans l'entreprise (factures, bons de commande etc...).

Cette étape permettait de produire le dictionnaire des données.

Ensuite les informations étaient structurées en adoptant la méthode Matricielle ou la Structure d'accès théorique.

Enfin l'analyse des données se terminait par la production du Modèle Entité Association.

La base de donnée était alors conçue MLDR et script SQL.

Un jeu d'essais y était implanté permettant une première validation.

Immanquablement, la programmation de l'application faisait apparaitre ensuite des ajouts de propriétés indispensables non détectables lors de l'analyse et il fallait alors reprendre la procédure.

Dictionnaire des données

Il recense dans un tableau toutes les informations que votre logiciel doit enregistrer.

Il s'agit donc d'un document recensant pour chaque propriété, son nom, son type, et son rôle

Il constitue donc un élément important de la documentation technique de votre application.

Tableau 1. Dictionnaire Des Données

CodeRoleTypeObjetObligatoire
nomCliNom de famille du clientvarcharClientOui
noProdNuméro du produitIntegerProduitOui
libProdDésignation du produitVarchar(75)ProduitOui

Matrice des dépendances fonctionnelles

Il s'agit d'une représentation matricielle des dépendances fonctionnelles entre les propriétés.

Adaptée à un traitement logiciel, elle n'a aucun intérêt pour un analyste

Tableau 2. Matricice des df

 123456789
1 noMag x       
2 noVendeur        x
3 nomRespx        
4 nomMagx        
5 nomVend x       
6 dateEmb x       
7 noMois        x
8 caMensuel        x
2+7         

Structure d'accès théorique

Elle présente sous forme arborescente les dépendances entre les propriétés du dictionnaire

Il y a dépendance fonctionnelle entre deux propriétés lorsque la connaissance de la valeur de la source détermine la connaissance d'une seule valeur de la propriété cible.

Ainsi qd je connais un numéro de client je connais un et un seul nom de client. On a donc df entre noCli et nomCli.

Elle se matérialise par une flêche entre noCli et nomCli: noCli------->nomCli

Figure 24. SAT

Une structure d'accès Théorique

Statégie moderne de Modélisation des données

Tout d'abord, il faut être conscient qu'il s'agit d'un préalable indispensable à la réalisation d'un logiciel lié à une base de donnée.

Une mauvaise analyse des données conduit à un développement inutile.

Mais il est illusoire de penser que l'on peut réaliser une analyse parfaite, sans développer l'application.

Il faut donc soigner son analyse tout en étant conscient qu'elle sera modifiée par la suite.

Modéliser des données se fait en répondant successivement à 3 questions:

  • Quels sont les objets à gérer?
  • Pour chaque objet, quelles sont les informations dont j'ai besoin?
  • Quelles sont les relations entre ces objets?

A la première question on répond par une liste de types d'objet.

Exemple 5. Liste d'objets gérés

Dans une gestion commerciale, on a des produits, des commandes, des factures, des clients.


Et le mot "des" est important en effet il permet de distinguer le type des objets que l'on gère des exemplaires de ces objets. Ainsi on n'a pas de "légume" on a des "types de produit" dont un porte la désignation "légume".

Recette: On crée un type d'objet à partir du moment ou l'on a (aura ou risque d'avoir) au moins trois exemplaires de ce type.