Leçon 56 : Initiation au problème de l'utilisation d'une seule table

Temps nécessaire pour suivre cette leçon : Entre un quart d'heure et une grosse demie-heure

Aperçu de cette leçon

Cette fois, nous allons aborder un sujet radicamene t différent, puisqu'il va s'agir de la création d'une base de données totalement multi-tables. C'est pour cette raison qu'il ne vous est pas proposé de télécharger la base de données telle qu'elle était à la fin de la leçon précédente. En effet, maintenant que vous avez acquis les connaissances générales du fonctioonnement des différents objets d'Access, vous allez maintenant commencer à composer votre propre oeuvre. L'imbrication de plusieurs tables les unes avec les autres est le gros gros point fort d'Access, et, par extension, de tous les systèmes de gestion de bases de données relationnelles.
L'utilisation d'une 2ème table n'est pas un concept qui vous est parfaitement étranger, car nous avons vu ensemble dans les leçons 16 et 17 la possibilité d'attacher la table T_Pays et T_Client avec intégrité référentielle. Je ne saurais que trop vous recommander de réviser ces 2 leçons avant d'attaquer celle-ci, car nous allons réutiliser ces concepts de manière intensive.

Sommaire

  1. Erreur : Mettre plusieurs informations dans un seul champ
  2. Erreur : Multiplier les champs de même nature
  3. Erreur : Répéter inutiliement de grosses masses d'informatio
  4. Exemples de la problématique d'un objet contenant un nombre indéterminé de sous-objets
  5. Des champs se ressemblant, mais dont la nature est légèrement différente ne pose pas le même problème
  6. Il n'est pas toujours évident de déterminer si plusieurs champs sont de même nature

Ah enfin, je vais comprendre comment dispatcher les données dans différentes tables, parce que je me casse la tête actuellement, je n'y comprend rien !

Oui. Et justement, pour bien vous faire comprendre à quel moment on crée une ou deux tables, nous allons attaquer une petite application de gestion de cours. Au début, elle va être toute simple, et par la suite, elle va se compliquer petit à petit.

J'entends par "Application de gestion de cours" un programme qui va gérer les cours internes d'une entreprise. Nous allons imaginer que vous êtes le responsable des formations des employés de l'entreprise MultiCommerce. C'est donc à vous qu'incombe la tâche d'organiser différents cours pour vos employés : Il va y avoir des cours d'informatique, mais aussi de gestion, de marketing, etc.

Pour faire simple au début, nous allons admettre que les cours donnés se passent systématiquement sur un seul jour, d'une telle heure à une telle heure, et vous disposez d'une seule salle de cours pour tous les cours : Quel que soit le cours suivi, ce sera toujours dans cette salle, pour le moment.

Il s'agit donc de savoir quel prof donne un cours de quoi à qui et quand...

Nous allons essayer de nous poser les bonnes questions : Quels sont les renseignements dont nous avons besoin ?

Bon, nous devons connaître le nom et le prénom du prof, la date du cours, quel cours c'est, avec quels élèves et dans quelle salle...

Oui, pour tout, sauf pour la salle. Comme il n'y a qu'une seule salle, nous n'allons pas l'indiquer, on le sait. A part ça, vous avez raison, on a besoin de :

Est-ce que nous avons oublié quelque chose d'important ?

Hmmm... Oui, si par exemple il y a une pause à Midi de 12H à 13H par exemple, il faudrait le préciser

Oui, c'est vrai. Mais nous allons, toujours pour faire simple, qu'il n'y a pas d'interruption dans le cours. Autre chose ?

Le prix du cours ?

Ca, c'est déjà plus important. Si le prof est externe à l'entreprise, il faudra bien le payer. Nous allons donc ajouter le prix du cours. Autre chose ?

Si par exemple, il y a un cours qui s'annonce, on pourrait imaginer que des employés s'inscrivent à ce cours, et que finalement ils ne viennent pas au cours, il faudrait un champ du style "Inscrit", ou "Présent", ou un truc comme ça...

Effectivement, c'est important. Mais nous gérerons ça dans un 2ème temps. Nous allons dire que nous nous arrêtons là. Pour stocker ces données dans Access, nous allons avoir besoin d'une nouvelle base de données, donc mainteannt, vous allez créer une base de données que vous appellerez comme vous voulez, mais dans ce cours, nous allons toujours l'appeler ProFrormation : C'est vous qui voyez comment vous voulez vous organiser au niveau des noms des bases de données. La leçon 2 vous rafraîchira la mémoire. Si vous voulez, vous pourriez par exemple appeler cette nouvelle base ProFormationNiveau2.

Dans ce nouveau ProFormation, Vous allez donc créer une nouvelle table, avec les champs suivants : (Les leçons 3, 4, 6, 7 et 8 vous rappelleront comment faire)

Vous l'Enregistrez sous T_Cours, et vous refusez la clé primaire.

Oui, tiens, il n'y a pas de clé primaire dans cette table ?

Nous allons nous en occuper un peut plus tard. Pour l'instant, vous lancez la table en mode saisie de données, et vous entrez une première ligne :

Est-ce qu'il y a quelque chose qui vous frappe dans cette ligne ?

Hmmm... C'est un cours vachement cher ?

Non... Un truc plus grave que ça au niveau d'Access : Là, il y a un élève.

Oui, et alors ? Il a un nom ridicule, c'est ça ?


Erreur : Mettre plusieurs informations dans un seul champ

Non, mais dans un cours, il y a plusieurs élèves normalement. Si par exemple, il y avait un 2ème ou même un 3ème élève, comment vous allez faire ?

AH ! Ben je les ajoute, comme ça : !

C'est vachement pratique ce que vous me proposez... Et si par exemple, j'ai tout plein de cours, et que je voulais extraire seulement les cours qu'à suivi Alice Japren, comment allez-vous faire ?

Facile : Je crée une requête comme vous nous avez appris dans la leçon 24, et je demande tous les identiteEleve avec le critère Comme "*alice japren*"

C'est vrai, sur ce coup-là vous vous en sortez bien. Et si maintenant, vous vouliez simplement trier par ordre alphabétique de la colonne IdentiteEleve ?

Ah oui.. Il va trier évidemment sur le premier élève (Bracaillon Bernard)...

Bref... Vous constatez bien par vous-même que cette solution est vraiment peu pratique, et en fait quasiment inapplicable. Vous avez autre chose à proposer ?


Erreur : Multiplier les champs de même nature

Je réfléchis... Ah oui, tout simple, au lieu d'avoir un champ ÏdentiteEleve, Je crée un champ Eleve1, Eleve2 et Eleve3, comme ça, j'ai ceci :

D'accord, et comment est-ce que vous allez faire pour trier par ordre alphabétique des élèves ?

Ben je trie sur Eleve1, puis ensuite sur Eleve2, puis sur ... Ah... Non, ça va pas effectivement..

Ben non ça va pas... D'autant que vous pouvez avoir un même élève à différentes positions, comme ceci :

Oui, effectivement...

Et encore, là, on a que 3 élèves maximum par cours... S'il y a 12 places dans la salle, il faudrait créer Eleve1, Eleve2, Eleve3 jusqu'à Eleve12... 12 champs ! Sans compter qu'il est possible qu'une fois, exceptionnellement, il y ait eu une 13ème personne qui assiste au cours, et on lui ajoute une chaise, tout à coup il vous faut un 13ème champ Eleve13, juste pour gérer cette exception... Vous voyez le topo, si par exemple vous avez à organiser disons 200 cours différents, pour chacun des cours, ben il y a 13 champs, JUSTE pour UN malheureux cours ou il y avait une 13ème personne...


Erreur : Répéter inutiliement de grosses masses d'information

Ah ouuiiiiiiiiiiii... Je vois mieux maintenant ! Bon, autrement, ce qu'on peut faire, c'est une ligne par élève : On garde IdentiteEleve comme champ unique des élèves, et on fait comme ceci :

Oui, d'accord, c'est vrai que c'est mieux, mais alors quel boulot ! Il faut chaque fois répéter plein d'informations qui sont toujours les mêmes : Par exemple pour le premier cours, il faut répéter trois fois L'identité du prof, le nom du cours, sa date, l'heure de début et de fin, et le prix... Tout ça pour avoir une ligne par élève... Cette répétition inutile d'information s'appelle en terme technique de la REDONDANCE.

Vous vous rendez compte du travail ! Et de la place que ça va prendre ! Et de l'aspect peu esthétique !

Et encore, là on a que 2 ou 3 élèves... Imaginez un instant que nous avons des classes de 12 élèves : Il y aura donc 12 lignes... Et si, en plus, nous avons vraiment pas mal de champs dans notre table, comme par exemple en plus le numéro de portable du prof, le temps de pause à midi, une éventelle 2ème date pour le même cours si par exemple c'est un cours sur 2 jours, etc. Ca en fait de la redondance...

Oui, vu comme ça, ce n'est pas évident. Mais comment va-t-on faire alors ?

Nous allons voir ça. La première étape est prendre réellement conscience du blocage dans lequel on se trouve :


Exemples de la problématique d'un objet contenant un nombre indéterminé de sous-objets

En fait, c'est systématique : CHAQUE fois que vous avez un objet qui peut contenir un nombre indéterminé de sous-objets, on est bloqué de la même manière. Dans notre exemple, nous avons un objet Cours qui peut contenir on ne sait pas combien de sous-objets Elèves.

On peut trouver plein d'autres exemples :

Chaque fois, le même problème revient inlassablement : Un truc (Repris de justice, CD, Terrain de tennis, voiture) contient un certain nombre d'autres machins, mais on ne sait pas combien (Délit, Chansons, Réservations, Options). Essayez de trouver d'autres exemples par vous-même.


Des champs se ressemblant, mais dont la nature est légèrement différente ne pose pas le même problème

AH ben par exemple, j'ai une liste de clients qui a un certain nombre de téléphones : Tél professionnel, privé, Natel et fax par exemple !

Ca c'est différents, parce que ce sont vraiment des infos uniques et différentes : Dans ce cas, vous pouvez très bien dans votre table avoir un champ TelPrive, TelPro, Natel et Fax. Parce que sinon, on pourrait aussi dire que chacun de vos clients possède un nombre indéterminé de propriétés : Nom, prénom, adresse, code postal et ville... C'est pas la même chose

Oui, mais s'il a 2 téléphones professionnels ?

2, ce n'est pas un nombre vraiment indéterminé... C'est 2. Vous pouvez sans crainte avoir un seul champ TelPro, avec directement écrit dedans par exemple : 022.768.43.90 / 021.445.97.87. C'est vrai qu'on ne peut pas trier par le 2ème numéro, mais est-ce vraiment important ? Autrement, vous faites un champ TelPro1 et TelPro2, et voilà...

Oui, mais si j'ai un client qui a 18 numéros de téléphone ?

Ouais... Vous en connaissez beaucoup, vous, des gens qui ont 18 numéros de téléphone ?


Il n'est pas toujours évident de déterminer si plusieurs champs sont de même nature

Non, c'est vrai. C'était donc un mauvais exemple. Donc, dans le même ordre d'idées, si par exemple, j'ai toute une collection de DVD, et j'aimerais les répertorier dans une table T_DVD, j'aurais donc les champs TitreFilm, Duree, Langue, etc. Et si je veux mettre l'acteur principal, je met un champ ActeurPrincipal, c'est bien juste ?

Oui.

Bon. Et si maintenant, je voulais mettre l'acteur principal, et le second rôle, je mettrais bien ActeurPrincipal et SecondRole (Ou Acteur1 et Acteur2)

Oui, mais je vous vois venir : Déjà là, vous allez-être un peu ennuyé, parce que si vous recherchez par exemple tous les films ou Gérard Depardieu joue, il va vous falloir jouer avec les extractions sur les 2 colonnes : ActeurPrincipal et SecondRole, ce qui va vraiment être gênant...

Voilà, vous avez compris, et justement, j'allais ajouter que j'allais être ennuyé si c'est un film qui a 2 ou 3 acteurs principaux...

Donc, dans ce cas, effectivement, nous sommes dans le cas : UN film contient UNE durée, UN titre, mais UN NOMBRE INDETERMINE d'acteurs. C'est toujours le même principe.

Nous allons arrêter cette leçon ici. C'est une leçon un peu frustrante, je vous l'accorde, car nous n'avons fait que soulever un problème sans donner la solution. Mais il est extrêmement important de parfaitement comprendre le problème pour pouvoir le résoudre, car le succès de vos développement Access seront directement liés à la conscience de cet état de fait.

Vous pouvez fermer votre table T_Cours.

Bon... Hem... On peut résumer ?

Cette leçon était le grand préambule à la philosophie même de SGBDR (Système de gestion de bases de données relationnelles). Il est extrêmement important de comprendre parfaitement le concept d'objets qui contiennent des sous-objets, car cette notion est présente dans à peu près toutes les bases de données. Pas systématiqueemnt, la preuve : Jusqu'à cette leçon, nous avons passé 55 leçons ensemble sans en entendre parler. Par contre, je suis assez persuadé que vous vous êtes déjà cassé les dents sur cette notion si vous êtes déjà en train de développer un projet Access.

Avez-vous bien compris ?

  1. Vous êtes gérant d'immeubles. Vous avez un certain nombres d'immeubles à vérifier, et pour vous faciliter la tâche, vous créez une table T_Immeuble, dans laquelle vous indiquez : L'année de construction de l'immeuble, son adresse, son nombre d'étages, et des remarques de style "Facade défraîche", "Volets à remplacer", "Concierge part à la retraite en 2003", enfin ce genre de remarques, quoi ! Chaque immeuble contient un nombre indéterminé de :
    a. Années de construction
    b. Nombre d'étages Non : Il n'y a Qu'UN SEUL nombre d'étages, réfléchissez !
    c. Remarques *** Car il peut y en avoir un certain nombre bien sûr...
    d.
    Rien du tout. Aucun champ ne pose ce genre de problèmes

  2. Vous êtes médecin. Sous access, vous créez une table T_Paient ou vous stockez vos patients. Pour chacun d'entre eux, vous indiquez : Leur nom, prénom, adresse, taille, poids, ainsi que le jour et l'heure de leur visite quand ils viennent vous voir. Chaque patient a un nombre indéterminé de :
    a. Prénoms
    b. Taille
    c. Jour et heure de visite *** Ben oui, il peuvent venir plusieurs fois quand même
    d. Rien du tout Aucun champ ne pose ce genre de problèmes

  3. Vous êtes passionsé de voitures de sport. Vous créez une table T_Voiture dans laquelle vous insdiquez les renseignements de vos voitures préférées : La marque, le type, le prix, la vitesse de pointe et le nombre de chevaux. Chaque voiture contient un nombre indéterminé de :
    a. Type
    b. Nombre de chevaux Non, c'est comme les étages de immeubles : il n'y a qu'un seul nombre de chevaux
    c. Vitesse
    d. Rien du tout Aucun champ ne pose ce genre de problèmes *** Pour une fois !

  4. Vous êtes libraire. Vous créez une table T_Livre qui contient les informations des livres que vous vendez : Le prix, le N° ISBN, le nombre de pages, l'auteur et une remarque personnelle sur la qualité du bouquin Chaque livre contient un nombre indéterminé de :
    a. Prix
    b. N° ISBN
    c. Nombre de pages
    d. Auteur
    e. Remarque personnelle
    f. Rien du tout Aucun champ ne pose ce genre de problèmes *** Non plus, mais c'était pour vous obliger à réfléchir

Pour voir les solutions, il vous suffit de sélectionner le questionnaire ci-dessus : 3 petites étoiles *** apparaîtront en face des bonnes réponses.

Si vous n'êtes pas tout à fait certain d'avoir suivi correctement toutes les étapes de cette leçon, vous avez la possibilité de télécharger ici la version de ProFormation.mdb exactement dans l'état ou elle devrait être à la fin de cette leçon.

Avez-vous une question technique concernant cette leçon ? Cliquez ici !
Une remarque sur cette leçon ? Un problème ? Une erreur ? une ambiguité ? Soyez gentil de m'en informer