Le but de ce document est d'offrir un éclairage théorique à tout un chacun qui désire collecter ou rassembler des données. Les informations récoltées ici permettront sans doute de rendre des développements futurs - sous MySql ou Access notamment - plus rigoureux.
Vous trouverez un aperçu de la théorie sur les bases de données, je vous invite à vous référez à la bibliographie pour prolonger votre étude.
Dans ce paragraphe nous expliquerons comment les objectifs de contrôle de redondance, de données partagées et spécialement l'indépendance des données peuvent être réalisées dans un système de base de données.
Nous débutons la discussion en présentant les trois niveaux d'abstraction. Nous discuterons également des deux différents langages utilisés dans le système de base de données, celui pour la définition des données (DDL) et celui pour la manipulation des données (DML).
Le modèle externe
Le modèle externe est en fait une vue pour l'utilisateur (end user). Il peut y en avoir plusieurs : jusqu'à un par utilisateur.
Par utilisateur, il peut être défini :
Le modèle conceptuel
Le modèle conceptuel est fréquemment appelé le «data model» de la base de données. Il définit toutes les entités, associations, index,... à travers le langage de définition de données (DDL). La description de la base de données est enregistrée dans le dictionnaire. Contient l'ensemble des process et libraries.
Le modèle interne
La représentation physique des données est spécifiée dans le modèle interne. L'utilisateur n'a pas accès à cette partie du modèle. Le modèle interne permet de cacher la complexité de l'implémentation de la base de données.
Les langages de la base de données
Il existe trois types de langages :
Au commencement vînt le Verbe, puis l'Ecrit et enfin la Base de données...
Les bases de données relationnelles sont les plus répandues (Oracle et Access par exemple) et nous allons donc nous y attarder.
On trouve dans ces bases de données les notions d'entité, de relation, de table, d'attribut, de clé primaire, de clé étrangère, de vue, d'index, de SQL.
Les bases de données relationnelles reprennent toutes les caractéristiques énumérées au point 3.3.
La normalisation est certainement une étape essentielle dans la construction de votre base de données car elle permet d'éviter la redondance. Pour rendre ce propos clair (le sujet n'est pas simple!), nous l'illustrerons à l'aide d'exemples.
Deux tables serviront de base à ces exemples. Il s'agit d'un cas courant : des fournisseurs qui vendent des pièces, les pièces viennent de différents fournisseurs.
NOFOUR | Numéro de fournisseur |
NOMFOUR | Nom du fournisseur |
VILLE | Ville du fournisseur |
PROVINCE | Province du fournisseur |
NOPCE | Numéro de pièce vendue par le fournisseur |
PRIX | Prix de la pièce vendue par le fournisseur |
NOPCE | Numéro de pièce |
NOMPCE | Nom de la pièce |
STOCK | Stock de la pièce |
NOFOUR | Numéro du fournisseur qui vend la pièce |
Une relation non normalisée donnerait ceci :
NOPCE | NOMPCE | STOCK | NOFOUR | NOMFOUR | VILLE | PROVINCE | PRIX |
---|---|---|---|---|---|---|---|
1 | AA | 100 | 100 | XX | LLN | BW | 10000 |
200 | YY | BXL | BT | 20000 | |||
300 | ZZ | WAV | BW | 15000 | |||
2 | BB | 30 | 200 | YY | BXL | BT | 10000 |
400 | NN | GD | FL | 10 |
Une relation normalisée première forme appelée 1NF donne ceci :
NOPCE | NOMPCE | STOCK | NOFOUR | NOMFOUR | VILLE | PROVINCE | PRIX |
---|---|---|---|---|---|---|---|
1 | AA | 100 | 100 | XX | LLN | BW | 10000 |
1 | AA | 100 | 200 | YY | BXL | BT | 20000 |
1 | AA | 100 | 300 | ZZ | WAV | BW | 15000 |
2 | BB | 30 | 200 | YY | BXL | BT | 10000 |
2 | BB | 30 | 400 | NN | GD | FL | 10 |
Une relation normalisée deuxième forme appelée 2NF donne ceci :
NOPCE | NOMPCE | STOCK |
---|---|---|
1 | AA | 100 |
2 | BB | 30 |
NOPCE | NOFOUR | PRIX |
---|---|---|
1 | 100 | 10000 |
1 | 200 | 20000 |
1 | 300 | 15000 |
2 | 200 | 10000 |
2 | 400 | 10 |
NOFOUR | NOMFOUR | VILLE | PROVINCE |
---|---|---|---|
100 | XX | LLN | BW |
200 | YY | BXL | BT |
300 | ZZ | WAV | BW |
400 | NN | GD | FL |
Une relation normalisée troisième forme appelée 3NF donne ceci :
Nous ne touchons plus aux tables PIECES et ASSOCIATION par contre, la table FOURNISSEUR peut encore être normalisée;. En effet, certaines colonnes non clé peuvent être liées entre elles.
NOFOUR | NOMFOUR | VILLE |
---|---|---|
100 | XX | LLN |
200 | YY | BXL |
300 | ZZ | WAV |
400 | NN | GD |
VILLE | PROVINCE |
---|---|
LLN | BW |
BXL | BT |
WAV | BW |
GD | FL |
Bon, si vous êtes arrivé jusqu'ici, BRAVO !
Mais on peut normaliser encore plus loin, mais là je vous renvoie à la bibliographie.
Le SQL est un langage de manipulation de données qui vous permet de travailler avec votre base de données. Certains gestionnaires de base de données vous permettent d'entrer ces commandes en ligne ou vous pouvez les insérer dans votre langage favori (VisualBasic, Cobol, C,...)
Le but n'est pas dans cette section de vous donner toutes les commandes SQL, pour cela je vous renvoie à la documentation ou à l'aide de votre gestionnaire de base de données.
A propos d'Access, lorsque vous créer une requête, vous pouvez en cliquant sur le bouton SQL visualiser le code SQL généré. Remarque : ce code n'est pas vraiment optimisé.
Les commandes qui suivent sont libellées sur plusieurs lignes et indentées pour des raisons de lisibilité uniquement.
Il se peut que pour des raisons de sécurité vous ne puissiez pas réaliser certaines commandes sur le serveur de votre entreprise !
Créer une table :CREATE TABLE FOURNISSEUR (NOFOUR INTEGER NOT NULL, On crée une table FOURNISSEUR avec comme colonne NOFOUR un entier qui ne peut être NULL(saisie obligatoire en création), NOM une chaîne de 20 caractères ... la commande SQL se termine en général par un point-virgule. |
Détruire une table :DROP TABLE FOURNISSEUR; Détruit la table FOURNISSEUR. |
Créer un index : (pour accéder plus rapidement aux enregistrements)CREATE INDEX PR-FOUR1 ON FOURNISSEUR(VILLE); Crée un index nommé PR-FOUR1 sur la colonne VILLE de la table FOURNISSEUR. |
Créer un index unique :CREATE UNIQUE INDEX PR-FOUR2 ON FOURNISSEUR(NOFOUR); Crée un index unique nommé PR-FOUR2 sur la colonne NOFOUR de la table FOURNISSEUR, NOFOUR est donc une clé primaire. |
Créer un index unique composé :CREATE UNIQUE INDEX PR-ASSOC1 ON ASSOCIATION(NOPCE,NOFOUR); Crée un index unique composé nommé PR-ASSOC1 sur les colonnes NOPCE et NOFOUR de la table ASSOCIATION, (NOPCE,NOFOUR) est donc une clé primaire. |
Détruire un index :DROP INDEX PR-FOUR1; Détruit l'index PR-FOUR1. |
Ajouter une colonne à une table :ALTER TABLE PIECES ADD NOM CHAR(20); Ajoute la colonne NOM, chaîne de 20 caractères, à la table PIECES. |
Nous allons maintenant passer à la manipulation des données proprement dite :
Sélectionner le nom de tous les fournisseurs qui vivent à Paris :SELECT NOM FROM FOURNISSEUR WHERE VILLE="PARIS"; |
Sélectionner toutes les villes où vivent les fournisseurs :SELECT DISTINCT VILLE FROM FOURNISSEUR; Le DISTINCT permet d'obtenir une liste qui ne contient qu'une fois chaque nom de ville. |
Trouver les noms de tous les fournisseurs qui vendent la pièce numéro 2 :SELECT NOM FROM FOURNISSEUR WHERE NOFOUR IN Le IN signifie inclus dans. Il existe une autre méthode appelée JOIN qui est nettement MOINS efficace n'en déplaise à Access. Pour comprendre les requêtes (ou query) imbriquées, il faut exécuter d'abord la requête entre parenthèses. |
Trouver les noms de tous les fournisseurs qui ne vendent pas la pièce numéro 1 :SELECT NOM FROM FOURNISSEUR WHERE 1 NOT IN FOURNISSEUR.NOFOUR veut dire le numéro de fournisseur de la table FOURNISSEUR. |
Différents opérateurs peuvent être utilisés := |
Différentes fonctions peuvent être utilisées :COUNT |
Mise à jour :UPDATE ASSOCIATION SET PRIX=30 WHERE NOPCE=5 AND NOFOUR="ZZ"; Dans la table ASSOCIATION pour tous les enregistrements dont le NOPCE=5 et NOFOUR=ZZ, la colonne PRIX sera mise à 30. |
Suppression :DELETE FOURNISSEUR WHERE NOFOUR="ZZ"; Dans la table FOURNISSEUR supprime l'enregistrement dont NOFOUR=ZZ, il faut s'assurer que ce fournisseur n'est pas utilisé dans la table ASSOCIATION. |
Création :INSERT INTO ASSOCIATION (NOPCE,NOFOUR,PRIX) VALUES(1,"KK",10); Crée dans la table ASSOCIATION un enregistrement en assignant des valeurs aux colonnes. |
Voilà qui termine le chapître consacré au SQL, des différences de syntaxe peuvent exister selon le gestionnaire de base de données que vous utilisez mais vous avez ici un aperçu des opérations les plus courantes.
6. Base de données objet.Première remarque : il existe sur le marché des bases de données qui intègrent de nouveaux types de données mais ce sont toujours des base de données relationnelles.
Deuxième remarque : nous ne ferons qu'effleurer le sujet, les bases de données relationnelles sont et resteront les base de données les plus importantes un bout de temps.
Une base de données objet c'est :
Cet exposé n'a pas la prétention de remplacer un cours académique mais pourra éventuellement servir de départ à vos investigations.
Ce cours est une adaptation d'un de mes textes publié en 1998 sur Le Laurent Express, mis à jour le 4 mars 2002 sur phpzoom.com et remis en ligne le 17 janvier 2008 sur cybermonde.org.