Deux grandes techniques de bases de données s'affrontent : celle à base de fichiers plats structurés nécessitant un moteur sur chaque poste (middleware ou database engine) et celle à base de serveur de données. Nous allons décrire ces différents modèles et dans quelle condition il convient de passer de l'un à l'autre...
A quel moment faut-il passer dun SGBD micro de type serveur de fichier comme dBase, Paradox, FoxPro ou Access, à un poids lourd du client/serveur comme Oracle, Sybase, SQL Server, Informix ou DB2 ?
Nous supposons que le lecteur du présent article maîtrise un tantinet le monde des bases de données. Nous supposons quil sait ce quest une requête (même sil nen a jamais écrit), ce quest un accès concurrentiel aux données (deux utilisateurs voulant modifier la même donnée par exemple), et quil est familiarisé avec la notion de table, colonne (champs) et enregistrement. De plus, nous exigeons quil sache le minimum au sujet des systèmes dexploitation, à savoir ce quest un fichier, un octet, un poste client, un serveur et un réseau
Posons alors la question suivante : Quelle différence y a t-il entre un SGBD à base de fichiers et un SGBD en C/S ?
En fait, il existe deux différences fondamentales entre les deux systèmes. Lensemble des techniques du C/S est dédié à minimiser le trafic des données sur un réseau et assurer une plus grande intégrité lors du traitement des données
Pour y parvenir, le C/S utilise plusieurs techniques particulières, lune concerne le mode de verrouillage lors des concurrences daccès, dautres les modes de traitement des données. Nous allons analyser lensemble de ces techniques et prendre quelques exemples concrets afin de rendre tangible nos propos.
Notons dores et déjà une différence fondamentale : alors que dans un système à base de fichiers, cest chaque poste de travail qui traite localement les données, dans un SGBD C/S, tous les traitements sont, en principe, effectués sur le serveur par le biais de requêtes.
2. Le mode de verrouillage
Le mode de verrouillage est une fonction essentielle de la base de données. A ce jour, il nexiste que deux modes distincts : le verrouillage « optimiste » et le verrouillage « pessimiste ».
Dans la vie courante il est possible que plusieurs personnes lisent, regardent, écoutent, la même chose en même temps (journaux, radio, télévision ) mais il est impossible que plusieurs personnes créent la même information simultanément. Par exemple il est impossible à deux écrivains de tenir le même stylo afin décrire le même roman, comme il est impossible à deux speakers de parler en même temps des même choses sans que cela ne devienne cacophonique. Bref, lécriture de linformation est un acte solitaire, mais sa lecture peut être accomplie par de nombreuses personnes simultanément.
Dans lunivers des bases de données le problème est le même. Il sagit donc de prévoir un mécanisme capable de gérer un accès simultané en lecture à tous les utilisateurs, et dempêcher plusieurs utilisateurs de créer, de modifier ou de supprimer la même donnée.
Pour résoudre ce problème, les chercheurs en algorithmique ont inventé les modes de verrouillage pessimiste et optimiste que nous allons maintenant détailler
2.1. Verrouillage pessimiste
Lorsque quun utilisateur désire modifier une donnée, le SGBD tente de poser un verrou en écriture. Soit lopération est effective (et donc le verrou est posé), soit lopération échoue parce quun autre utilisateur a déjà posé un verrou. Si lopération est positive, pendant toute la durée de la modification, le verrou est actif pour cet utilisateur jusquà ce que lutilisateur valide ses modifications ou les annule. Dans ces deux cas le verrou est libéré.
2.2. Verrouillage optimiste
Lorsque quun utilisateur désire modifier une donnée, le SGBD relève le numéro de version de lenregistrement et ne pose aucun verrou. Plusieurs utilisateurs peuvent faire de même sans aucune limite. Le premier utilisateur qui valide ses modifications, incrémente le numéro de version de lenregistrement. Tous les autres se voient refuser leur modification, car le numéro de version quils ont relevé au début de la session de modification des données nest pas le même que celui quils peuvent lire à la fin de cette session.
2.3. Discussion sur ces différents modes de verrouillage
Lorsque lon utilise la technique du verrouillage pessimiste, il est bon de ne pas « jeter » lutilisateur dès quil tente de poser un verrou pour modifier les données. Dans ce cas, le SGBD effectue une boucle dattente en tentant de poser le verrou pendant n secondes. Sil échoue, il en informe lutilisateur et lui recommande de renouveler sa tentative un peu plus tard Cest comme cela que fonctionne la quasi-totalité des SGBD à base de fichiers (dBase, Paradox, FoxPro, Access ).
Il semble a priori évident que le mode de verrouillage pessimiste devrait être préféré dans tous les cas Cest cependant oublier le principe de base du C/S : minimiser la charge du réseau
Or effectuer une boucle dattente qui interroge un fichier, monopolise dramatiquement le réseau. Cest pourquoi la quasi-totalité des SGBD C/S fonctionne en verrouillage optimiste, car dans ce mode, léchange de données entre la base et le poste client est rapide et bref
De plus si nous prenons en compte lintégrité référentielle et que la structure de la base permet de modifier des clefs existantes en répercutant leurs valeurs dans lensemble des tables filles, alors dans le cas dun SGBD fichier ont peut arriver à obtenir un trafic réseau intense tandis que dans le cas du client serveur, lopération sera menée à bien au sein du SGBD donc sans aucune influence sur la charge du réseau.
3. Le SQL en C/S
Il ny a aucune différence entre un SQL disponible pour un SGBD de type fichier et un SGBD de type C/S : les ordres SQL sont aussi pauvres ou aussi riches en fonction de la qualité de léditeur du SGBD En revanche il existe deux différences fondamentales en matière dexécution des ordres SQL et de contrôle des transactions
3.1. Exécution du SQL
En revanche, il existe une différence fondamentale en matière dexécution de ces requêtes. En fait dans le cadre dun SGBD de type fichier, celui-ci exécute toujours la requête de manière locale tandis que dans un SGBD C/S ce dernier exécute la requête sur le serveur. La différence est fondamentale en matière de congestion du trafic réseau et il ne faut pas oublier quà la base, que se soit en fichier ou en C/S, tous les accès aux données se font par le biais de requêtes
Pour comprendre la différence, voici un exemple simple. Une table de nom CLIENT contient 50 000 enregistrements de 200 octets chacun. La requête est la suivante :
SELECT * FROM CLIENT WHERE (CLI_NAME like %CLINTON%)
Dans un SGBD de type fichier, voici le flot de données :
Le PC rapatrie depuis le serveur le fichier contenant la table CLIENT (Soit au minimum 50 000 x 200 octets (sans compter les index et le reste [1])
Le PC traite localement la requête
Le PC affiche le résultat (soit par exemple 5 lignes de 200 octets)
Dans un SGBD de type C/S, voici le flot de données :
Le PC envoie au serveur le fichier texte de la requête (soit environ 50 octets)
Le serveur exécute la requête sur la table CLIENT
Le serveur renvoie au PC les données répondant à la requête (soit nos 5 lignes de 200 octets)
Le PC affiche le résultat
Bilan de ces opérations : SGBD fichier : environ 10 001 000 octets ont été véhiculé sur le réseau SGBD C/S : environ 1 050 octets ont été véhiculés sur le réseau
Dans ce cas, le rapport est de près de 1/10000 en faveur du C/S
3.2. Le transactionnel
De plus les SGBD C/S disposent dun mécanisme qui nest généralement pas disponible dans les SGBD fichier, le transactionnel.
Le transactionnel permet de regrouper de multiples commandes SQL comme sil sagissait dune instruction de type atomique, cest à dire sexécutant en totalité ou aucunement (comme la division de deux nombres sur le microprocesseur de lordinateur). Cela suppose de donner un point de départ à la transaction un point darrivée et de contrôler si lensemble des commandes SQL ont été réalisées avec succès. Dans le cas ou lune quelconque des commandes SQL na pas été traitée correctement, alors le point final de la transaction permet de revenir en arrière sur lensemble des opérations déjà effectuées. La transaction se présente alors comme une seule instruction de type tout ou rien. Cela nest possible que sur des serveurs capables denregistrer lensemble des insertions, modifications et suppressions effectuées sur les enregistrements des tables dune base (historisation des modifications).
Un exemple va nous montrer comment se présente une session de transaction : Supposons que nous disposons dune base de données centralisée sur un serveur SQL en C/S permettant de collecter les données des clients et des commandes. Supposons aussi que les commerciaux sont dotés de PC portables et que, chaque semaine, ils viennent au siège de la société afin de remplir la base centrale des nouveaux clients et des commandes quils ont saisies sur leur portable. Pour réaliser ce recollement dinformation, linformaticien a réalisé la transaction suivante :
BEGIN TRANSACTION
INSERTINTO CENTRAL_CLIENT (NO_CLI, NOM_CLI, ADRESSE_CLI)
SELECT PC.NO_CLI, PC.NOM_CLI, PC.ADRESSE_CLI
FROM PORTABLE_CLIENT PC
INSERTINTO CENTRAL_COMMANDE (NO_CLI, NO_COM, MONTANT_COM)
SELECT PC.NO_CLI, PC.NO_COM, PC.MONTANT_COM
FROM PORTABLE_COMMANDE PC
IF ERROR
THENROLLBACKELSECOMMIT
ENDIF
Sil navait fait quenchaîner les deux requêtes, il aurait été possible que les clients soit insérés sans que les commandes le soit Pire, le système aurait pu tenter dinsérer les commandes en nayant pas inséré les clients. De plus, les deux requêtes auraient pu être interverties Mais là tous les bons SGBD, quils soient C/S ou fichier, savent gérer les intégrités référentielles et auraient empêché la moindre insertion dans la table des commandes sans avoir la référence du client préalablement insérée dans la table des clients
4. Les triggers, spécialités du C/S
Tout le monde connaît maintenant la programmation événementielle. Son principe est simple : faire correspondre à un événement (louverture dun fichier, lappui sur un bouton, larrivée dune valeur dans un champ), le déclenchement dune séquence de code.
Les triggers sont à la base de données ce quest la programmation événementielle à un environnement graphique : ils font correspondre aux événements dun SGBD du code que tout développeur est capable décrire.
Prenons un exemple afin de décrire plus en avant nos propos. Supposons que nous avons une table CLIENT (parent) liée à 3 tables filles (FACT, LIGNFACT, BONLIV) et que nous voudrions leffacement des données dans les tables filles lorsque lutilisateur demande la suppression dun enregistrement dans la table CLIENT. Bien entendu, il est possible décrire un tel traitement dans la plupart des langages de développement possédant des outils daccès aux bases de données, mais dans ce cas, le code sexécute sur le poste client, et il ne faut pas oublier de lappeler dans tous les éléments de code qui effectuent la suppression dans la table mère
Dans une base de données C/S, avec un trigger, le traitement seffectue directement sur le serveur et il ne nécessite aucun appel à aucune fonction daucune sorte. Cest en effet la base elle-même qui va se rendre compte que lévénement de suppression de la table client nécessite un traitement et va lexécuter.
Dans un tel exemple, le code pourrait être le suivant :
CREATETRIGGER DELETE_CASCADE_CLIENT (CLI_ID_CLI INTEGER) BOOLEAN
BEFOREDELETE
DELETE FROM FACT WHERE (ID_CLI = CLI_ID_CLI)
DELETEFROM LIGNFACT WHERE (ID_CLI = CLI_ID_CLI)
DELETEFROM BONLIV WHERE (ID_CLI = CLI_ID_CLI)
IF ERROR
THEN
RETURN FALSE
ENDIF
RETURN TRUE
Ce trigger comportant différentes commandes SQL devra être appelé au sein dune transaction plus globale incluant la suppression de lenregistrement dans la table mère. Les commandes SQL de ce trigger réclament la suppression dans les tables FACT, LIGNFACT et BONLIV de tous les enregistrements faisant référence à lidentifiant du client transmis en paramètre. Si au moins, une des requêtes échoue, le trigger renvoi False à la procédure layant appelée et lensemble des requêtes sera annulé. Sinon, si tout va bien, le trigger renvoi True et lensemble des modifications sera rendu effectif par une validation (COMMIT).
Ce trigger est stocké au sein même de la définition de la base de données et sexécute, sur le serveur, à chaque fois quun ordre de suppression arrive dans la table CLIENT. Il ny a donc aucun trafic sur le réseau pour effectuer ce traitement
5. Les procédures stockées, régals du C/S
En complément aux triggers, les procédures stockées permettent de stocker un traitement (opérant en général uniquement sur les données de la base) au sein même de la base de données, qui sexécutera, par appel de la procédure au moment voulu, sur le serveur.
Exemple : une application réclame un traitement de modification des prix de vente des produits en fonction de la variation dun certain nombre dindices boursiers. Cette opération ne peut être déclenchée que manuellement par le responsable du service commercial Le code pourrait en être le suivant :
CREATE PROCEDURE AUGMENTATION_PRIX
VAR
INDICE REAL
ENDVAR
; calcul du nouvel indice daugmentation
; moyenne de la différence entre les anciens et les nouveaux indices
SELECTAVG(DERNIER_INDICE INDICE_PRECEDENT) AS :INDICE
FROM INDICE_BOURSE
; teste sil sagit bien dune augmentation et non dune diminution
; autrement dit un indice positif et non négatif
IF INDICE < 0
THEN
RETURN
ENDIF
; effectue laugmentation
UPDATE PRODUITS
SET PRIX_VENTE_HT = (PRIX_VENTE_HT * (1 + (:INDICE)))
IF ERROR
THEN
RETURN FALSE
ENDIF
RETURN TRUE
Dès lors cette procédure peut être appelée nimporte quand, par nimporte quel poste client Elle sexécutera sur le serveur et ne nécessitera pratiquement aucun trafic réseau. On peut aussi imaginer quelle soit couplée avec un trigger ou encore exécutée à une heure différée, par exemple la nuit afin de ne pas ralentir les accès aux données plus fréquents en général dans la journée
6. Le journal, particularité des SGBD C/S
En plus des triggers et des procédures stockées, la plupart des SGBD C/S proposent dhistoriser la « vie » des données, dans ce que lon appelle un journal des transactions. Celui-ci conserve une trace temporelle de toutes les insertions, suppressions, modifications intervenues dans la base de données depuis son origine. Ce journal permet de revenir en arrière de manière partielle sur les données. Lintérêt essentiel réside dans le fait de pouvoir, en cas de crash, revenir à un état des données satisfaisant.
Reprenons lexemple de transaction vu au paragraphe 2.2. Pour assurer correctement la transaction constituée des 2 requêtes de mise à jour, le SGBD effectue en séquence les opérations suivantes :
écrit dans le journal une étiquette permettant de repérer le début de la transaction (point de synchronisation)
requêtes 1 : copie les données des enregistrements avant modification dans le journal
requêtes 1 : copie les données des enregistrements après modification dans le journal
requêtes 2 : copie les données des enregistrements avant modification dans le journal
requêtes 2 : copie les données des enregistrements après modification dans le journal
écrit dans le journal une étiquette indiquant que la transaction a été un succès ou un échec
répercute les modifications des données dans les tables
écrit dans le journal une étiquette indiquant la fin de la transaction
De cette manière le système est capable en cas de panne survenant au cours dune transaction de revenir dans un état stable et cohérent des données, afin dassurer lintégrité et donc latomicité de la transaction. Pour revenir à cet état stable, le système lit le journal en débutant par la fin, et reprend toutes les transactions qui ont été un succès, sans que la mise à jour physique des données ait été effectuée.
7. Conclusion
Peut-on accéder aux données dune base en saffranchissant des requêtes ?
Un des points négatifs des systèmes C/S est que tous les traitements portant sur les données de la base doivent être, à un moment ou un autre, effectués par des requêtes. En revanche dans les systèmes à base de fichier il est souvent possible daccéder directement aux données en saffranchissant des requêtes, et de procéder à un traitement en utilisant par exemple une lecture séquentielle des enregistrements dune table. En général les SGBD de type fichiers proposent des outils (L4G, composants ) permettant de réaliser ce genre de traitement en ayant à aucun moment recours aux requêtes. Dans ce cas il est souhaitable de bien connaître le format interne de la base et ses particularités [2]. Ce type daccès savère intéressant et très souple dans le cas de base de données de faible volume. En revanche il ne permet pas la mise à jour en une seule requête ou transaction de plusieurs tables Autre avantage : il est indépendant de la qualité du SQL fourni. Dans le cas de « middleware [3] » comme le moteur BDE dInprise (ex Borland) il permet dunifier les traitements quelle que soit la base de données sous-jacente et sa plate-forme. On peut ainsi, théoriquement, changer de SGBD sans avoir à réécrire une seule ligne de code de lapplication Dans le cas des SGBD C/S il est quand même possible deffectuer des traitements locaux dans le langage de programmation en utilisant la technique des « cursor » (curseur) : le curseur est un ordre SQL qui permet de tamponner les données dune table en mémoire et daccéder aux données par le biais de variables pour y effectuer un traitement.
Est-il possible de contourner le mode de verrouillage optimiste, afin de le rendre pessimiste ?
Bien entendu oui. Mais le faire systématiquement serait une hérésie, notamment dans le cas dune base de données dont le volume des transactions et le taux de mise à jour des données serait très important : des blocages intempestifs sy produiraient fréquemment et pourraient même conduire à la paralysie du système tout entier. Cependant réaliser un verrouillage pessimiste est dune grande simplicité : il suffit de créer au sein de la base de donnée une table de sémaphore contenant le nom de lutilisateur, le nom de la table, les références à lenregistrement a verrouiller (par exemple son ROW_ID si le serveur est capable de le fournir). Avant toute mise à jour ou suppression il suffit de consulter la table de sémaphore, et si lenregistrement ny est pas référencé de ly insérer, de procéder à la modification, puis de le supprimer de la table de sémaphore. Néanmoins il faut se prémunir de plusieurs petits problèmes sous-jacents : par exemple comment supprimer les verrous devenus obsolètes ? Cela peut arriver, notamment lorsquun utilisateur a commencé une modification et que son poste client a été victime dune panne matérielle le coupant du réseau
Le SQL est-il un langage normalisé ?
Oui, bien entendu. Il existe une norme de définition du langage SQL (SQL 2 : ISO / ANSI 92). Mais chaque éditeur est libre de se reposer ou non sur la norme. Il en résulte une forte incompatibilité entre les différents éditeurs de SGBD, que lon peut éventuellement contourner soit en se reposant uniquement sur les éléments communs aux principaux éditeurs (très limité), soit en utilisant un middleware normatif qui dans ce cas permettra décrire toutes les requêtes à laide du SQL local et assurera sa traduction dans le SQL spécifique au SGBD. Un des autres avantages de certains middlewares est de proposer deffectuer des requêtes hétérogènes, cest à dire entre différentes bases de données, de différents SGBD, pouvant même tourner sous différentes plates-formes système. Cest en particulier le cas du moteur BDE dInprise (ex Borland).
Quel langage est utilisé pour écrire des procédures stockées et des triggers ?
Malheureusement il nexiste aucun langage commun entre les différents éditeurs. De plus lévolution des SGBDR vers les technologies de lobjet et du web font évoluer de manière importante les structures des langages des différents éditeurs dune version à lautre. Par exemple Oracle porte désormais son fameux langage PL/SQL dans le monde de lobjet et le dote de modules spécialisés (bibliothèques de fonctions) permettant par exemple daccéder aux techniques du web ou de faire du pilotage SIG (Systèmes dInformations Géographiques). La norme SQL 3 tente de résoudre un certain nombre de ces problèmes.
Quel type de machine est nécessaire pour faire fonctionner un SGBDR C/S ?
Il est nécessaire de se munir dun serveur puissant, avec un processeur plutôt spécialisé dans le traitement des données de base (texte et nombre) que le graphique ou le son La quantité de mémoire nécessaire est évidemment bien plus importante que dans le cadre dun SGBD fichier (par exemple sous système dexploitation NT, un SGBDR en C/S nécessite au minimum 128 Mo de RAM même avec un nombre très restreint dutilisateurs). Dans les deux cas il faut avoir des disques à accès très rapide (SCSI UW par exemple) et ne pas hésiter à investir dans un contrôleur RAID éventuellement en « hot plug ».
Voici un tableau qui pourra vous aider dans votre choix de passage de lun à lautre :
Le reste dépend de comment est constituée la base de données. Dans des SGBD de type fichiers intelligemment pensés, comme Paradox, le découpage de la base en de multiples petits fichiers (données - .DB, mémo - .MB, clef - .PX, index secondaires - .Xnn/.Ynn) minimise le trafic réseau. Ce nest pas le cas de SGBD mal pensés comme Access qui ne comporte en tout et pour tout quun seul monstrueux fichier par base de donnée et par conséquent nécessite de véhiculer la totalité du fichier sur le réseau pour chaque requête sur chaque poste client
En particulier les traitements seront grandement facilités si le format des tables repose sur un principe navigationnel, c'est à dire que les enregistrements sont toujours présentés dans le même ordre logique, ce qui est le cas par exemple du format de table Paradox.
Un « middleware » en matière de SGBD est un moteur relationnel (SQL ou non) assurant linterface et le dialogue entre les clients et le serveur. En principe il fournit les services suivants : - intégration dun ou plusieurs protocole de communication (réseau) - standardisation des accès aux données - standardisation du format des données quel que soit le SGBD et la plate-forme sur laquelle tourne le serveur