P RO J E T 1 : BA S E D E D O N N É E S R E PA RT I E S G ESTION Elèves : David Bréchet Frédéric Jacot Charles Secrétan D ’ UNE BANQUE DONNÉES DU PROJET SSC - Bases de Données II Laboratoire de Bases de Données BD réparties 1 Projet 1: Bases de données réparties Un dossier est à rendre le 11/01/00 lors de la soutenance. Le but de ce premier projet est de développer une application simulant le fonctionnement d’un système de gestion de bases de données réparties (SGBDR). Il s’agit de reprendre l’application vue en cours (système bancaire) de l’étoffer, et de considérer la répartition sur trois sites (SSCX1, SSCX2 et SSCX3). Le travail fait intervenir les étapes suivantes: 1) Définir le modèle conceptuel (EA) Définir deux vues externes: 1. les clients et 2. les gestionnaires des comptes 2) Définir le modèle logique relationnel. Attention à ne pas oublier la définition des vues. 3) Identifier et écrire en SQL les requêtes les plus fréquentes et les plus critiques (en terme de performance). 4) Définir le schéma de fragmentation en fonction de ces requêtes 5) Définir le schéma de localisation (justifiez les répliques en fonction des problèmes d’accessibilité et de performance) 6) Répartir les requêtes identifiées au 3) en deux sous-groupes : Globales (faisant intervenir plusieurs sites) Locales (faisant intervenir un site local) Quelle est l’incidence des vues sur les schémas de fragmentation et d’allocation? Il est à noter que l’application doit permettre la formulation des 4 commandes SQL suivantes: SELECT, INSERT, UPDATE et DELETE (bien sûr de façon transparente à l’utilisateur) et doit mettre en œuvre le protocole de validation de transactions à deux phases. 2 B A S E D E D O N N É E S R E PA R T I E S G ESTION D ’ UNE BANQUE . INTRODUCTION Le but de ce projet est de développer une application simulant le fonctionnement d’un système de gestion bancaire. Il met en œuvre un système de gestion de base de données réparties (SGBDR) et pour le rendre convivial, nous utilisons la méthode « embeded SQL » qui consiste à intégrer des commandes SQL dans un environnement de programmation C. La base de donnée est répartie sur 3 sites, qui sont la centrale et deux agences A et B. Pour nous la centrale se trouve à Genève et les agences sont à Lausanne et à Neuchâtel. La centrale est un site, qui n’est accessible que par le gestionnaire. Il peut interroger un certain type de compte (courant, étudiant…) sur un certain type d’opération (retrait ou versement). Il peut aussi gérer un employé, c’est à dire qu’il ajoute ou supprime un employé de la base de donnée. Dans les agences, les employés peuvent faire des versements ou des retraits sur un compte, et l’interroger, ils peuvent aussi changer un compte d’agence. 3 MODÈLE CONCEPTUEL DE LA BASE DE DONNÉE LE SCHEMA ENTITE ASSOCIATION No_emp Nom_em Prénom Employé No_op Type_op Opération travaille Date_op Type_compte No_compte No_agence Compte Est dans Somme Agence Nom_agence Addr_agence possède No_client Nom Client Age Adresse Prénom Ce schéma entité association va nous permettre de déduire le schéma relationnel de la base de donnée. 4 LE SCHÉMA RELATIONNEL Grâce a ce schéma relationnel on va pouvoir visualiser les tables nécessaires à la base de donnée. Ces tables serons ensuite fragmentées sur les différents sites. Domaines Dch20 : chaînes de caractères de longueur inférieure à 20. Dch30 : chaînes de caractères de longueur inférieure à 30. Dnum : entier. Relation : Client Attributs :NoClient : Dnum sans nul Nom : Dch20 sans nul Prenom : Dch20 sans nul Adresse : Dch30 sans nul Age : Dnum sans nul Identifiant : (NoClient) Définition : toute personne ayant un compte dans la banque CLIENT NoClient 213 456 Nom Bouana Legros Prenom Doudou Hervé Age 23 55 Adresse Ch. Soleil 13 1240 Bled R. centrale 33 1512 Ville Relation : Compte Attributs : NoClient :Dnum sans nul NoCompte :Dnum sans nul TypeCompte : Dnum sans nul Somme : Dnum sans nul NoAgence : Dnum sans nul Identifiant : (NoCompte + NoAgence) Identifiant externe: NoAgence référence une Agence NoClient référence un Client Définition : Compte du client dans la banque COMPTE NoClient 213 456 NoCompte 1234 5678 TypeCompte courant étudiant 5 Somme 12000 45000 NoAgence 1 2 Relation : Agence Attributs :NoAgence : Dnum sans nul Nom : Dch20 sans nul Adresse : Dch30 sans nul Identifiant : (NoAgence) Définition : Succursale de la banque AGENCE NoAgence 1 2 Nom Lausanne Neuchatel Adresse Av. de la gare 22 1230 Bled Av. de Genève 33 1530 Ville Relation : Employé Attributs :NoEmp : Dnum sans nul Nom_Emp : Dch20 sans nul Prenom_Emp : Dch20 sans nul NoAgence : Dnum sans nul Identifiant : (NoEmp + NoAgence) Identifiant externe: NoAgence référence une agence Définition : Employé travaillant dans une agence EMPLOYE NoEmp 567 786 Nom_Emp Ducon Lepetit Prenom_Emp Jules André NoAgence 1 2 Relation : Opération Attributs :NoOp : Dnum sans nul NoEmp : Dnum sans nul NoCompte : Dnum sans nul Montant : Dnum sans nul TypeOp: Dch20 sans nul dDate : Dch20 sans nul Identifiant : (NoOp) Identifiant externe: NoCompte référence un compte NoEmp référence un Employé Définition : Opération effectuée par un employé sur un compte 6 OPERATION NoCompte NoOp 1234 7890 5678 7891 Montant 1000 7000 TypeOp retrait versement dDate 23/01/99 1034 25/01/99 1430 NoEmp 567 567 REQUETES FREQUENTES Nous avons essayé de séparer les différentes requêtes utilisées dans le cadre du fonctionnement d’une banque et nous n’avons considérer que les plus fréquentes et les plus critiques pour la base de donnée. Voici donc les requêtes : VERSEMENT ET RETRAIT Lors d’un versement ou d’un retrait, l’employé a besoin du numéro de compte du client et de l’agence dans lequel le compte se trouve. Lors de l’opération, l’attribut « somme » ainsi que la table « opération » sont mis à jour. Issu de la table Opération NoOp NoEmp NoCompte Montant TypeOp Issu de la table Compte NoCompte Somme NoAgence Les requêtes en SQL pour un versement sont : NoAgence FROM Compte WHERE NoCompte = xxx if NOT FOUND { maj_copie_compte(); maj_copie_operation(NoAgence); } else { Update(Compte.somme); Update(Operation.*); } SELECT 7 dDate Pour un retrait c’est la même requête avec une opération différente retrait au lieu de versement. INTERROGATION Lorsque le client désire consulter les dernières opérations effectuées sur son compte, l’employé a besoin du numéro de compte et de l’agence dans lequel le compte se trouve. L’attribut « somme » indique la solde du compte au moment de la requête. Avec l’attribut « Montant », il peut déterminer la solde du compte au moment de l’opération. Les autres attributs de la table « Opération » n’intéressent que le gestionnaire. Table I1 NoCompte Montant TypeOp dDate Table V R-I2 NoCompte Somme NoAgence Les requêtes en SQL sont : NoAgence FROM Compte WHERE NoCompte = input in no_cpte if NOT FOUND { SELECT NoCompte, Somme, NoAgence FROM Compte_copie WHERE NoCompte = no_cpte SELECT Montant, TypeOp, dDate FROM Operation_copie WHERE NoCompte = no_cpte } else { SELECT NoCompte, Somme, NoAgence FROM Compte_copie WHERE NoCompte = no_cpte SELECT Montant, TypeOp, dDate SELECT 8 Operation WHERE NoCompte = no_cpte FROM } INTERROGATION PAR LE GESTIONNAIRE Le Gestionnaire analyse le type d’opération effectuée sur un type de compte. Ce type de compte est de l’agence Lausanne et Neuchâtel. Pour ce faire, il a besoin des informations suivantes issues des tables « opération » et « compte ». Issu de la table opération No_op No_emp No_compte Montant Type_op Date_op Issu de la table compte No_compte Somme Type_compte No_agence Voici la requête en SQL : * FROM TableOp WHERE TypeOp=’:type_op’ AND NoCompte IN (SELECT NoCompte, FROM Compte WHERE TypeCompte = ‘:type_cpte’); SELECT GÉRER LES EMPLOYÉS PAR LE GESTIONNAIRE Le gestionnaire gère les employé, il ajoute ou supprime un employé. Pour ce faire, il a besoin des informations suivantes de la table « employé ». Issu de la table employé NoEmp Nom_Emp Prenom_Emp 9 NoAgence Voici les requêtes en SQL : Supprimer un employé : TableEmp WHERE NoEmp =:noemp; DELETE FROM Ajouter un employé : TableEmp, VALUES (:noemp, :Nom_Emp, :Prenom_Emp, :NoAgeance); INSERT INTO SCHEMA DE FRAGMENTATION Voici le schéma de fragmentation des tables en fonction des requêtes effectuées sur les attributs. Remarquons que la localisation des fragments a été faite par rapport aux poids des requêtes. Pour faire la répartition sur les trois sites, nous avons décidé d’avoir une centrale et deux agences et tout notre travail découle de cette répartition. Table Client NoClient 1 2 3 Nom Jacot Secretan Brechet Prenom Frederic Charles David Somme 1000 2000 3000 NoAgence 0 1 1 Age 23 56 24 Adresse Rue a 1 Rue b 2 Rue c 3 Table Compte NoCompte 10 11 12 TypeCompte Etudiant Epargne Etudiant NoClient 1 2 3 Table Opération NoOp NoEmp 20 21 22 31 30 32 NoCompte 10 11 12 Montant TypeOp dDate 100 200 300 Versement Virement Retrait 12/05/99-… 13/06/99-… 18/11/99-… 10 Table Agence NoAgence Nom Adresse 0 Genève Rue du cucu 3 1 Lausanne Rue des pins 1 2 Neuchâtel Rue de la gare 3 Table Employé NoEmp 30 31 32 Nom_Emp Dupond Smith Ducommun Prenom_Emp Jean John Georges NoAgence 0 1 1 Localisation Données relatives aux client / compte agence A Données relatives aux client / compte agence B Versement, retrait, interrogation et gestionnaire / compte agence A Versement, retrait, interrogation et gestionnaire / compte agence B Gestionnaire / compte agence A Gestionnaire / compte agence B Versement, retrait et gestionnaire / opération agence A Versement, retrait et gestionnaire / opération agence B Versement, retrait, interrogation et gestionnaire / opération agence A Versement, retrait, interrogation et gestionnaire / opération agence B Données relatives à l’employé / agence A Données relatives à l’employé / agence B Données générales original A B A B Centrale Centrale A B A B A B Centrale copie B A B A A B Centrale Centrale Centrale Centrale Centrale Centrale C’est avec ce schéma de fragmentation que nous avons fait le schéma d’allocation des fragments. Cela a été fait en regardant quelles étaient les requêtes critiques et celles qui étaient le plus fréquemment utilisée. C’est aussi par cette méthode que nous avons placé les copies des fragments aux sites que nous jugions adéquat. Dans l’agence A, les fragments des tables Compte et Client sont copiés dans l’Agence B. Dans l’agence B ces fragments sont copié dans l’agence A. Cela permet d’avoir toutes les informations nécessaires à disposition en local afin de minimiser le temps nécessaire pour les requêtes. Le fragment de la table opération est copié dans la centrale car c’est le gestionnaire qui en à le plus besoin pour faire ses requêtes. En plus la copie du fragment de la table Compte qui se trouve à la centrale 11 SCHÉMA D’ALLOCATION Voici la localisations sur les différents sites des différents fragments et de leur copie tels qu’ils ont été implémenté dans l’application. CENTRALE : Frag_Centr_Compte NoCompte TypeCompte Ageances NoAgeance Nom Adresse FragA_TableEmp_CP Nom_Emp NoEmp Prenom_Emp NoAgeance FragB_TableEmp_CP Nom_Emp NoEmp Prenom_Emp NoAgeance FragA_TableOp_CP NoEmp NoOp NoCompte Montant TypeOp Date FragB_TableOp_CP NoEmp NoOp NoCompte Montant TypeOp Date AGENCE A : FragA_Compte NoCompte NoClient NoAgeance Somme FragA_Client Nom char NoClient Prenom Adresse Age FragA_TableOp NoEmp NoOp NoCompte Montant TypeOp FragB_Client_CP Nom NoClient Prenom Adresse Age 12 Date FragB_Compte_CP NoCompte NoClient NoAgeance Somme FragC_Compte_CP NoCompte TypeCompte FragA_TableEmp Nom_Emp NoEmp Prenom_Emp NoAgeance AGENCE B : FragB_Compte NoCompte NoClient NoAgeance Somme FragB_Client NoClient Nom char Prenom Adresse Age FragB_TableOp NoEmp NoOp NoCompte Montant TypeOp FragA_Client_CP Nom NoClient Prenom Adresse Age FragA_Compte_CP NoCompte NoClient NoAgeance Somme FragC_Compte_CP NoCompte TypeCompte FragB_TableEmp Nom_Emp NoEmp Prenom_Emp NoAgeance 13 Date REALISATION DE LA BASE DE DONNÉE STRATÉGIE UTILISEE Nous avions trois sites pour faire notre banque. Nous avons donc fait deux agences et une centrale. C’est sur ces sites que sont situés les différents fragments de la base de données. Tous les fragments sont dupliqué et mis sur un autre site afin de pouvoir travailler même si un site est en panne. Chaque copie est utilisable sur le site où elle se trouve. Cela permet de gagner du temps lorsque des requêtes utilisent les fragments originaux qui sont localisés sur d’autres sites. Pour toute requête qui fait une mise à jour sur un autre site, il faut d’abord vérifier que les éléments de la requêtes sur le sites soient correctes avant de les envoyer sur le site voulu, cela s’appelle le « commit à deux phase ». Nous avons fait trois applications différentes pour faire cette base de donnée répartie, l’initialisation, la centrale et l’agence. les applications sont implémentées en C avec des commandes SQL dans le code. Nous utilisons Oracle comme interface entre la base de donnée et le langage C. La première application sert à initialiser la base de donnée et à la peupler afin d’avoir un minimum de données pour faire nos requêtes. La deuxième application est la centrale. Elle permet au gestionnaire de faire son travail de vérification des comptes. Il interroge un type de compte donné et peut y voir l’opération de versement ou de retrait, effectuée. Il peut gérer les employés, c’est à dire qu’il peut ajouter et enlever un employé de la base de donnée en vérifiant que cet employé existe. La troisième application est l’agence. Elle fait toutes les requêtes nécessaire à la gestion des clients et des comptes de la banque. L’employé peut ouvrir ou fermer un compte, interroger, faire des versement et des retraits sur un compte. Il peut aussi modifier des données relatives au client. Si le client change d’adresse, il est alors transféré sur l’autre agence ainsi que son ou ses comptes. Un journal se trouve sur chaque site et est mis à jour à chaque fois qu’une requête SQL modifie un fragment de table. Pour chaque requête impliquant une mise à jour, nous vérifions à chaque étape qu’il n’y a pas d’erreur générée par la requête. Arrivé à la fin de celle ci, on essaie d’écrire dans le journal, si on y arrive, on fait le « commit », sinon on annule tout. 14 DESCRIPTION DE L’APPLICATION CENTRALE Une fois le mot de passe du gestionnaire validé, les connexions avec les différents sites sont établies. Un menu propose au gestionnaire différents choix : interroger un type de compte , gérer un employé, soit quitter l’application. Pour gérer un employé, le gestionnaire à le choix d’ajouter ou de supprimer un employé. Pour l’ajout d’un employé dans l’agence A, on prend les données nécessaire, on teste si le numéro d’employé existe dans une des deux agences, si non mise à jour du fragment FragA_TableEmp sur le site A, ainsi que sa copie FragA_TableEmp_CP sur le site Centrale. Ecriture sur les journaux de l’agence A et de la Centrale, si pas d’erreur, validation des mise à jour par un commit. Supprimer un employé, on demande le numéro d’employé, on recherche le numéro si le numéro existe et on supprime l’entrée correspondante dans le fragment FragA_TableEmp si l’employé travail à l’agence A, ainsi que l’entrée dans la copie FragA_TableEmp_CP, après l’écriture dans les journaux correspondants on valide la suppression. Pour interroger un compte qui se trouve dans l’agence A, on demande le type de compte et la transaction (versement ou retrait) et on interroge le fragment FragA_TableOP_CP avec le type d’opération et le type de transaction. Ce fragment se trouve sur le site de la central ce qui permet de rester en local et de gagner du temps. Pour interroger la base de donnée, on utilise un tampon qui prend les données requises et les transmet à l’application qui les affiches. On ne peut voir que les transactions sur un type de compte et non sur un compte donné. Une fois l’opération faite, retour au choix initial. AGENCE Une fois le mot de passe de l’employé validé, les connexions avec les différents sites sont établies. Un menu propose à l’employé différents choix : versement, retrait, interrogation d’un compte, soit changement d’adresse d’un client Avant chaque opération, on vérifie l’existence et la localisation du compte. Pour faire un versement-retrait, suivant sa localisation, par exemple à l’agence A, on travail en local sur le fragment FragA_Compte ou sur FragB_Compte_CP. Pour interroger un compte on fait une simple requête. Pour changer d’adresse on prend le compte concerné, on le déplace. Les éléments de la table opération qui concerne le compte à déplacé et les données du client sont aussi déplacés. Une fois les éléments déplacés, on les efface des tables 15 d’origines. Tout cela nécessite de faire des mises à jour dans les tables, donc on ecrit dans les différents journaux Une fois connecté choix de l’opération). Puis demande du numéro de compte ou l’opération doit avoir lieu. Vérification de l’endroit où se trouve le compte si le compte est en local, on travail sur le fragment même, sinon travail sur la copie du fragment, ensuite l’opération voulue est effectuée. Pour l’interrogation, requête SQL par un tampon à la base de données pour ressortir les informations voulues. Pour le versement ou le retrait, demande du montant et requête de mise a jour des tables opérations et compte. Ces mises à jour entraînent une écriture dans les différents journaux. Une fois ces écritures réussies, il y a validation des mises à jour par un commit. Pour le changement d’adresse, on demande la nouvelle adresse et on met à jour les fragments concernés. Si le compte change d’agence, les données du client, des opérations et du compte, qui appartiennent au compte, sont aussi transférées. Les mises à jour implique d’ajouter des données dans certains fragment et de les enlever dans d’autres, toutes ces transactions sont reportées dans les journaux, si toutes les écritures sont effectuées correctement, il y a alors validation des mises à jour. DESCRIPTION DES FONCTIONS AGENCE : void connexion(char *u) {Introduction et vérification du login et du mot de passe ; connexion au site u du SGBDR, avec permissions d’écriture et de lecture ;} void deconnexion() {Déconnexion des différents sites ; } int input() {Introduction du numéro de compte ; Vérification de la localisation du compte ( location_check(compte); Si ‘compteur’ =0, Teste les valeurs de ‘rvi’, et suivant la valeur, aller dans interrogation(compte) ou retrait_versement(compte) ou location_change(compte) return 1; } int JournalC(char texte[]) {teste si ouverture du journal possible ; si oui, écriture de la date et du texte dans le journal ; 16 fermeture du journal ; } même chose pour int JournalA(char texte[]){ int JournalB(char texte[]){ int location_check(int compte) {Interrogation des éléments de la table FragA_Compte, où NoCompte = :compte et mise des éléments dans la structure inter_cp; teste si erreur, cela veut dire que le compte n’est pas dans FragA_Compte ; alors Interrogation des éléments de la table FragB_Compte_CP, où NoCompte = :compte et mise des éléments dans la structure inter_cp2 ; si erreur, ce compte n’existe pas ; location =1 ; interrogation des éléments de la table FragB_Client_CP, où NoClient =:inter_cp2.no_client et mise dans la structure client; affichage des éléments de client. Sinon si pas d’erreur, cela veut dire que le compte est dans FragA_Compte ; location =0 ; interrogation des éléments de la table FragA_Client, où NoClient =:inter_cp2.no_client et mise dans la structure client; affichage des éléments de client. } int interrogation(int compte) {teste si location =0 alors affichage que le compte est sur A ; exécution sur ssc8a ; déclaration d’un tampon pour interrogation de typeop et de dDate de la table FragA_TableOp, où NoCompte = :compte et mise dans la structure inter _op ; ouverture du tampon ; tant qu’il n’y a pas d’erreur recherche des éléments dans le tampon; fermeture du tampon ; affichage du nb d’opération qui est le nb de tuple dans le tampon ; si le nb de tuple =0 alors compte inxistant ; input() ; sortie de la fonction ; ouverture du tampon tant qu’il y a des tuples recherche des éléments dans le tampon et mise dans la structure inter_op ; affichage des éléments sortis du tampon , le montant, le type d’op, la date de l’Op; fermeture du tampon affichage de la somme ducompte ; sinon affichage que le compte est sur B ; exécution sur ssc8b ; déclaration d’un tampon pour interrogation de typeop et de dDate de la table FragB_TableOp, 17 où NoCompte = :compte et mise dans la structure inter _op ; ouverture du tampon ; tant qu’il n’y a pas d’erreur recherche des éléments dans le tampon; fermeture du tampon ; affichage du nb d’opération qui est le nb de tuple dans le tampon ; si le nb de tuple =0 alors compte inexistant ; input() ; sortie de la fonction ; ouverture du tampon tant qu’il y a des tuples recherche des éléments dans le tampon et mise dans la structure inter_op ; affichage des éléments sortis du tampon , le montant, le type d’op, la date de l’Op; fermeture du tampon affichage de la somme du compte ; compteur=1; } PROBLEMES RENCONTRÉ Difficulté à la compilation par le moteur d’oracle. AMELIORATIONS POSSIBLE CONCLUSION Ce projet nous a permis de nous familiariser avec les bases de données répartie, ainsi que de plonger des requêtes SQL dans un langage comme le C. Ce projet nous a pris énormément de temps pour implémenter les applications. Le fait que le compilateur d’Oracle ne fonctionne pas correctement a engendrer beaucoup de temps perdu. ANNEXES Listing des applications. 18