RAPPORT SUR LE PROJET DE BDA : AGENCE DE VOYAGES

Transcription

RAPPORT SUR LE PROJET DE BDA : AGENCE DE VOYAGES
DESENNE Nicolas
LEGUAY Gaël
ZHU Min
RAPPORT SUR LE PROJET
DE BDA : AGENCE DE VOYAGES
Sujet présenté par : M. Prudence
Page :1/18
Table des matières
Cahier des charges................................................................................................................................3
Besoins fonctionnels........................................................................................................................3
Ensemble de besoins fonctionnels..............................................................................................3
Ensemble de besoins particuliers................................................................................................3
Besoins non fonctionnels.................................................................................................................4
Description des tables...........................................................................................................................5
Diagramme de la base de données principale..................................................................................5
Explication des tables de la base de données principale..................................................................5
Diagramme de la base de données Facturation................................................................................7
Explication des tables de la base de données Facturation...............................................................8
Description des fonctions, procédures et triggers.................................................................................9
Description des fonctions.................................................................................................................9
Description des procédures..............................................................................................................9
Description des triggers.................................................................................................................10
Description des modules développés..................................................................................................12
Client..................................................................................................................................................12
Vendeurs.............................................................................................................................................13
Facture................................................................................................................................................14
Description du générateur de données................................................................................................15
Pourquoi faire un générateur de données?.....................................................................................15
Comment marche-t-il?...................................................................................................................15
En quoi cela va-t-il nous aider?.....................................................................................................15
Justification des choix effectués.........................................................................................................17
Choix des tablespaces....................................................................................................................17
Choix des tables.............................................................................................................................17
Page :2/18
1 Cahier des charges
Décrivons ici l'ensemble des besoins que nous avons identifiés pour notre application. Nous
devons séparer nos différents besoins : besoins fonctionnels et besoins non fonctionnels.
1.1 Besoins fonctionnels
1.1.1 Ensemble de besoins fonctionnels
Nous retrouvons l'ensemble l'ensemble des besoins suivent :
Chercher un circuit. Un client pourra chercher un circuit selon les critères suivants:
le nom, la destination, une fourchette de prix et/ou une durée.
Chercher un hôtel. Un client pourra chercher un hôtel selon les critères suivants: la
ville où se situe l'hôtel, la catégorie, une fourchette de prix et/ou le type de chambre.
La ville où se situe l'hôtel est un critère obligatoire pour la recherche.
Chercher un vol. Un client pourra chercher un vol selon les critères suivants: la ville
de départ et la ville d'arrivée, la date et/ou une fourchette de prix.
Afficher un circuit. Pour chaque circuit, on affiche le nom, le pays, le prix de base,
l'itinéraire, la description.
Afficher un hôtel. Pour chaque hôtel, on affiche une image de cet hôtel, le nom,
l'adresse, la description, les types de chambre proposés, le prix par type de chambre.
Créer un compte client. Un client doit s'inscrire afin de réserver un produit (vol,
hôtel, circuit). Pour l'inscription, on saisit le nom, prénom, l'adresse, le code postal,
la ville, la date de naissance, le titre.
Ajouter un produit. Un client peut ajouter un produit (vol, hôtel, circuit) dans son
panier. Il ne lui est pas obligé de le réserver.
Réserver un produit. Un client peut réserver un produit (vol, hôtel, circuit) qui est
dans son panier.
Édition de la facture. L'employé de l'agence peut éditer les factures des clients. Une
ligne de facturation est liée à un client avec une adresse et un montant par prestation.
1.1.2 Ensemble de besoins particuliers
Nous avons également des besoins particuliers. Voyons ensemble quels sont ces
besoins :
Automatisation :
● Des effacements des données vieilles de plus de 10ans.
● De la génération de facture après paiement d'une réservation.
Page :3/18
1.2 Besoins non fonctionnels
Voyons maintenant l'ensemble de nos besoins non fonctionnels :
Interface: L'interface doit être ergonomique et simple à utiliser.
Pré-requis: Le site web est basé sur une base de données Oracle 10g.
Facturation: La facturation est un modèle à part entière.
Page :4/18
2 Description des tables
Nous allons voir maintenant l'ensemble des tables de nos base de données. Nous allons
expliquer le diagramme entité-relation de chacune de ces bases et ensuite nous allons décrire
les tables qui les composent.
2.1 Diagramme de la base de données principale
Afin de mieux analyser et structurer la base, nous avons d'abord défini ce diagramme
entité- relation. Il représente la base du côté client et répond à la plupart des demandes
fonctionnelles.
2.2 Explication des tables de la base de données principale
Après avoir étudié les besoins fonctionnels, nous avons créé les tables suivantes:
•
CITY
Cette table contient les villes des pays. Chaque ville contient un numéro, un nom et
le nom du pays auquel il appartient. Étant donné qu'il existe peut-être deux villes
ayant le même nom, on décide d'attribuer le numéro comme la clé primaire de cette
table. Il n'existe pas de table représentant un pays dans notre base, car l'attribut pays
n'apparaît que dans la table CITY. C'est la raison pour laquelle nous décidons
d'ignorer la table pays.
Page :5/18
•
HOTEL
Chaque hôtel de la base est identifié par un numéro. Un hôtel appartient à une et une
seule ville.
•
TYPEROOM
Nous avons décidé que chaque hôtel a au moins un type de chambre (chambre d'une
personne, chambre double etc). Et à tout moment, on pourra ajouter un type de
chambre à un hôtel quelconque. C'est la raison pour laquelle on a décidé de créer
cette table.
•
FIGHT
On gère également les vols. Étant donné que le client peut n'acheter dans notre
agence de voyage que les billets d'avion, nous proposons une liste de vols
disponibles selon les critères recherche du client. Tous les jours nous avons des vols
différents et cette table sera modifiée fréquemment. C'est la raison pour laquelle,
malgré que cette table sera consultée assez souvent, nous n'avons pas mis de Index
dans cette table.
•
TYPEFIGHT
Même raisonnement que la table TYPEROOM, pour chaque vol, on propose
plusieurs tarifs différents (tarif adulte, tarif enfant etc). On pourra ajouter pour
chaque vole un nouveau tarif.
•
CIRCUIT
Notre application propose aux clients des circuits. Ces circuits sont composés par
une liste de villes à visiter. Le tarif, le nombre de journées, le nombre de places
disponibles sont des informations propres à un circuit.
•
CITY_HAS_CIRCUIT
Afin de mieux gérer un circuit, on ne stock pas tous les villes du circuit dans cette
table. C'est la raison pour laquelle nous avons créé cette table. Cette table relie un
circuit avec les villes du circuit. Étant donné qu'il y aura beaucoup de recherche sur
cette table, et cette table ne sera pas modifié très fréquemment (juste un ajout d'un
circuit de temps en temps), nous avons décidé de mettre les deux clef primaires en
Index, afin de faciliter et accélérer la vitesse de recherche.
•
RESERVATION
Notre application propose également aux client une réservation. Le client peut
réserver un circuit, un vol, un hôtel (plus précisément une chambre). On veut savoir
également si le client a payé ou non un produit et le vendeur qui lui as vendu ce
produit. Afin de connaître le type de produit que le client a réservé, nous avons créé
trois tables associées: typefight_has_reservation, circuit_has_reservation,
reservation_has_typeroom.
Page :6/18
•
TYPEFIGHT_HAS_RESERVATION
•
Cette table nous permet de connaître les détails d'une réservation concernant à un
vol. Si le client possède une réduction sur cette réservation, le montant de cette
réduction sera indiqué dan l'attribut « offer ». Malgré cettte table sera souvent
consultée, elle n'a pas d'Index, car elle sera modifiée très fréquemment.
CIRCUIT_HAS_RESERVATION
Même raisonnement que la table typefight_has_reservation, cette table nous permet
de savoir tel client a réservé tel circuit et si ce client l'a réglé. Elle contient également
l'attribut « offer » pour la réduction.
•
RESERVATION_HAS_TYPEROOM
Cette table nous permet de connaître tel client a réservé tel hôtel et tel chambre.
•
SELLER
Nous avons besoins d'enregistrer les information d'un vendeur. C'est la raison pour
laquelle nous avons créé cette table qui intervient dans tous les réservations. Cela
nous permet de connaître le travail fait par un vendeur et conclure l'efficacité d'un
vendeur.
•
CUSTOMER
Bien évidemment on a besoin d'une table client qui enregistrer les informations d'un
client. Cette table sera mise à jour une fois tous les six mois. Les clients qui n'ont pas
d'achat ni de réservation depuis six mois seront supprimés de la table. Cela nous
permet de faciliter la gestion de table et de garder une table efficace.
2.3 Diagramme de la base de données Facturation
Nous pouvons voir sur ce diagramme que cette base est très simple puisqu'elle ne
regroupe que l'ensemble des factures qui ont été éditées. Nous avons conçu nos factures
en deux parties (deux tables). La première regroupe les informations sur les clients, le
vendeur, la date d'achat. La seconde table regroupe les lignes de factures qui contiennent
les information sur les produits achetés.
Page :7/18
2.4 Explication des tables de la base de données Facturation
Voici un description de nos deux tables de la base de données Facturation.
•
FACTURE. Cette table contient les informations concernant le client qui a payé la
facture : son nom, son prénom, son ville de résidence, son adresse, son code postal et
son pays. Cette table contient aussi le numéro du vendeur qui a émis la facture.
•
LIGNES. La table lignes contient toutes les lignes de facture existantes. Bien
évidemment, nous pouvons avoir plusieurs lignes pour la même facture. Une ligne
de facture contient la référence du produit qui a été acheté, sa désignation, son prix
unitaire et la quantité achetée. Nous avons également ajouté un champ pour la remise
faite sur le produit.
Page :8/18
3 Description des fonctions, procédures et triggers
Nous allons expliqué dans cette sections les différentes procédures et fonctions que nous
avons créées.
3.1 Description des fonctions
Commençons pour jeter un coup d'oeil à nos fonctions.
●
Fonction createFacture :
Function createFacture (datef in date, lastName in varchar,
firstName in varchar, city in varchar,
address in varchar, postcode in varchar,
country in varchar, seller in integer)
return integer
Pour assurer le bon fonctionnement de notre application et notre base, nous préférons
que l'application utilise une fonction stockée plutôt qu'une requête SQL pour
l'insertion d'un enregistrement dans la table FACTURE. La création d'une facture
concerne uniquement celle des entêtes de la facture, la date, les informations du
client, le numéro du vendeur etc. Elle nous retourne le numéro de la facture créée.
●
Fonction calculFacture :
Function calculFacture (idFacture in INTEGER) return float
Au lieu que ça soit l'application qui calcule le total d'une facture, on préfère stocker
une fonction une fois pour toute. Cette fonction permettant de calculer le montant
total d'une facture, prend un numéro de facture en paramètre et retourne le montant
calculé. Au sein de la fonction, on utilise un curseur LFACTURE représentant les
colonnes unitPrice, quantity et offer de la table LIGNES correspondant à idFacture.
A l'aide d'une boucle WHILE, ce curseur parcourt toutes les lignes de la facture afin
que l'on puisse calculer la somme totale.
3.2 Description des procédures
Voyons maintenant quelles procédures nous avons décidé d'implémenter.
●
Procédure addLine :
Procedure addLine(idFacture in INTEGER,
reff in VARCHAR, designation in varchar,
unitPrice in float, quantity in float,
offer in float)
Cette procédure nous permet d'ajouter une ligne à la facture. Une ligne correspond
généralement à un produit, une ou plusieurs chambres par exemple. Une facture a au
Page :9/18
moins une ligne. Pour appeler cette procédure, on a besoins du numéro de la facture.
C'est la raison pour laquelle la fonction createFacture doit être appelée en première.
Au sein de la procédure, on utilise une variable « maxi » pour calculer la clé « num »
de la table LIGNES. On ne pourra pas utiliser SEQUENCE, car « num » incrémente
de façon indépendante du nombre d'enregistrement de la table. Il dépend au
idFacture.
●
Procédure removFacture :
Procedure removFacture
Comme on peut le voir, cette procédure ne demande aucun paramètre. La
suppression de factures est déclenché par un responsable de service facturation. On
ne supprime que des factures ayant plus que dix ans dans la base. Cette procédures
cherche toutes ces factures et les supprime de façon automatique. S'il n'y a aucune
facture correspond à cette condition, un message sera affiché.
3.3 Description des triggers
Un trigger permet d'automatiser certains traitements assurant la cohérence et l'intégrité
de la base de données. Une séquence permet de générer une série de nombres.
Généralement une séquence est utilisée pour générer les clés primaires d'une table. Nous
avons combiné ces deux objets de Oracle afin d'obtenir une meilleure gestion des clés
primaires.
Nous avons créé plusieurs triggers et séquences dans les deux parties: vendeur et facture.
La plupart des triggers et séquences ont le même objectif, nous n'allons pas tous citer
mais sélectionner ceux ayant des fonctionnalités différentes.
1. TRIGGER trg_idFacture BEFORE INSERT ON Facture
Avant d'insérer une ligne dans la table FACTURE, ce trigger ajoute une clé primaire à
cet enregistrement à l'aide de la séquence stockée seq_facture.
SELECT seq_facture.nextval
INTO :NEW.idFacture
Grâce à ce trigger, nous n'avons plus besoins de spécifier la clé primaire « idfacture ».
2. TRIGGER trg_removFacture AFTER DELETE on Facture
Lorsque l'on supprime une facture, on doit supprimer toutes les lignes de cette facture.
C'est la raison pour laquelle nous avons créé ce trigger. Voici l'instruction pour
supprimer les lignes correspondant à cette facture:
DELETE FROM Lignes where Facture_idFacture = :old.idFacture;
Page :10/18
3. CREATE SEQUENCE seq_facture
START WITH 1
MINVALUE 1
NOCYCLE
NOCACHE
ORDER;
Cette séquence est utilisée dans le trigger trg_idFacture permettant de commencer à
numéroter par un et incrémenter un chaque fois.
Page :11/18
4 Description des modules développés
Nous allons décrire dans cette partie, les différents modules que nous avons développés pour
nos clients, vendeurs, et facture.
4.1 Client
Ce module Client permet de rechercher un client, afficher ses informations, insérer et
sauvegarder un client et de supprimer un client.
Page :12/18
Le client doit pouvoir visualiser des circuits de la base. Cette interface répond justement au
besoin. Avec les flèches, le client pourra parcourir les circuits.
4.2 Vendeurs
Page :13/18
Nous avons implémenté un formulaire qui permet de voir toutes, les réservations, et de les
valider.
L'insertion ne fonctionne pas pour l'instant et donc l'ajout dans les factures non plus.
4.3 Facture
Une facture est éditée de façon automatique. Lorsque le client valide (paye) ses réservations,
une facture sera livrée. Cette interface montre l'édition d'une facture. Côté gauche de
l'interface contient les information du client et du vendeur. Celui à droite montre les produits
que le clients a achetés avec le numéro qui correspond l'attribut « num » de la table Lignes.
Page :14/18
5 Description du générateur de données
Nous allons aborder dans cette partie toutes les questions importantes quant à notre
générateur de données.
5.1 Pourquoi faire un générateur de données?
L'élaboration d'un générateur de données est essentielle dans le cadre du test d'une base
de données. En effet, cela nous permet de pouvoir tester nos procédures, nos fonctions et
les tailles de nos tables. Nous avons fait des prévisions sur la taille de nos tablespaces et
tables. Le fait de peupler notre base de données en adoptant le pire des cas permet de
vérifier que la taille que nous avons choisie est adéquate.
5.2 Comment marche-t-il?
Par soucis de simplicité, ce générateur de données renvoie des données fictives.
Cependant ces données respectent l'intégrité de la base de données. En effet, prenons
l'exemple de nos tables facture et lignes : notre générateur va nous générer un certain
nombre de factures puis un certains nombre de lignes. Ces lignes sont toutes
« rattachées » à une facture existante (la clé étrangère correspondant à une facture est
bien un clé d'une facture existante).
Notre générateur de données (DataGen.java) renvoie des fichiers .sql pour chaque table à
peupler. L'utilisation de ce dernier est assez simple. Il suffit de spécifier au début du
programme le nombre de ligne de chaque table que l'on souhaite créer et ensuite
d'exécuter le programme. Tous les scripts sql sont générés et il nous reste plus qu'à les
exécuter pour peupler notre base. Bien entendu, il y a deux écoles pour peupler un base
de données :
- On désactive toutes les contraintes sur les tables et on exécute les scripts.
- On exécute les scripts en respectant un certain ordre pour ne pas violer les contraintes
5.3 En quoi cela va-t-il nous aider?
Tout d'abord, nous allons voir comment les données générées vont nous aider à
déterminer la taille des tables. Prenons l'exemple de notre table facture :
Nous avons 100 personnes par départ de circuit et 4 départs par mois, ce qui nous donne
400 factures par mois. Nous devons garder un historique des factures sur 10 ans alors
nous devrons stocker 10*12*400 = 48000 factures pour nos circuits.
Supposons maintenant que les clients choisissent aussi des hôtels et des vols seul. Nous
considérons que les clients effectuent moins souvent des vols et réservations de
chambres que des circuits. Nous supposons cela mais ce n'est pas précisé dans le sujet du
projet. Notons alors que que nous stockons 30 000 factures pour la réservation de
chambres et autant pour la réservation de billet d'avion. Ce qui nous fait au total : 48 000
+ 30 000 + 30 000 = 108 000 factures à stocker en dix ans. Avec notre générateur nous
allons donc générer 108 000 lignes dans la table facture en les remplissant au maximum
( ex : un varchar(20) contiendra toujours les 20 caractères). Nous pouvons donc vérifier
la taille que cela occupe sur la base de données grâce à la commande suivante :
Page :15/18
SELECT segment_name "Table", bytes/1024 "Taille en Ko", blocks "Nb Blocks"
FROM user_segments
WHERE segment_name = 'FACTURE';
Le résultat renvoyé pour une table Facture avec 108 000 lignes est :
36864 Ko et 4608 Blocks.
Précisons ici que cette taille n'est pas la taille réelle utilisée par la table mais la taille
allouée par oracle. En effet, tous les blocks réservés par Oracle pour notre table ne sont
pas plein.
Page :16/18
6 Justification des choix effectués
Nous allons maintenant expliquer les différents choix que nous avons fait sur nos
tablespaces et sur nos tables. Nous allons abordé le sujet du dimensionnement et de
paramètres de stockage.
6.1 Choix des tablespaces
Ayant déjà une petite expérience sur les bases de données nous avons commencé par
créer des tablespaces de taille moyenne afin d'y créer nos tables. Nous avons d'abord
choisi une taille de 512Mo afin de voir large.
Pour affiner ce choix, nous avons utilisé notre générateur de données pour se faire une
idée réelle de la place occupée par l'ensemble de nos tables dans chaque tablespace.
Pour cela nous avons appliqué la méthode expliquée dans la section 5.3 En quoi cela vat-il nous aider?
Après avoir appliqué cette méthode sur toutes les tables, nous avons donc fixé la taille de
nos tablespaces à environ 45 Mo pour le tablespace TableSeller et environ 70 Mo pour le
tablespace TableFacture.
Pour les calculs nous avons supposé les données suivantes : 30 vendeurs, 15000 clients,
108 000 factures, 324 000 lignes de facture, 120 000 réservations, 50 circuits, 100 vols,
300 villes, 300 hôtels 3 types de billet par vol, 3 types de chambre par hôtel.
Pour ce qui est des paramètres de stockage de ces tablespaces, nous avons sélectionner
l'option management automatique.
6.2 Choix des tables
Nous avons garder les options par défaut pour la création des tables. Nous avons juste
préciser de créer les tables dans les tablespaces qui ont été créés à cet effet. Nous aurions
tout à fait pu fixer la taille initiale à la taille que nous calculé avec nos données réelles
mais nous avons gardé la gestion automatique. Ainsi, au début la taille de la table est
minime et augmente au fur et à mesure que l'on entre des données dans celle-ci. Oracle
augmente la taille réservée à une table 8 blocks par 8 blocks. La taille des blocks étant de
8Ko la taille augmente donc de 64Ko à chaque fois.
Page :17/18
CONCLUSION
Ce projet sur Oracle nous a permis de mettre en pratique nos connaissances concernant le structure
et les caractéristiques de la base Oracle, notamment PLSQL qui est un langage procédural créé par
Oracle.
Nous avons pu utiliser les différents objets d'Oracle au sein de notre projet. Par exemple, Procédure,
Fonction, trigger; séquence et Index.
Nous avons choisi de sécuriser et de bien gérer notre base Oracle. C'est la raison pour laquelle nous
n'avons pas eu assez de temps pour raffiner les interfaces de l'application.
Page :18/18