Ecole Industrielle et Commerciale de la ville de Namur
Structure et application des bases de données
2è graduat en informatique et systèmes
* technologie de l’information 2008 – 2009
Y. Mine
Table des matières
Chapitre 1 Les bases de données relationnelles
1.1 Introduction
1.2 Pourquoi une base de données 1.3 Différentes formes
1.4 Le stockage des données (les tables) 1.5 L’algèbre relationnel
1.6 Le SGBD
1.7 Le matériel
1.8 Les différents modèles de bases de données 1.9 Les identificateurs
1.10 Notions de clé primaire Chapitre 2 Le modèle entité/associations
2.1 Les entités et leurs attributs 2.2 Les associations
2.3 Les cardinalités
2.4 Traduction en mode relationnel 2.5 Création d’une base de données Chapitre 3 Présentation de l’interface
3.1 Les index
3.2 L’onglet « Afficher »
3.3 Les onglets « SQL » et « Rechercher » 3.4 L’onglet « Insérer »
3.5 L’onglet « Exporter » 3.6 L’onglet « Opérations » Chapitre 4 Création de la base
4.1 Création d’une table 4.2 Les types d’attributs 4.2.1 Les entiers 4.2.2 Les flottants 4.2.3 Les chaînes 4.2.4 Date et heure
4.3 Propriétés des champs
4.3.1 Un champ d’un enregistrement
4.4 Saisir les données
Chapitre 5 Les index
5.1 Avantages 5.2 Inconvénients
5.3 L’index sur plusieurs champs 5.4 L’indexation d’un champ Chapitre 6 Les formulaires
6.1 Interagir avec une base de données 6.2 Création d’un formulaire simple
6.3 Composition et ergonomie des formulaires 6.3.1 Choix et spécification des éléments 6.3.2 Présentation générale
6.3.3 Groupement et ordonnancement des champs 6.3.4 Champs obligatoires / champs optionnels 6.3.5 Rapidité d’exécution
6.3.6 Protection contre les erreurs Chapitre 7 Le langage MySQL et ses fonctions
7.1 Introduction à SQL 7.2 MySQL
7.3 Les fonctions MySQL 7.3.1 Data retrieval
7.3.2 Data manipulation language 7.3.3 Les opérations ensemblistes 7.3.4 Les états
7.3.5 Gestion automatisée par des macros 7.3.6 Data definition language
7.3.7 Introduire des données via un fichier texte 7.3.8 Audit des bases : explain
7.3.9 Les procédures stockées 7.3.10 Les vues
Exercices
Chapitre 1 : Les bases de données relationnelles
1.1 Introduction
Une base de données (bd) est un système d'organisation de l'information, conçu pour une localisation et une mise à jour rapide et facile des données. Une bd organise l'information qu'elle contient en tables, en champs (les colonnes) et en enregistrements (les lignes). Chaque enregistrement correspond à un item stocké dans la base de données.
Réduire le plus possible la saisie d'informations redondantes est l'un des gros problèmes auquel se sont heurtés les gestionnaires de données.
En pratique, on manipule souvent des données ayant la même structure (ex. : liste des membres du personnel : pour chaque personne, on enregistre le nom, le prénom, le sexe, la date de naissance, l'adresse, la fonction dans l'entreprise, etc.) Toutes ces données ont la même structure et peuvent être facilement gérées par des moyens informatiques. Dans le même ordre d'idée, l'encodage d'un achat doit automatiquement afficher dans le masque de saisie toutes les coordonnées du fournisseur dès que l'on a encodé son nom ou son identifiant unique.
une base de données est un ensemble structuré de données, géré à l'aide de l'informatique
• Une collection de données qui supporte les définitions de – données de la base
• Structure intégrée
• Lien sémantiques
• Contraintes d’intégrité
• Contraintes de sécurité – vues de la base
• Une collection de données qui supporte les manipulations de – recherche de données
• Interactive
• Logiquement et physiquement performante – insertion, Mise à jour, Suppression de données
• Cohérente
• Partagée
• Fiable
En outre, il y a aussi les notions de :
• exhaustivité : la base contient toutes les informations requises
• unicité : la même information n'est présente qu'une seule fois Exemples d'utilisation :
les fournisseurs les clients
les contacts
les commandes les factures
les produits et services
le stock le personnel
les salaires et les charges correspondantes le commerce électronique, etc.
1.2 Pourquoi une base de données ?
• Intégration de données – Moins de duplications
• Partage de données
• Fiabilité de données
– Transactions, reprises sur pannes, tolérance de pannes
• Sécurité de données
• Langages de requêtes – SQL, QBE
• Interfaces conviviales – Web
1.3 Différentes formes :
• BDs personnelles – MsAccess etc.
– 10 KO – 100 KO
• BDs professionnelles typiques – 100 KO – 100 GO
• BDs professionnelles très grandes
– Very Large Databases (VLDB) > 100 GO
1.4 Le stockage des données (les tables)
Dans une base de données, le stockage se fait de manière organisée. On distingue plusieurs éléments constitutifs.
Il y a tout d'abord des tables. Elles portent un nom qui généralement correspondra aux informations contenues. Pour un carnet de contacts, on aura une table appelée Contacts qui contiendra toutes les personnes que l'on connaît.
Une table contient des enregistrements. En voyant la table comme un tableau, un enregistrement correspond à une ligne. On pourra dire dans notre exemple, que les différentes personnes constituent les enregistrements de la table Contacts.
Un enregistrement est fait de plusieurs champs. Ces derniers correspondent aux informations contenues. Ce sont les enregistrements qui contiennent effectivement des données. Ils correspondront aux colonnes du tableau. Un champ est de plus défini par un type selon les données qui pourront y être enregistrées. Celui-ci indiquera par exemple que le contenu du champ pourra être de un ou plusieurs caractères, un ou plusieurs chiffres, une date, ...
Des données ayant une même structure peuvent être rangées dans un même tableau. Dans le cas ci-dessous, la première colonne (appelée aussi attribut) contiendra les noms, la seconde les prénoms, la troisième le sexe, la quatrième la date de naissance, etc. La caractéristique
d'un tel tableau est que toutes les données d'une même colonne sont du même type. Dans une base de données, un tel tableau s'appelle une table.
Cette table, nommée "personnes" aura pour attributs (colonnes) : nom, prénom, sexe, adresse, ville et code postal. Les lignes que contiendra cette table seront appelées enregistrements ou tuples.
Dans une table, les termes ligne et enregistrement sont synonymes. Il en est de même pour les termes colonnes et champs.(row) et (column).
1.5 L'algèbre relationnel
L’algèbre relationnel regroupe toutes les opérations possibles sur les relations.
Projection : on ne sélectionne qu’un ou plusieurs attributs d’une relation (on ignore les autres).
Par exemple n’afficher que les colonnes nom et prénom de la table Personnes.
Jointure : on fabrique une nouvelle relation à partir de 2 ou plusieurs autres en prenant comme pivot 1 ou plusieurs attributs. Par exemple, on concatène la table du carnet d’adresse et celle des inscrits à la bibliothèque en fonction du nom de famille (c’est typiquement du recoupement de fichiers).
Nom Prénom Sexe Adresse Ville Code postal Durand Pierre M 16, rue de Fer Namur 5000
Chose Stéphanie F 3, Bld d'Avroy Liège 4000 Trombe Jean M 3, rue Neuve Bruxelles 1000
…
0258941236 7 allée des vers
Pierre Martin
0526389152 32 allé Poivrot
Jean Dupond
0123456789 8 rue de l’octet
Marc Dupond
téléphone adresse
prénom nom
0258941236 7 allée des vers
Pierre Martin
0526389152 32 allé Poivrot
Jean Dupond
0123456789 8 rue de l’octet
Marc Dupond
téléphone adresse
prénom nom
Personnes
SELECT nom, prénom FROM Personnes
Pierre Martin
Jean Dupond
Marc Dupond
prénom nom
Pierre Martin
Jean Dupond
Marc Dupond
prénom nom
Sélection : on sélectionne tous les tuples ou bien seulement une partie en fonction de critères de sélection qui portent sur les valeurs des attributs. Par exemple n’afficher que les lignes de la table Personnes qui vérifient la condition suivante : le nom ne commence pas par la lettre ‘C’.
Cette algèbre est facilement possible avec les commandes de MySQL (SELECT… FROM…
WHERE…).
1.6 Le logiciel (SGBD)
• Système de Gestion de Base de Données (SGBD) – Système logiciel gérant une BD
• Peut avoir des composants matériels – Mono ou multiposte
Faust Jospin
Robinson Dupond
Misère Martin
Dernierlivre nom
Faust Jospin
Robinson Dupond
Misère Martin
Dernierlivre nom
0258941236 7 allée des vers
Pierre Martin
0526389152 32 allé Poivrot
Jean Dupond
téléphone adresse
prénom nom
0258941236 7 allée des vers
Pierre Martin
0526389152 32 allé Poivrot
Jean Dupond
téléphone adresse
prénom nom
Personnes
SELECT Personnes.prénom, dernierlivre FROM Personnes, Bibliothèque
WHERE Personnes.nom = Bibliothèque.nom
On joint les deux tables, grâce à la colonne nom.
Et on combine cette jointure à une projection sur les attributs nomet dernierlivre.
Attention à lever toute ambi- guïté sur les noms d’attribut dans le cas où deux tables possèdent des colonnes de même nom.
Bibliothèque
Robinson Jean
Misère Pierre
Dernierlivre prénom
Robinson Jean
Misère Pierre
Dernierlivre prénom
0258941236 7 allée des vers
Pierre Martin
0526389152 32 allé Poivrot
Jean Dupond
0123456789 8 rue de l’octet
Marc Dupond
téléphone adresse
prénom nom
0258941236 7 allée des vers
Pierre Martin
0526389152 32 allé Poivrot
Jean Dupond
0123456789 8 rue de l’octet
Marc Dupond
téléphone adresse
prénom nom
Personnes
SELECT *
FROM Personnes
WHERE nom = ‘’Dupond’’
On ne sélectionne que les tuples dont l’attribut nom est égale à ‘Dupond’.
0526389152 32 allé Poivrot
Jean Dupond
0123456789 8 rue de l’octet
Marc Dupond
téléphone adresse
prénom nom
0526389152 32 allé Poivrot
Jean Dupond
0123456789 8 rue de l’octet
Marc Dupond
téléphone adresse
prénom nom
– En général, peut gérer plusieurs BDs
– Peut aussi accéder aux BDs d’autres SGBDs
Le logiciel qui gère une base de données s'appelle un système de gestion de base de données. (SGBD - DBMS pour Data Base Management System).
Tous les SGBD présentent à peu près les mêmes fonctionnalités. Ils se distinguent par leur coût, par le volume de données qu'ils sont capables de gérer, par le nombre d'utilisateurs qui peuvent interroger la base simultanément, par la facilité avec laquelle ils s'interfacent avec d'autres logiciels, etc.
Une BDD peut servir à une seule personne, ou être à la disposition de dizaines de milliers d'agents (systèmes de réservation des billets d'avion).
Un SGBD est principalement constitué d'un moteur et d'une interface graphique. Le moteur assure les fonctions essentielles : saisir les données, les stocker, les manipuler, etc. L'interface graphique permet à l'utilisateur de communiquer avec le logiciel.
Pour dialoguer avec les SGBD qui ne sont pas équipés d'une interface graphique, il faut utiliser le langage SQL (Structured Query Language), et introduire les instructions à l'aide d'un éditeur de lignes.
Langage normalisé de manipulation des bases de données, SQL est utilisable avec pratiquement tous les SGBD du marché. Cependant, chaque éditeur ayant développé son propre "dialecte" il faut pouvoir disposer d'un "dictionnaire" pour transporter une BDD d'un SGBD à l'autre. Ce "dictionnaire" a été développé par Microsoft sous le nom ODBC (Open Data Base Connectivity).
1.7 Le matériel (serveur de BDD)
Dépend du volume des données stockées dans la base et du nombre maximum d'utilisateurs simultanés.
Lorsque le nombre d'enregistrements par table n'excède pas le million, et que le nombre d'utilisateurs varie de une à quelques personnes, un pc actuel de bonnes performances, un logiciel système pour poste de travail, et un SGBD "bureautique" suffisent. Exemple : Microsoft Access 2002, installé sur un PC récent, doté de 1 Go de mémoire vive et fonctionnant sous Windows XP.
Si ces chiffres sont dépassés, il faut utiliser un serveur de BDD, dont les accès aux disques sont nettement plus rapides. Le système client doit être remplacé par un système serveur (multi-utilisateurs), et le SGBD bureautique par un SGBD prévu pour les grosses BDD multi- clients.
1.8 Les différents modèles de bases de données
Les bases de données du modèle "relationnel"* sont les plus répandues, car elles conviennent bien à la majorité des besoins des entreprises. Le SGBD qui gère une BDD relationnelle est appelé "SGBD relationnel" (SGBDR).
* Base de données qui contient des tables et autres sujets, et dont l'information est organisée par différentes relations entre tables.
D'autres modèles de bases de données ont été proposés : hiérarchique, en réseau, orienté objet, relationnel objet. Aucun d'entre eux n'a pu détrôner le modèle relationnel (sauf le relationnel objet - Oracle).
Malgré sa généralité, le modèle relationnel ne convient pas à toutes les BDD rencontrées en pratique. Il existe donc des SGBD spécialisés. Les deux exemples les plus connus concernent la gestion des BDD bibliographiques (ou documentaires), et celle des BDD géographiques gérées à l'aide d'un SIG (Système d'Information Géographique).
1.9 Les identificateurs
Les noms des bases, relations, attributs, index et alias sont constitués de caractères alphanumériques et des caractères _ et $.
Un nom comporte au maximum 64 caractères
Comme les bases de données et les relations sont codées directement dans le système de fichiers, la sensibilité à la casse de MySQL dépend de celle du système d’exploitation sur lequel il repose. Sous Windows, la casse n’a pas d’importance ; alors que sous Unix, elle en a.
Le point . est un caractère réservé utilisé comme séparateur entre le nom d’une base et celui d’une relation, entre le nom d’une relation et celui d’un attribut.
Exemple :
SELECT base1.table25.attribut5 FROM base1.table25
1.10 Notions de clé primaire
L’option PRIMARY KEY qui regroupe les contraintes NOT NULL (ne peut pas être vide) et UNIQUE (pas de doublon) va permettre d'identifier tous les enregistrements d'une table.
Pierre Martin
Marc Martin
Marc Martin
Marc Dupond
Pierre Dupont
prénom nom
Pierre Martin
Marc Martin
Marc Martin
Marc Dupond
Pierre Dupont
prénom nom
enregistrement interdit car le couple (‘Martin’, ‘Marc’) est un doublon du couple (nom,‘prénom’)
Chapitre 2 : Le modèle entité / associations
Le modèle Entité – Association – Cardinalité
Ce modèle compte 4 concepts principaux : entité, attribut, association et cardinalité.
• Entité = classe générique d'individus ou d'objets ayant les mêmes caractéristiques. Ex:
les entités "clients", "livres" ou "fournisseurs", dans une base de données de librairie.
• Association = classe générique de liens reconnus ou possibles entre individus ou objets.
Ex: l'association "achète" lie les clients et les livres d'une librairie.
• Attribut = propriété distinctive d'une entité ou d'une association. Ex: le nom d'un client est un attribut de l'entité "clients".
• Cardinalité = caractérisation de l'implication de l'association (p.ex. l'expression (1,N), où 1 représente le minimum et N le maximum d'occurrences dans l'association), qui permet de dénombrer les éléments de l'entité d'arrivée en relation avec un élément de l'entité de départ
Exemple d'entité : une base de livres qui sont caractérisés par un titre, un auteur principal, un ISBN, un éditeur, une année de parution et un nombre de pages. Ces différents éléments, (qui sont les attributs de l'entité) sont communs à tous les livres. Pour chaque livre, leur contenu est unique et ne changera pas.
2.1 Les entités et leurs attributs
Les entités seront représentées de la manière suivante :
Voici un système composé de 3 entités, chacune possède ses propres attributs
2.2 Les associations
Ces entités sont liées par des associations à qui on peut donner un nom, afin de clarifier leur rôle : acheter, livrer, … et qui reflètent les interactions présentes entre ces entités.
2.3 Les cardinalités
Une cardinalité, dans une association, exprime le nombre de participations possibles d'une occurrence de chaque entité à l'association. Ce nombre étant variable, on note la cardinalité minimum et la cardinalité maximum. Comme il y a deux entités (au moins) associées, la cardinalité est précisée pour chaque entité.
Il existe différents types de cardinalités:
• modèle "1 - 1":
à une occurrence de l'entité E1 peut correspondre au maximum une occurrence de l'entité E2.
Ex: l'association "vente" liant les entités "livres" et "fournisseurs" : un livre ne peut être vendu que par un seul fournisseur à la fois.
• modèle "1 - n":
à une occurrence de l'entité E1 peuvent correspondre de une à plusieurs occurrences de l'entité E2,
Ex: l'association "posséder" liant les entités "propriétaires" et "voitures" : un propriétaires peut posséder une ou plusieurs voiture.
• modèle "n - n":
à plusieurs occurrences de l'entité E1 peuvent correspondre plusieurs occurrences de l'entité E2.
Ex: l'association "achète" liant les entités "clients" et "produits" d'un supermarché
• modèles "0 - 1", "0 - N"
Exercice 01 : établir des modèles Entité – Association – Cardinalité
2.4 Traduction en mode relationnel
Après avoir établi le modèle entité/association, il faut traduire le schéma en mode relationnel, c'est-à-dire dans un format réellement exploitable par la base de données qui va être créée.
Cette traduction peut s'opérer selon 2 règles différentes, en fonction de la cardinalité présente sur l'association.
Chaque association va être examinée afin de voir si on y trouve des cardinalités (1-1) ou (0-1) 1ère règle : il n'y a PAS de cardinalité (1-1) ou (0-1) :
L'association disparaît
On crée une relation (une table) "achats"
On crée une contrainte d'intégrité référentielle * entre clé primaire et secondaire
* contraintes d'intégrité référentielle
Une contrainte d'intégrité est une clause permettant de contraindre la modification de tables, faite par l'intermédiaire de requêtes d'utilisateurs, afin que les données saisies dans la base soient conformes aux données attendues. Ces contraintes doivent être exprimées dès la création de la table grâce aux mots clés suivants:
* CONSTRAINT * DEFAULT * NOT NULL * UNIQUE * CHECK
DEFAULT Le langage SQL permet de définir une valeur par défaut lorsqu'un champ de la base n'est pas renseigné grâce à la clause DEFAULT. Cela permet notamment de faciliter la création de tables, ainsi que de garantir qu'un champ ne sera pas vide.
La clause DEFAULT doit être suivie par la valeur à affecter. Cette valeur peut être un des types suivants:
* constante numérique
* constante alphanumérique (chaîne de caractères) * le mot clé USER (nom de l'utilisateur)
* le mot clé NULL
* le mot clé CURRENT_DATE (date de saisie) * le mot clé CURRENT_TIME (heure de saisie)
* le mot clé CURRENT_TIMESTAMP (date et heure de saisie) NOT NULL vérifie que le contenu du champ n'est pas nul
Unique Une table peut posséder une ou plusieurs contraintes d'unicité, chacune étant composée d'une ou plusieurs colonnes de la table.
La clause UNIQUE permet de vérifier que la valeur saisie pour un champ n'existe pas déjà dans la table. Cela permet de garantir que toutes les valeurs d'une colonne d'une table seront différentes.
CHECK définit une condition que chaque rang doit satisfaire
Les index sont utilisés pour trouver des lignes de résultat avec une valeur spécifique, très rapidement. Sans index, MySQL doit lire successivement toutes les lignes, et à chaque fois, faire les comparaisons nécessaires pour extraire un résultat pertinent. Plus la table est grosse, plus c'est long. Si la table dispose d'un index pour les colonnes utilisées, MySQL peut alors trouver rapidement les positions des lignes dans le fichier de données, sans avoir à fouiller toute la table. Si une table à 1000 lignes, l'opération sera alors 100 fois plus rapide qu'une lecture séquentielle. Notez que si vous devez lire la presque totalité des 1000 lignes, la lecture séquentielle se révélera alors plus rapide, malgré tout.
Les index de MySQL sopnt PRIMARY , UNIQUE et INDEX.
En MySQL, il est possible de définir des clés, c'est-à-dire spécifier la (ou les) colonne(s) dont la connaissance permet de désigner précisément un et un seul tuple (ligne).
Primary Key (clé primaire). un ou plusieurs champs qui définissent de manière unique un enregistrement.. Elle peut être composée d'une ou plusieurs colonnes (champs) de la table.
Toutes les lignes (enregistrements) de la table doivent satisfaire aux conditions suivantes : Toutes les colonnes des clés primaires doivent ne pas être nulles.
Toutes les lignes doivent posséder une valeur de clé primaire différente.
Une et une seule clé primaire par table
Foreign key (clé étrangère ou secondaire) Les systèmes de base de données utilisés sont le plus souvent de type relationnel. Par ce terme est exprimé le fait que des relations entre les tables vont exister. On aura alors la présence de clés étrangères. Une clé étrangère est une clé primaire pour une table qui est stockée dans une autre table afin d'établir un lien entre les deux. Une table dépendante peut disposer d'une ou plusieurs clés étrangères, chacune étant constituée d'une ou plusieurs colonnes de la table. Chaque clé étrangère fait référence à une (ou plusieurs) colonne(s) correspondante(s) d'une clé primaire dans la table parent. Pour chaque clé étrangère, toutes les lignes de la table dépendante doivent posséder une valeur correspondante dans la table parent ou avoir une ou plusieurs colonnes de la clé étrangère nulles.
N'est supporté qu'à partir de MySQL 5.0
Trigger (gâchette): garantie de l'intégrité référentielle
Les clés étrangères permettent de définir les colonnes d'une table garantissant la validité d'une autre table. Ainsi, il existe des éléments (appelés triggers, ou en français gâchettes ou déclencheurs) permettant de garantir l'ensemble de ces contraintes que l'on désigne par
le terme d'intégrité référentielle, c'est-à-dire notamment de s'assurer qu'un tuple utilisé à partir d'une autre table existe réellement.
Ces triggers sont ON DELETE et ON UPDATE:
* ON DELETE est suivi d'arguments entre accolades permettant de spécifier l'action à réaliser en cas d'effacement d'une ligne de la table faisant partie de la clé étrangère:
o CASCADE indique la suppression en cascade des lignes de la table étrangère dont les clés étrangères correspondent aux clés primaires des lignes effacées
o RESTRICT indique une erreur en cas d'effacement d'une valeur correspondant à la clé
o SET NULL place la valeur NULL dans la ligne de la table étrangère en cas d'effacement d'une valeur correspondant à la clé
o SET DEFAULT place la valeur par défaut (qui suit ce paramètre) dans la ligne de la table étrangère en cas d'effacement d'une valeur correspondant à la clé
* ON UPDATE est suivi d'arguments entre accolades permettant de spécifier l'action à réaliser en cas de modification d'une ligne de la table faisant partie de la clé étrangère:
o CASCADE indique la modification en cascade des lignes de la table étrangères dont les clé primaires correspondent aux clés étrangères des lignes modifiées
o RESTRICT indique une erreur en cas de modification d'une valeur correspondant à la clé
o SET NULL place la valeur NULL dans la ligne de la table étrangère en cas de modification d'une valeur correspondant à la clé
o SET DEFAULT place la valeur par défaut (qui suit ce paramètre) dans la ligne de la table étrangère en cas de modification d'une valeur correspondant à la clé
2ème règle : il y a une ou des cardinalités (1-1) ou (0-1) : L'association disparaît
On crée une contrainte d'intégrité référentielle entre clé primaire et secondaire One ne crée PAS de relation (table) supplémentaire
Dans notre exemple :
La relation clients-livres appartenant à la 1ère règle :
• on crée une clé primaire dans la table "Clients" via un n° unique nommé IDclient
• on crée une nouvelle table nommée "Achats"
• on crée une clé primaire dans la table "Achats" via un attribut à n° unique nommé N°Achat
• on crée une clé primaire dans la table "Livres" sur l'attribut ISBN car il est unique
• on crée une clé secondaire IDclient dans la table "Achats" liée à la clé primaire IDclient de la table "Clients"
• on crée une clé secondaire ISBN dans la table "Achats" liée à la clé primaire ISBN de la table "Livres"
La relation fournisseurs-livres appartenant à la 2ère règle :
• on crée une clé primaire dans la table "Fournisseurs" sur l'attribut TVA car il est unique
• on crée une clé secondaire TVA_fourn dans la table "Livres" liée à la clé primaire TVA_fourn de la table "Fournisseurs"
Les clés secondaires se placent en principe du côté de la cardinalité (1-1). Attention toutefois aux logiciels de design de DB qui placent les cardinalités "à l'envers".
Une fois le schéma relationnel complété et validé, on peut commencer à créer la db.
Plusieurs systèmes permettent de travailler sur des db. Nous allons utiliser le langage SQL, qui est de loin le plus utilisé aujourd'hui, au travers de l'interface EasyPHP qui offre un maximum de convivialité et qui est un produit Open Source.
Exercice 02 : traduire en mode relationnel
2.5 La création d'une bd
La première opération consiste à créer une base de données vide.
Nous allons utiliser EasyPHP qui procure l'interface de phpMyAdmin, version 2.6.1, qui tourne un serveur Apache et MySQL 4.1.9. Cette version de MySQL ne reconnaît pas encore toutes les instructions SQL Ansi 1999.
Chapitre 3 : Présentation de l'interface
Le menu déroulant permet de choisir la base sur laquelle on désire travailler. Les différentes tables de la base sont listées en dessous. Ce sont en fait des liens qui permettent d'y accéder directement.
En suivant le lien "achats", on arrive à l'écran suivant : de haut en bas, on y trouve :
• Indicateur de navigation : ici base "biblio", table "achats", onglet " structure"
• 9 onglets menant à différentes fonctions : afficher, …(voir plus bas)
• description de la table composée de 3 attributs (3 champs) – chaque attribut est défini selon son nom, son type, la fonction null. Les logos des actions signifient A/ modifier les caractéristiques de l'attribut B/ effacer l'attribut C/ créer une clé primaire sur l'attribut D/
créer un index sur l'attribut E/ crée un index unique F/ crée un index texte entier
• une commande d'ajout de champ et la possibilité de le positionner
• un résumé des clés associées aux champs et de l'espace utilisé
• une fenêtre d'exécution de requête SQL (sur la base courante) soit directement encodée ou issue d'un fichier existant (requêtes longues)
3.1 Les index
Les index sont utilisés pour :
* Trouver rapidement des lignes qui satisfont une clause WHERE .
* Ecarter rapidement des lignes. S'il y a un choix à faire entre plusieurs index, MySQL utilise généralement celui qui retourne le plus petit nombre de lignes.
* Lire des lignes dans d'autres tables lors des jointures.
* Trouver les valeurs MAX() et MIN() pour une colonne indexée.
* Trier ou grouper des lignes dans une table, si le tri ou le regroupement est fait avec un préfixe à gauche utilisable (par exemple, ORDER BY key_part_1,key_part_2 ).
* Dans certains cas, la requête peut être optimisée pour lire des valeurs sans consulter le fichier de données.
index "unique"
Définit la colonne comme étant un identifiant unique. Permet d'avoir un index UNIQUE sur toute combinaison de colonnes de la table. Vous ne pourrez pas utiliser un index UNIQUE pour une recherche unique : une adresse pointe vers un enregistrement (ex : clé primaire)
Index "fulltext"
MySQL propose l'indexation et la recherche sur l'ensemble d'un champ "text" (full-text).
Les index FULLTEXT peuvent être créés depuis des colonnes de types CHAR , VARCHAR , ou TEXT au moment de CREATE TABLE ou plus tard avec ALTER TABLE ou CREATE INDEX . La taille minimale des mots à indexer est de 4 caractères.
Pour les enregistrements les plus grands, il sera plus rapide de charger les données dans une table qui n'a pas d'index FULLTEXT , et ensuite de créer l'index avec ALTER TABLE (ou CREATE INDEX ). L'enregistrement de données dans une table qui a déjà des index FULLTEXT sera plus lent.
La recherche sur un texte en entier est effectuée par la fonction MATCH() .
3.2 l'onglet "Afficher"
Cette page affiche essentiellement le contenu des enregistrements de la table. Chaque entrée peut être éditée, supprimée ou exportée (3 logos).
En bas de page, on peut régler les paramètres d'affichage des entrées de la table, ensuite on trouve un lien pour insérer un nouvel enregistrement, un autre qui affiche une version imprimable, puis une version imprimable complète. Le dernier lien mène vers les paramètres d'exportation de la table.
3.3 l'onglet "SQL"
Offre une fenêtre d'encodage des requêtes SQL. Une requête minimaliste y est encodée, qui demande de montrer toutes les toutes les entrées de la rubrique achat.
Après avoir cliqué le bouton "Exécuter", nous obtenons l'écran suivant :
D'abord un rappel du code SQL demandé,
Un réglage des paramètres d'affichage des entrées de la table Le contenu de la table, selon les paramètres définis
l'onglet "Rechercher"
Comme son nom l'indique, permet d'effectuer des recherches dans les tables; on y trouve :
• Une liste des champs de la table qui seront affichés en fin de requête, il faut en choisir au moins un (ou plusieurs, ou tous)
• Un réglage du nombre de lignes qui seront affichées par page
• Un ordre d'affichage des champs
• Une zone d'encodage pour des requêtes SQL (critères de recherche)
• Une zone de recherche par valeur, par champ
La requête encodée ci-dessus (afficher tous les enregistrements de la table dont la valeur est à
"1" dans l'attribut IDclient) donne le résultat suivant :
3.4 l'onglet "Insérer"
Permet d'ajouter des enregistrements dans la table – on peut choisir de faire des ajouts en boucle. Cliquer "Exécuter".
Maintenant, la table "achat" compte 4 entrées
3.5 l'onglet "Exporter"
Permet l'exportation de la base dans 5 formats. Pour chaque format, des options sont disponibles (qui varient selon le format choisi).
Pour SQL, il est possible de choisir le mode de compatibilité notamment entre différentes versions de MySQL et Oracle.
3.6 l'onglet "Opérations"
On peut y remettre la table en ordre (des champs), la renommer, la déplacer, la copier, y adjoindre des commentaires, changer le type et le set ISO de caractères.
Le second menu permet de faire la maintenance de la table.
Les types de tables
MySQL fournit une base de données à géométrie variable, dont le moteur s'adapte aux besoins pour de meilleures performances.
MySQL donne le choix entre plusieurs moteurs de base de données et permet de permuter facilement entre eux.
Choisir son moteur
Le nombre de moteurs de base de données disponibles dépend de la façon dont l'installation locale de MySQL a été compilée. Pour ajouter un nouveau moteur, MySQL doit être recompilé.
Par défaut, MySQL supporte 3 moteurs de base de données: ISAM, MyISAM et HEAP. La plupart du temps, 2 autres types, InnoDB et Berkley (BDB), sont également disponibles.
ISAM
Le moteur de tables originale était ISAM , qui gérait des tables non-transactionnelles. Ce moteur a été remplacé par le moteur MyISAM. Il est abandonné et ne doit plus être utilisé. Il sera supprimé en MySQL 5.0.
Une transaction est un jeu de une ou plusieurs instructions qui sont exécutées ensembles de façon unitaire, donc toutes les instructions sont exécutées, ou aucune. Par exemple, la mise à jour de plusieurs tables, en cascade et automatiquement, dès qu'une valeur est modifiée dans une table
MyISAM
MyISAM est le format ISAM étendu de MySQL et son moteur de base de données par défaut.
MyISAM utilise un mécanisme de verrouillage des tables pour optimiser plusieurs opérations de lecture et d'écriture simultanées. En échange, il faut exécuter la commande OPTIMIZE TABLE de temps en temps pour récupérer l'espace occupé inutilement par les algorithmes de mise à jour. MyISAM possède également quelques extensions utiles, comme l'utilitaire MyISAMChk pour réparer les fichiers de base de données et l'utilitaire MyISAMPack pour récupérer l'espace gaspillé.
Il est focalisé sur les opérations de lecture rapide, principale raison qui explique la popularité de MySQL dans le développement web car la grande majorité des opérations effectuées sur les données sont des opérations de lecture. Par conséquent, la plupart des fournisseurs d'hébergement permettront d'utiliser le format MyISAM uniquement.
HEAP
HEAP prend en compte les tables temporaires qui résident uniquement en mémoire. Le maintien en mémoire rend HEAP plus rapide qu'ISAM ou MyISAM, mais les données qu'il gère sont volatiles et seront perdues si elles ne sont pas sauvegardées avant l'arrêt. De plus, HEAP ne gaspille pas autant d'espace lorsque des lignes sont supprimées.
InnoDB et Berkley DB
Les moteurs de base de données InnoDB et Berkley DB (BDB) sont des produits directs de la technologie qui rend MySQL si flexible, c'est-à-dire l'API MySQL++. Presque tous les obstacles à surmonter en utilisant MySQL découlent directement du fait que les moteurs de base de données ISAM et MyISAM ne sont pas transactionnels et ne supportent pas les clés étrangères. Bien qu'ils soient beaucoup plus lents que les moteurs ISAM et MyISAM, InnoDB et BDB incluent le support transactionnel et des clés étrangères qui font défaut aux deux autres.
Utiliser les transactions pour préserver l'intégrité des données
En plus de grouper les instructions ensembles pour être exécutées unitairement, les transactions peuvent aider à préserver l'intégrité des données dans une table.
Par exemple, imaginons qu'un employé était supposé entrer les nouveaux prix du café dans la table CAFE, mais ne l'a pas fait depuis quelques jours. Pendant ce temps, les prix ont augmentés, et le propriétaire décide de mettre à jour les nouveaux prix dans la table. L'employé se décide finalement à entrer les prix n'étant plus à jour dans la base de données en même temps que le propriétaire met à jour la table. Après avoir inséré les prix non à jour, l'employé réalise qu'ils ne sont plus valides, et utilise la méthode rollback de l'objet Connexion afin d'annuler les effets de ses manipulations. (La méthode rollback met fin à une transaction et restaure les valeurs présentes avant qu'elles aient été mises à jour).
Mais en même temps, le propriétaire exécute une instruction SELECT puis affiche les nouveaux prix.
Dans cette situation, il est possible que les prix affichés par le propriétaire proviennent d'un rollback contenant les anciens prix, rendant l'affichage des prix incorrects.
Ce genre de situation peut être évité en utilisant les transactions. Si un SGBD supporte les transactions il fournira certains niveaux de protection contre les conflits qui peuvent survenir quand on accède à des données au même moment.
Par exemple, un SGBD pourra verrouiller la ligne d'une table jusqu'à ce que les mises à jour aient été validées. La manière dont les verrous sont posés détermine le niveau d'isolation de la transaction, pouvant aller jusqu'à bloquer totalement les transactions.
Quand appeler la méthode RollBack ?
Appeler la méthode rollback annule une transaction et remet les valeurs qui ont été modifiées à leurs valeurs originales. Si on essaye d'exécuter une ou plusieurs instructions dans une transaction et que on reçoit une SQLExeption, il faut utiliser la méthode rollback pour annuler la transaction et la recommencer depuis le début. C'est la seule façon d'être sur de ce qui a été pris en compte sur la base de données, et ce qui ne l'a pas été. Une SQLException indique que quelque chose ne fonctionne pas, mais elle n'indique pas ce qui à été pris en compte ou pas. Donc on ne peut pas compter sur le fait que rien n'a été mis à jour sur la BD, appeler la méthode rollback est la seule façon d'être sur.
Les onglets "Vider" et "Supprimer" servent … à vider la table de tous ses enregistrements mais en conservant sa structure et à la supprimer physiquement.
Une alerte de confirmation est proposée dans les 2 cas.
Chapitre 4 : Création de la table
La base d'exercice sera la db "biblio".
Les "objets" de la base de données sont :
• les tables, pour stocker les données ;
• les requêtes, pour retrouver les données ;
• les formulaires, pour saisir les données ou les visualiser à l'écran ;
• les états, pour imprimer les données ;
• les macros, pour automatiser des opérations répétitives effectuées sur la base ;
4.1 La création d'une table
A l'intérieur de la bd "biblio", je crée la table "livres".
Cette table est composée de 7 champs, à savoir les 6 attributs choisis pour l'occurrence "livres"
lors de l'analyse entités / association + le champ destiné à la clé.
Ces champs peuvent avoir différents formats, à choisir selon le type de données à insérer :
Ensuite, il faut créer les autres tables de la bd et créer les clefs primaires, toujours en se rapportant au schéma du mode relationnel.
4.2 Les types des attributs
Les types des attributs peuvent être de types différents :
• Nombre entier (quantité commandée, âge)
• Nombre à virgule (prix)
• Chaîne de caractères (nom, adresse)
• Date et heure (date de naissance, heure de parution)
• Énumération (une couleur parmi une liste prédéfinie)
• Ensemble (une ou des monnaies parmi une liste prédéfinie) Il s’agit de choisir le plus adapté.
Ces types requièrent une plus ou moins grande quantité de données à stocker. Par exemple, ne pas choisir un LONGTEXT pour stocker un prénom mais plutôt un VACHAR(40).
4.2.1 Les entiers
nom borne inférieure borne supérieure
TINYINT -128 127
TINYINT UNSIGNED 0 255
SMALLINT -32768 32767
SMALLINT UNSIGNED
0 65535
MEDIUMINT -8388608 8388607
MEDIUMINT UNSIGNED
0 16777215
INT* -2147483648 2147483647
INT* UNSIGNED 0 4294967295
BIGINT -
9223372036854775808
9223372036854775807
BIGINT UNSIGNED 0 18446744073709551615
(*) : INTEGER est un synonyme de INT UNSIGNED permet d’avoir un type non signé ZEROFILL : remplissage des zéros non significatifs
4.2.2 Les flottants
nom domaine négatif : borne inférieure borne supérieure
Domaine positif : borne inférieure borne supérieure FLOAT -3.402823466E+38
-1.175494351E-38
1.175494351E-38 3.402823466E+38 DOUBLE
ou REAL
-1.7976931348623157E+308 -2.2250738585072014E-308
2.2250738585072014E-308 1.7976931348623157E+308
4.2.3 Les chaînes
nom longueur
CHAR(M) Chaîne de taille fixée à M, où 1<M<255, complétée avec des espaces si nécessaire.
CHAR(M) BINARY Idem, mais insensible à la casse lors des tris et recherches.
VARCHAR(M) Chaîne de taille variable, de taille maximum M, où 1<M<255, complété avec des espaces si nécessaire.
VARCHAR(M) BINARY
Idem, mais insensible à la casse lors des tris et recherches.
TINYTEXT Longueur maximale de 255 caractères.
TEXT Longueur maximale de 65535 caractères.
MEDIUMTEXT Longueur maximale de 16777215 caractères.
LONGTEXT Longueur maximale de 4294967295 caractères.
DECIMAL(M,D) ou NUMERIC
Simule un nombre flottant de D chiffres après la virgule et de M chiffres au maximum. Chaque chiffre ainsi que la virgule et le signe moins (pas le plus) occupe un caractère.
Les types TINYTEXT, TEXT, MEDIUMTEXT et LONGTEXT peuvent être judicieusement remplacés respectivement par TINYBLOB, BLOB, MEDIUMBLOB et LONGBLOB.
Ils ne diffèrent que par la sensibilité à la casse qui caractérise la famille des BLOB. Alors que la famille des TEXT sont insensibles à la casse lors des tris et recherches.
Les BLOB peuvent être utilisés pour stocker des données binaires.
Les VARCHAR, TEXT et BLOB sont de taille variable. Alors que les CHAR et DECIMAL sont de taille fixe.
4.2.4 Dates et heures
nom description
DATE Date au format anglophone AAAA-MM-JJ.
DATETIME Date et heure au format anglophone AAAA-MM-JJ HH:MM:SS.
TIMESTAMP Affiche la date et l’heure sans séparateur : AAAAMMJJHHMMSS.
TIMESTAMP(M) Idem mais M vaut un entier pair entre 2 et 14. Affiche les M premiers caractères de TIMESTAMP.
TIME Heure au format HH:MM:SS.
YEAR Année au format AAAA.
nom description TIMESTAMP(2) AA
TIMESTAMP(4) AAMM TIMESTAMP(6) AAMMJJ TIMESTAMP(8) AAAAMMJJ TIMESTAMP(10)AAMMJJHHMM TIMESTAMP(12)AAMMJJHHMMSS TIMESTAMP(14)AAAAMMJJHHMMSS Les formats DATETIME, DATE et TIMESTAMP
DATETIME est utilisé pour indiquer la date et l'heure.
MySQL affiche les valeurs DATETIME sous la forme 'YYYY-MM-DD HH:MM:SS'. Les limites en sont : '1000-01-01 00:00:00' à '9999-12-31 23:59:59'.
DATE est utilisé pour indiquer la date, sans plus. MySQL affiche les valeurs DATE sous la forme 'YYYY-MM-DD' format. Les limites en sont '1000-01-01' à '9999-12-31'.
TIMESTAMP possède diverses propriétés, liées à la version de MySQL et au mode SQL utilisé par le serveur.
Des valeurs hors limites dans les champs DATETIME, DATE ou TIMESTAMP seraient converties en ``zero'' ('0000-00-00 00:00:00', '0000-00-00', or 00000000000000).
4.3 Les propriétés des champs
Elles dépendent du type de données choisi, mais une propriété donnée peut exister pour des types de données différents. Exemple : la propriété "Taille du champ" apparaît pour les types de données "Texte", "Numérique"et "NuméroAuto".
• Taille du champ ;
• Format : définit la manière dont les informations s'affichent. Exemple : le format monétaire affiche deux chiffres après la virgule, puis un espace et le symbole de l'euro ;
• Masque de saisie : guide la saisie des données et exerce un contrôle. Exemple : un code postal est composé de 4 chiffres ;
• Légende : définit le nom de l'étiquette dans le formulaire associé à la table. Il est préférable d'implémenter cette propriété au niveau du formulaire lui-même ;
• Valide si : condition de validité du champ. Exemple : une notation sur 20 doit être comprise entre 0 et 20 ;
• Message si erreur : ce message s'affiche si la condition de validité précédente n'est pas satisfaite ;
• Null interdit (Not Null) : le champ correspondant doit obligatoirement recevoir une valeur lors de la saisie d'un enregistrement ; dans ce cas, si malgré tout, aucune valeur n’est fournie, la valeur par défaut – si elle est déclarée à la création de la relation – sera automatiquement affectée à cet attribut dans l’enregistrement.
Si aucune valeur par défaut n’est déclarée :
- la chaîne vide ‘’’’ sera affectée à l’attribut s’il est de type chaîne de caractères - la valeur zéro 0 s’il est de type nombre
- la date nulle 0000-00-00 et/ou l’heure nulle 00:00:00 s’il est de type date, heure ou date et heure.
• Au contraire, on utilisera l’option NULL si on autorise l’absence de valeur.
• Chaîne vide autorisée : le champ peut contenir une chaîne ne comportant aucun caractère ;
• Indexé : un fichier index est associé au champ
• Compression unicode : un octet suffit pour saisir un caractère (pour les alphabets utilisés dans l'Europe de l'ouest et dans le monde anglophone).
• Pour donner une valeur par défaut à un attribut, on utilise l’option DEFAULT.
Lors de l’ajout d’un enregistrement cette valeur par défaut sera affectée à l’attribut si aucune autre valeur n’est entrée. Elle s'affiche dans le champ avant la saisie par l'utilisateur.
Exemple :
‘téléphone’ DECIMAL(10,0) DEFAULT ‘0123456789’
Les attributs de type chaîne de caractères de la famille TEXT et BLOB ne peuvent pas avoir de valeur par défaut.
• Attribut sans doublon : Pour interdire l’apparition de doublon pour un attribut, on utilise l’option UNIQUE.
Syntaxe :
UNIQUE [nomdelacontrainte](liste des attributs)
Exemple, pour interdire tout doublon de l’attribut nom : UNIQUE(nom)
Pour interdire les doublons sur l’attribut nom mais les interdire aussi sur ‘prénom’, tout en les laissant indépendants :
UNIQUE(nom) UNIQUE(‘prénom’)
• Attribut sans doublon : Pour interdire tout doublon à un ensemble d’attributs (tuple), on passe en paramètre à UNIQUE la liste des attributs concernés.
Pour interdit tout doublon du couple (nom, ‘prénom’) : Marc
Dupond
Marc Martin
Pierre Dupont
prénom nom
Marc Dupond
Marc Martin
Pierre Dupont
prénom
nom enregistrement interdit
car ‘Marc’ est un doublon dans la colonne ‘prénom’
UNIQUE(nom,‘prénom’)
4.3.1 Un champ d'un enregistrement :
• possède la valeur Null si aucune information n'a été introduite, ou si l'information présente a été supprimée ;
• contient une chaîne vide si on a défini la valeur par défaut du champ à l'aide de deux guillemets contigus (""), et si aucune information n'a été introduite (ou si l'information introduite a été supprimée) ;
• contient une chaîne "blanche", si un ou plusieurs espaces ont été introduits et n'ont pas été supprimés.
4.4 Saisir les données
Pierre Martin
Marc Martin
Marc Martin
Marc Dupond
Pierre Dupont
prénom nom
Pierre Martin
Marc Martin
Marc Martin
Marc Dupond
Pierre Dupont
prénom nom
enregistrement interdit car le couple (‘Martin’, ‘Marc’) est un doublon du couple (nom,‘prénom’)
L'interface d'encodage des données présente un rappel du nom des champs, du type de données, du nombre de caractères admis, de la fonction et de l'hypothèse de valeur nulle.
Après avoir rempli les champs, cliquer "exécuter"
9 livres ont été encodés dans la table "livres"
Chapitre 5 : Les index
Lors de la recherche d’informations dans une relation, MySQL parcours la table correspondante dans n’importe quel ordre. Si il y a un grand nombre de lignes, cette recherche est très longue.
Pour y remédier, une optimisation possible et recommandée, est d’utiliser des index.
La création d’un index associé à un attribut ou à un ensemble ordonné d’attributs va créer une liste ordonnée des valeurs de ces attributs et de l’adresse de la ligne associée. C’est sur les valeurs de cette liste que se feront les recherches et les tris. Les algorithmes de recherche et de tri sur des ensembles ordonnés sont beaucoup plus rapides.
Un index offre toutefois l'inconvénient de ralentir les mises à jour (insertion, suppression, modification de clé).
On choisira de créer des index sur les attributs qui seront les plus sollicités par les recherches ou utilisés comme critère de jointure. Par contre, on épargnera les attributs qui contiennent peu de valeurs différentes les unes des autres et ceux dont les valeurs sont très fréquemment modifiées.
Un index peut porter sur 15 colonnes maximum.
Une table peut posséder au maximum 16 index
Un index peut avoir une taille maximale de 256 octets et ne doit porter que sur des attributs NOT NULL.
Il faut suffixer l’attribut (CHAR, VARCHAR) pour ne prendre que les M premiers caractères pour l’indexation
Un index est représenté par une table à une seule colonne. Dans le premier index (index sur le titre), le premier titre par ordre alphabétique correspond au livre n° 2 (Access), suivi du livre n° 3 (Les écoles) et du livre n° 1 (Mon jardin). Les autres index s'interprètent de la même façon.
5.1 Avantages :
• accélérer les recherches d'information, car l'index est une représentation de la table, triée sur un champ donné. On peut donc lui appliquer les méthodes de recherche rapide sur un ensemble ordonné (c'est le SGBD qui se charge de l'opération, transparente pour l'opérateur) ;
N° Titre Auteur Éditeur Année ISBN etc.
1 Mon jardin J. Machin Eyrolles 1998 5-1234-4321-8 ...
2 Access A. Chose Dunod 2002 3-6789-9876-2 ...
3 Les écoles S. Truc Lattès 2001 4-1985-5891-3 ...
4 etc.
2 3 1 ..
2 1 3 ..
2 1 3 ..
1 3 2 ..
2 3 1 ..
Index titre
Index auteur
Index éditeur
Index année
Index ISBN
• vu sa taille très inférieure à celle de la table : on peut le remettre à jour en temps réel à chaque modification de cette dernière ;
• empêcher la redondance de l'information.
5.2 Inconvénients :
• la création et la mise à jour d'un index devant être mis à jour immédiatement augmente la charge de travail, et par conséquent freine le système, surtout sur des bases de grande taille.
• un index occupe de la place sur le disque
5.3 L'index sur plusieurs champs
Imaginons que nous ayons séparé le nom et le prénom dans le masque de saisie. Un index sur les deux champs nom et prénom correspond en fait à l'index créé sur un champ unique dans lequel seront concaténés le nom et le prénom.
On appelle "doublon" une information qui apparaît au moins deux fois dans une table (erreur de saisie ou manipulation de l'information). La notion de doublons s'applique à une colonne donnée, ou à plusieurs colonnes, ou à la totalité des colonnes d'une même table. Dans ce dernier cas, nous avons affaire à deux enregistrements (ou plus) identiques.
Lorsque nous introduisons de l'information dans une table pourvue d'un index, le SGBD met ce dernier à jour en temps réel. Au cours de cette opération, il peut détecter facilement si cette nouvelle information constitue un doublon sur les champs concernés. Il est donc aisé de doter le SGBD d'une fonction permettant, si on le désire, d'empêcher la validation de la saisie d'un enregistrement constituant un doublon.
5.4 L'indexation d'un champ
La "Propriété du champ" intitulée "Index" permet de gérer la redondance via l'indexation des données
Pour créer un index sur le champ correspondant, il faut cliquer l'icône 'Index". La valeur "Non"
est inscrite par défaut, aucun index n'est créé.
A B C 1 aa $ 2 bb % 3 cc + 1 dd -
A B C 1 aa $ 2 bb % 3 cc + 1 aa -
A B C 1 aa $ 2 bb % 3 cc + 1 aa $ Doublon sur
1 colonne
Doublon sur 2 colonnes
Enregistrement dupliqué
Non
Oui - Avec doublons (en SQL, pas en MySQL) Oui - Sans doublons
La valeur "Non" est préférable si :
• la table considérée contient peu d'enregistrements
• nous n'effectuons pas de recherche dans ce champ
• nous ne trions jamais la table sur ce champ
• il est normal que le champ contienne des doublons
Si, par contre, la création d'un index présente de l'intérêt, il faut tolérer ou non les doublons
• si les doublons ne posent pas de problème (ex :homonymie),, choisir l'option "Avec doublons"
• dans le cas général, choisir l'option "Sans doublons", ce qui aura pour effet d'empêcher de créer des doublons par mégarde. Le système refusera de valider l'enregistrement fautif (lors du passage à la ligne suivante, ou lors de la fermeture de la table)
Un champ doté d'une clé est toujours indexé sans doublons. Or, en MySQL, une table ne peut contenir qu'une seule clé, alors qu'elle peut être dotée de plusieurs index. Il faut donc réserver la clé pour la réalisation des relations, et ne pas l'utiliser comme index.
Création d'un index multi-champs
Dans une table contenant des données relatives à plusieurs milliers de personnes, le risque d'homonymie devient important. A fortiori dans une plus grande table, (annuaire téléphonique d'une ville). Pour accepter l'homonymie tout en rejetant les doublons dus à des erreurs de saisie, on utilise un index basé sur plusieurs champs. Si la probabilité de trouver 2 fois "Dupont"
est importante, celle de trouver 2 fois "Dupont Jean" est déjà nettement plus faible, et celle de trouver 2 fois "Dupont Jean né le 12/06/1978" est pratiquement nulle. En créant un index sur 2 champs (Nom + Prénom) ou sur 3 champs (Nom + Prénom + Date de naissance), on peut rejeter les doublons dus à des erreurs de saisie tout en tolérant parfaitement l'homonymie.
Pour créer un index multi champ, il faut se trouver en mode structure et remplir la zone de commande d'index ainsi (exemple pour 1 index sur 2 colonnes).
La fenêtre suivante apparaît : y choisir les champs concernés dans les listes déroulantes et sauver.
Dans cet exemple, on crée un index composé des valeurs des attributs "code postal" et
"localité".
La zone de commande d'index devient :
Le nom de l'index est cp, c'est-à-dire le nom du premier champ choisi, mais l'index représente bien la concaténation des contenus des 2 champs.
Chapitre 6 : Les formulaires
6.1 Interagir avec une base de données
Le formulaire est souvent considéré comme le troisième objet des bases de données, par ordre d'importance décroissante, après la table et la requête. En fait, son importance réelle dépend de la manière dont on utilise le SGBD.
Le formulaire est avant tout un outil de saisie d'information au clavier. A ce titre, il entre en concurrence avec :
l'écriture directe dans les tables
l'importation des données
La facilité d'écriture directe dans les tables peut varier de très pratique à parfaitement impraticable suivant les cas. Un formulaire peut rendre la saisie de certaines informations plus facile, principalement dans les SGBD qui, au contraire d'Access, n'affichent pas les sous- feuilles de données. Enfin, les formulaires permettent l'ajout de boutons, menus, etc. qui donnent à l'application un aspect très "fini".
Si la base de données est principalement alimentée en données par importation, le formulaire ne sert alors plus à rien. C'est le cas de bases alimentées seulement par une personne ressource et qui utilise seulement l’outil d’importation directe, nettement plus performant.
C'est aussi le cas des sites web qui déversent quotidiennement leur fichier journal dans la BDD qui sert au suivi du site et à la mesure d'audience. C'est encore le cas de tous ceux qui font de l'acquisition de données via des capteurs couplés à des ordinateurs, etc.
Accessoirement, le formulaire sert aussi d'outil de visualisation, c'est à dire de consultation du contenu de la base à l'écran. On reproche parfois au formulaire de montrer les enregistrements un par un, alors qu'une table en montre un grand nombre à la fois, mais on peut concevoir le formulaire de telle sorte que sa présentation soit très proche de celle d'une table.
En bref :
• lorsque la BDD est utilisée par des personnes très diverses sans expérience particulière en matière de SGBD, ou lorsque l'accès aux tables est interdit aux utilisateurs, ou lorsque la saisie directe dans les tables est malaisée, les formulaires constituent un passage obligé ;
• lorsque la BDD est utilisée par un petit groupe de professionnels formés à l'usage des SGBD, ou lorsque les données sont importées au lieu d'être saisies, les formulaires constituent un simple habillage de la BDD et n'ont guère d'utilité.
6.2 Création d'un formulaire simple
Un formulaire est avant tout un outil permettant de saisir au clavier des données qui sont immédiatement introduites dans une ou plusieurs tables. Le formulaire est donc lié à une ou à plusieurs tables, et il hérite de leurs propriétés : types de données, propriétés des champs, listes de choix et protection contre les doublons via un index.
A l'inverse, les propriétés du formulaire ne rejaillissent pas sur les tables sous-jacentes. Il arrive enfin que l'on puisse attribuer à un champ de formulaire une propriété qui modifie ou contredit celle du champ correspondant de la table.
Evidemment, la méthode de création des formulaires va varier en fonction du SGDB utilisé. Des applications comme Access ou FMPro présentant des fonctions de création de formulaires très élaborées tout en étant très facile à utiliser.
MySQL, pour sa part, n’offre rien … et demande un langage tiers (comme PHP) pour générer des interfaces d’encodage ou de visualisation des résultats. C’est la raison pour laquelle nous allons l’exploiter sous PHPMyAdmin (inclus dans EasyPHP) et sous Navicat qui présentent les interfaces graphiques nécessaires.
EasyPHp - http://sourceforge.net/project/showfiles.php?group_id=14045 Navicat - http://french.navicat.com/download.html
PHPMyAdmin sous EasyPHP
L’interface de PHPMyAdmin propose automatiquement des formulaires d’encodage complets (qui comprennent tous les champs d’une table) de ce genre :
L’interface de PHPMyAdmin est personnalisable via des layouts variés (divers couleurs, polices de caractères, spatialisation MAIS PAS de variation structurelle), disponibles sur : http://www.phpmyadmin.net/home_page/downloads.php?themes ou
http://sourceforge.net/project/showfiles.php?group_id=23067
L’accès à un nouvel enregistrement s’obtient via le lien « Insérer » du menu table.
Les valeurs du nouvel enregistrement se notent dans les cases « valeur ». Ensuite, il est possible de choisir entre :
Navicat
Navicat Lite est un client open source qui permet d’effectuer sur des bases en MySQL des opérations comparables à ce que fait PHPMyAdmin.
La fenêtre principale offre une vue des différentes bases présentes sur la machine
Les différents types d’objets peuvent être affichés séparément. L’interface permet de sauver, appeler, exécuter et commencer.
Voici ci-dessous la table « Cours » avec ses 4 arguments. Notez les boutons qui permettent de faire directement des opérations de tri ascendant ou descendant.
Voici une requête simple sur la table « classe »
… et son résultat
… et le même sur PHPMyAdmin – nettement plus spartiate.
6.3 Composition et ergonomie des formulaires
Outre la base en elle-même, l’utilisation d’une BD implique la mise en œuvre d’interfaces d’encodage, de recherche et d’affichage des résultats. La mise en place pratique de ces interfaces se réalise généralement à l’aide de formulaires.
Le respect de règles d’ergonomie particulières à ces environnements ainsi qu’un bon design de ces interfaces sont nécessaires pour une utilisation optimale. Même si les possibilités offertes autour de MySQL sont assez limitées, une interface web par exemple permet des les optimiser beaucoup. Dans un même ordre d’idées, d’autres SGDB vont présenter d’excellentes possibilités de mise en page. Cet aspect n’est dons pas à néglifger.
Accessibilité physique
Concerne la facilité d'accès d'une interface au niveau sensoriel : visuel, auditif, mais aussi tactile (notamment pour l'interface d'entrée de données : clavier, souris). Une interface doit être accessible par tous les utilisateurs, quelles que soient leurs caractéristiques et leurs moyens d'accès à l'information.
Accessibilité technologique
Concerne surtout le domaine du web. Il s'agit que l'application soit visible et utilisable sur un maximum de plateformes (ensemble constitué par le système d'exploitation, le navigateur, la résolution d'écran et les éventuels plug-in).
Design de la base
Sans revenir sur la technique de création des bases de données, il faut se souvenir qu’une interaction efficace avec une BD ne sera possible que si celle-ci possède un design technique réussi.
Par design réussi, on entend que les choix suivants ont été faits judicieusement : nom de la base
noms des tables noms des champs types de champs taille des champs placement des clés placement des index
placement des propriétés (nul interdit, pas de doublon)
Design des formulaires
Encodage, recherche ou présentation des résultats, si le dialogue avec une base de données passe par des formulaires à l’écran, il faut en soigner l’aspect.