MODELISATION DES CROISIERES POUR LES AGENCES Groupe 2: CORBERY Evariste (SI) HEINRICHS Alexandre (SI) PANNATIER Grégoire (HEC) IQUISE Victor (Science)
1. Introduction objectif description sources interrogations 2. Prédicats 3. Domaines 4. Table universelle 5. Table fractionnée 6. Graphe des relations 7. Six questions d algèbre relationnel 8. Six questions SQL 9. Masque de saisie 10. Explications du masque de saisie TABLE DES MATIERES 11. Exemple d'utilisation du masque de saisie 12. Create table avec SQLPLUS 13. Exemples d'insert sur SQLPLUS 14. Six questions SQL sur SQLPLUS 15. Create view sur SQLPLUS 15. Conclusion A. Heinrichs & E. Corbery 1
1. Introduction Objectif: KUANI est une centrale de voyage. Elle est membre de la fédération Suisse des agences de voyage. Elle propose différentes catégories de voyages, chacun décrit dans une brochure. Par exemple: île Maurice, Seychelles, Afrique australe Caraïbes Mexique, Amérique du sud Great USA La Floride Arabie Croisières Séjours linguistiques etc... Nous avons décidé de modéliser son catalogue de croisière, qui est constitué d un catalogue des différentes croisières et d un cahier des prix. Description: Nous allons modéliser toutes les informations contenues dans leur catalogue pour en créer une base de donnée. Ainsi les agences de voyages affiliées à Kuani pourront interroger le serveur des croisières Kuani pour donner des informations à leurs clients ainsi qu effectuer des réservations. Genève Lausanne Bâle Lucerne Serveur Kuoni Sion Fribourg Berne Zurich schéma1 - Représentation client-serveur A. Heinrichs & E. Corbery 2
Nous nous situons donc à la centrale Kuani. Nos clients sont les agences affiliées à la centrale Kuani. De ce fait, ces agences auront un accès plus rapide aux informations et pourront connaître en «temps réel» l état des réservations des différentes croisières. Cette base de donnée permet aussi de faciliter les corrections et la mise à jour des différents constituants. Sources: Nous avons les documents suivants: Kuoni Croisières: novembre 1994 - décembre 1995, contenant le descriptif de 119 voyages différents Un cahier de prix pour la même période, contenant des propositions de voyage d acheminement, des prix, des plans de bateau et des conditions de voyage et de contrat. Interrogations: Méthode pour indiquer aux agences qu une cabine est réservée. Quel sera le degré d intégrité de cette base de donnée? Quel sera la fréquence de consultation de la base de donnée? Quel sera la facilité pour mettre à jour la base de donnée? Quel est la capacité d un bateau? A. Heinrichs & E. Corbery 3
2. Les Prédicats Bateau (NomBateau, Compagnie, Classe) Prédicat : " bateau (nb, cie, cl). Le bateau appartenant à la compagnie cie a un nom nb et une classe cl. " Cabine (NoCabine, CatégorieCabine, NomBateau, Pont, Situation, NombreLit, Confort) Prédicat : " cabine (nc, catc nb, p, s, l, c). Une cabine se trouve sur le pont p d un bateau qui a un nom nb. Elle a une situation s, donnant sur l extérieur ou l intérieur du bateau, est identifié par un numéro nc et a une catégorie catc. Les cabines sont caractérisées par le nombre de litsl et un confort c. " Voyage (NoVoyage, NomBateau, Région, NombreJour, Remarques) Prédicat : " voyage (nv, nb, r, j, rem). Un voyage a un numéro nv, se déroule dans une région r et dure un nombre de jours j sur un bateau portant un nom nb. Certains voyages seront étayés de remarques r. " Variante (NoVariante, NoVoyage, DateDépart, DateArrivée) Prédicat : " variante (nv, nvar, dd, da). Chaque voyage nv a une variante nvar, commence à une date dd et fini à une date da. " Programme (NoProgramme, LieuDépart, LieuArrivée, Remarques) Prédicat : " programme (np, ld, la, r, nv). Chaque voyage nv a un programme np, fait état d un lieu de départ ld, d un lieu d arrivée la et est completé de certaines remarques r. " Escales (NoProgramme, NombreEscales, Villes, Observations) Prédicat : " escales (np, ne, v, o). Chaque programme np a un certain nombre d escales ne passant par des villes v. Les diverses curiosités des escales sont répertoriées dans les observations o. " Saison (NoVoyage, NoVariante, Saison, Prix) Prédicat : " saison (nv, nvar, s, pi, ps). Chaque voyage nv avec le numéro de variante nvar a des fourchettes de prix, comprises entre pi et ps, différentes suivant les saisons s. " A. Heinrichs & E. Corbery 4
Réservations (NoCabine, NoVariante, NoAgence, Réservé) Prédicat : " réservations (nc, nvar, na, r). Les agences identifiées par leur numéro na, ont la possibilité de réservé r (oui/non) une cabine nc par rapport à une variante nvar de voyage. " Agence (NoAgences, nom, ville, adresse) Prédicat : " agences (na, n, v, a). Les agences ont un numéro na, un nom n et ont une adresse a dans une ville v. " 3. Les domaines nom_bateau texte char(20) classe entier [1..5] number(1) cie texte char(20) no_cabine texte char(8) cat_cabine entier[1..3] number(3) pont texte char(15) situation booléen char(1) nb_lit entier[1..6] number(1) confort texte char(12) no_voyage texte char(2) région texte char(20) nb_jours entier[1..999] number(3) rem1 texte char(200) rem2 texte char(200) date-dép date date date_arr date date no_variante texte char(6) lieu_dep texte char(15) lieu_arr texte char(15) no_prog entier[1..99] number(2) nb_escale entier[1..20] number(2) villes texte char(200) observations texte char(200) prix_inf entier[1..999] number(10) prix_sup entier[1..999] number(10) saison texte char(20) no_agence entier[1..999] number(3) reserve booléen char(1) nom_agence texte char(20) ville_agence texte char(20) adresse texte char(50) cat_cabine texte char(3) A. Heinrichs & E. Corbery 5
4. Table universelle nom_bateau classe cie no_cabine cat_cabine pont situation nb_lit confort no_voyage region nbre_jour rem1 date_dep date_arr no_variante lieu_dep lieu_arr rem2 no_prog villes observations nb_escales saisons cat_cabine nom_agence reserve adresse no_agence ville_agence prix_inf prix_sup 5. Table fractionnée Bateau nom_bateau classe cie Cabine nom_bateau cat_cabine pont situation no_cabine nb_lit confort Voyage nom_bateau no_voyage region nb_jour rem1 Variante no_voyage no_variante date_dep date_arr Programme no_prog lieu_dep lieu_arr rem2 no_voyage Escale no_prog villes observations nb_escales Saisons no_variante no_voyage prix_inf prix_sup saison Réservation no_cabine no_variante nom_agence reserve Agence nom_agence ville_agence adresse no_agence A. Heinrichs & E. Corbery 6
6. Le graphe des relations classe cie Bateau region nb_jour no_cabine nom_bateau Voyage rem1 date_dep date_arr Cabine situation pont cat_cabine nb_lit confort rem2 lieu_arr lieu_dep Programme no_voyage Variante no_prog no_cabine villes Escale observations nb_escales prix_sup Saisons saison prix_inf reserve Réservation no_variante nom_agence adresse Agence ville_agence no_agence schéma2 - graphe des relations A. Heinrichs & E. Corbery 7
7. Six questions d algèbre relationnel 1) Quels sont les bateaux effectuant une croisière en Méditerranée? (*((région = «Méditerranée») voyage)* bateau) [nom_bateau] 2)Quel est le prix_sup de la croisière no 18 du 30 avril au 7 mai? (*((no_voyage = 18) (date_dép = 30.4)) variante)* saison) [prix_sup] 3)Pendant quels saisons les croisières sont-elles le moins chères? (*(sum(prix_inf, prix_sup) sum(prix_inf, prix_sup)) [saison] 4) Quels sont les bateaux de luxe (classe 4) naviguant dans le pacifique à Noël? (*(((classe = 4) (région = «pacifique») (date_dép < 25.12) (date_arr > 25)) variante * voyage * bateau) [nom_bateau] 5) Quels sont les escales faites par les bateaux naviguant en mer indienne? (*((région = «mer indienne») escales * programme)* voyage) [escales + ] 6) Quels sont les voyages au départ de Marseille sur des bateaux de classe moyenne (classe 2 et 3) pour 3 personnes dans la même cabine orientée vers l extérieur. Donner le prix, les dates de départ et d arrivée ainsi que les remarques liées au voyage et le lieu d arrivée? (*((lieu_dép = «Marseille») ( (classe = 2) (classe = 3)) (nbre_lit = 3) (situation = «extérieur»)) bateau * voyage * cabine * programme)* saisons) [no_voyage, prix_inf, prix_sup, date_dép, date_arr, rem1, rem2, lieu_arr] A. Heinrichs & E. Corbery 8
8. Six questions SQL 1)Quels sont les noms des bateaux de la compagnie Costa Crociere? SELECT nom_bateau FROM Bateau WHERE cie = COSTA CROCIERE ORDER BY nom_bateau; 2) Combien de cabines donnent sur l extérieur à bord du bateau EUGENIO COSTA? SELECT count(no_cabine) FROM Cabine WHERE situation = extérieure AND nom_bateau='eugenio Costa'; 3) Quels sont les voyages de moins de 3 000 frs dans la Méditerranée, classés par ordre de prix? SELECT voyage.no_voyage, saisons.prix_inf FROM Voyage, Saison WHERE voyage.no_voyage = saison.no_voyage AND region = Mediterranee AND prix_inf 3000 ORDER BY prix_inf; 4) Quel sont les cabines encore disponibles sur la compagnie CUNARD? SELECT no_cabine FROM Cabine, Bateau, Réservation WHERE cabine.nom_bateau = bateau.nom_bateau AND cabine.no_cabine = reservation.no_cabine AND reservé = not oui; 5)Quel est le prix moyen d une croisière chez Kuani? SELECT avg(prix_inf) FROM Saisons; A. Heinrichs & E. Corbery 9
6) Quel est la fourchette de prix de la croisière no 18 pendant la période allant du 22.2.1994 au 27.2.1994? SELECT variante.no_variante, saisons.prix_inf, saisons.prix_sup FROM saisons, variante WHERE saison.no_variante = variante.no_variante AND date_dep >= 22-feb-94 AND date_dep <= 27-feb-94 AND variante.no_voyage=18; A. Heinrichs & E. Corbery 10
9. Masque de saisie A. Heinrichs & E. Corbery 11
10. Explications du masque de saisie L'utilisateur commence par sélectionner dans les entités (bateau, cabine...) ce dont il a besoin. Ex.: En cliquant sur bateau, un menu déroulant apparaît avec les constituants de bateau, nom_bateau, cie.... Si on clique sur nom_bateau, le nom de tous les bateaux apparaissent dans la fenêtre en-dessous où on peut sélectionner le nom du bateau qui fera partie de nos préférences. Ses différentes sélections vont apparaître dans la fenêtre dans laquelle il pourra affiner (avec des commandes SQL) ses sélections. Puis en appuyant sur recherche le résultat apparaît dans la fenêtre résultat. Une fois tous ses choix faits, il peut choisir réservation pour réserver la cabine au nom de l'agence. S'il veut faire une nouvelle requête, il va choisir 'Nouvelle', s'il veut imprimer le résultat 'Imprimer' et 'tri' s'il veut classer ses résultats. A. Heinrichs & E. Corbery 12
11. Exemple d'utilisation du masque de saisie Quels sont les noms des bateaux qui voyagent en Méditerranée? 1. Sélection des constituants A. Heinrichs & E. Corbery 13
2. Affichage des résultats A. Heinrichs & E. Corbery 14
12. Create table sous SQLPLUS create table Bateau ( nom_bateau char(20), classe number(1), cie char(20)); create table Cabine ( nom_bateau char(20), cat_cabine number(3), pont char(15), situation char(1), no_cabine char(8), nb_lit number(1), confort char(12)); create table Voyage ( nom_bateau char(20), no_voyage char(3), region char(20), nb_jour number(3), rem1 char(200)); create table Variante ( no_voyage char(3), no_variante char(6), date_dep date, date_arr date); create table programme ( no_prog number(2), lieu_dep char(15), lieu_arr char(15), rem2 char(200), no_voyage char(3)); create table escale ( no_prog number(2), villes char(200), observations char(200), nb_escales number(2)); create table saisons ( no_variante char(6), no_voyage char(3), prix_inf number(10), prix_sup number(10), saison char(20)); A. Heinrichs & E. Corbery 15
create table reservation ( no_cabine char(8), no_variante char(6), nom_agence char(20), reserve char(3)); create table agence ( nom_agence char(20), ville_agence char(20), adresse char(40), no_agence number(3)); A. Heinrichs & E. Corbery 16
13. Exemples d'insert sur SQLPLUS Entité bateau: insert into bateau (nom_bateau, classe, cie) values('achille Lauro', 2, 'Starlauro'); insert into bateau (nom_bateau, classe, cie) values('costa Allegra', 4, 'Costa Crociere'); insert into bateau (nom_bateau, classe, cie) values('eugenio Costa', 3, 'Costa Crociere'); insert into bateau (nom_bateau, classe, cie) values('monterey', 3, 'Starlauro'); insert into bateau (nom_bateau, classe, cie) values('queen Elizabeth 2', 5, 'Cunard'); Entité cabine: insert into cabine (nom_bateau, cat_cabine, pont, situation, no_cabine, nb_lit, confort) values('achille Lauro', 1, 'B', 'i', 'AL0001', 4, 'd/wc'); insert into cabine (nom_bateau, cat_cabine, pont, situation, no_cabine, nb_lit, confort) values('achille Lauro', 8, 'A', 'e', 'AL0329', 2, 'd/wc'); insert into cabine (nom_bateau, cat_cabine, pont, situation, no_cabine, nb_lit, confort) values('costa Allegra', 3, 'Van Gogh', 'i', 'CA0001', 4, 'd/wc'); insert into cabine (nom_bateau, cat_cabine, pont, situation, no_cabine, nb_lit, confort) values('costa Allegra', 4, 'Rousseau', 'e', 'CA0269', 4, 'b/wc appart'); insert into cabine (nom_bateau, cat_cabine, pont, situation, no_cabine, nb_lit, confort) values('eugenio Costa', 1, 'Bordighera', 'i', 'EC0001', 4, 'lavabo'); A. Heinrichs & E. Corbery 17
insert into cabine (nom_bateau, cat_cabine, pont, situation, no_cabine, nb_lit, confort) values('eugenio Costa', 12, 'Embarcations', 'e', 'EC1125', 4, 'b/wc suite'); insert into cabine (nom_bateau, cat_cabine, pont, situation, no_cabine, nb_lit, confort) values('monterey', 1, 'Maile', 'i', 'M0001', 4, 'd/wc'); insert into cabine (nom_bateau, cat_cabine, pont, situation, no_cabine, nb_lit, confort) values('monterey', 5, 'Aloha', 'i', 'M0101', 2, 'd/wc'); insert into cabine (nom_bateau, cat_cabine, pont, situation, no_cabine, nb_lit, confort) values('queen Elizabeth 2', 3, '5', 'i', 'QE0001', 2, 'd/wc'); insert into cabine (nom_bateau, cat_cabine, pont, situation, no_cabine, nb_lit, confort) values('queen Elizabeth 2', 4, 'Sport', 'e', 'QE2125', 4, 'b/wc deluxe'); Entité voyage: insert into voyage (nom_bateau, no_voyage, region, nb_jour, rem1) values( 'Achille Lauro', 37, 'Mediterranee', 12, 'Acheminement par train 1ere classe ou avion Swissair'); insert into voyage (nom_bateau, no_voyage, region, nb_jour, rem1) values( 'Eugenio Costa', 21, 'Mediterranee', 11, 'Acheminement par train 1ere classe ou avion Swissair'); insert into voyage (nom_bateau, no_voyage, region, nb_jour, rem1) values( 'Queen Elizabeth 2', 63, 'Monde', 54, 'Acheminement par train 1ere classe ou avion Swissair'); insert into voyage (nom_bateau, no_voyage, region, nb_jour, rem1) values( 'Costa Allegra', 11, 'Caraibes', 9, 'Acheminement par train 1ere classe ou avion Swissair'); insert into voyage (nom_bateau, no_voyage, region, nb_jour, rem1) values( 'Monterey', 32, 'Caraibes', 13, 'Acheminement par train 1ere classe ou avion Swissair'); A. Heinrichs & E. Corbery 18
Entité variante: insert into variante (no_voyage, no_variante, date_dep, date_arr) values( 11, '11/1', '1-apr-94', '10-apr-94'); insert into variante (no_voyage, no_variante, date_dep, date_arr) values( 18, '18/3', '14-may-94', '21-may-94'); insert into variante (no_voyage, no_variante, date_dep, date_arr) values( 21, '21/5', '2-nov-94', '13-nov-94'); insert into variante (no_voyage, no_variante, date_dep, date_arr) values( 63, '63/1', '7-jan-95', '21-apr-95'); insert into variante (no_voyage, no_variante, date_dep, date_arr) values( 32, '32/3', '1-feb-94', '10-feb-94'); Entité programme: insert into programme (no_prog, lieu_dep, lieu_arr, rem2, no_voyage) values( 6, 'Amsterdam', 'Amsterdam', 'excursions diverses', 6); insert into programme (no_prog, lieu_dep, lieu_arr, rem2, no_voyage) values( 11, 'Pointe-a-Pitre', 'Pointe-a-Pitre', 'excursions diverses', 11); insert into programme (no_prog, lieu_dep, lieu_arr, rem2, no_voyage) values( 21, 'Genes', 'Genes', 'excursions diverses', 21); insert into programme (no_prog, lieu_dep, lieu_arr, rem2, no_voyage) values( 63, 'New-York', 'New-York', 'excursions diverses', 63); insert into programme (no_prog, lieu_dep, lieu_arr, rem2, no_voyage) values( 18, 'Genes', 'Genes', 'excursions diverses', 18); Entité escale: insert into escale (no_prog, villes, observations, nb_escales) values( 11, 'Pointe-a-Pitre/Bridgetown/St- Johns/Roadtown/Philipsbourg/Fort-de-France/Pointe-a-Pitre', 'curiosités', 5); insert into escale A. Heinrichs & E. Corbery 19
(no_prog, villes, observations, nb_escales) values( 21, 'Genes/Barcelone/Casablanca/St- Cruz/Funchal/Malaga/Genes', 'curiosités', 5); Entité saisons: insert into saisons (no_variante, no_voyage, prix_inf, prix_sup, saison) values( '11/1', 11, 2520, 4230, 'CS03SHP001'); insert into saisons (no_variante, no_voyage, prix_inf, prix_sup, saison) values( '11/2', 11, 2930, 5130, 'Tf'); insert into saisons (no_variante, no_voyage, prix_inf, prix_sup, saison) values( '18/1', 18, 1355, 3015, 'EU3SHP001'); insert into saisons (no_variante, no_voyage, prix_inf, prix_sup, saison) values( '18/3', 18, 2675, 6095, 'EU3SHP002'); insert into saisons (no_variante, no_voyage, prix_inf, prix_sup, saison) values( '21/1', 21, 2500, 4615, 'EU3SHP004'); insert into saisons (no_variante, no_voyage, prix_inf, prix_sup, saison) values( '21/5', 21, 1435, 3205, 'EU3SHP005'); insert into saisons (no_variante, no_voyage, prix_inf, prix_sup, saison) values( '63/1', 63, 41010, 151590, 'Tf'); insert into saisons (no_variante, no_voyage, prix_inf, prix_sup, saison) values( '37/1', 37, 2105, 4485, 'AC1SHP001'); Entité reservation: insert into reservation (no_cabine, no_variante, nom_agence, reserve) values('al0001', '37/1', 'KuaniGe', 'o'); insert into reservation (no_cabine, no_variante, nom_agence, reserve) values('qe0001', '63/1', 'KuaniVs', 'n'); Entité agence: insert into agence (nom_agence, ville_agence, adresse, no_agence) values('kuanige', 'Geneve', '12 rue du Lac', 001); insert into agence (nom_agence, ville_agence, adresse, no_agence) values('kuanivs', 'Sion', '4 rue du Vin', 002); A. Heinrichs & E. Corbery 20
insert into agence (nom_agence, ville_agence, adresse, no_agence) values('kuanivd', 'Lausanne', '21 bd du Pont', 003); A. Heinrichs & E. Corbery 21
14. Six questions SQL sur SQLPLUS 1) Quels sont les noms des bateaux de la compagnie Costa Crociere? select nom_bateau from bateau where cie= 'Costa Crociere' order by nom_bateau; NOM_BATEAU -------------------- Costa Allegra Eugenio Costa 2)Quels sont les croisières qui se font dans les Caraibes? select bateau.nom_bateau, voyage.no_voyage from bateau, voyage where voyage.nom_bateau=bateau.nom_bateau and voyage.region='caraibes'; NOM_BATEAU NO_VOYAGE -------------------- --------- Costa Allegra 11 Monterey 32 3)Quels sont les agences qui ont réservé une croisière et laquelle? select agence.nom_agence, no_agence, ville_agence from agence, reservation where agence.nom_agence=reservation.nom_agence and reserve='o'; NOM_AGENCE NO_AGENCE VILLE_AGENCE -------------------- ---------- -------------------- KuaniGe 1 Geneve 4)Quel est la fourchette de prix de la croisière no 18? select no_variante, prix_inf, prix_sup from saisons where no_voyage=18; NO_VAR PRIX_INF PRIX_SUP ------ ---------- ---------- 18/1 1355 3015 18/3 2675 6095 A. Heinrichs & E. Corbery 22
5)Quelle est la ville de départ et les escales de la croisière no 11? select programme.lieu_dep, escale.villes from programme, escale where programme.no_prog=escale.no_prog and programme.no_voyage='11'; LIEU_DEP VILLES ----------- ---------------------------------- Pointe-a-Pitre Pointe-a-Pitre/Bridgetown/St- Johns/Roadtown/Philipsbourg/Fort-de- France/Pointe-a-Pitre 6)Quel est le prix moyen inférieur des croisières Kuani? select avg(prix_inf) " Prix moyen inferieur" from saisons; Prix moyen inferieur --------------------- 7066.25 7) Quels sont les voyages des moins de Fr 3000.- dans la Méditerranée classés par ordre de prix? select voyage.no_voyage, prix_inf from voyage, saisons where voyage.no_voyage=saisons.no_voyage and region='mediterranee' and prix_inf <= 3000 order by prix_inf; NO_ PRIX_INF --- ---------- 21 1435 37 2105 21 2500 A. Heinrichs & E. Corbery 23
15. Create view sur SQLPLUS 1) SQL> create view bat (nom_bateau, classe, cie) as select * from bateau; View created. SQL> select * from bat; NOM_BATEAU CLASSE CIE -------------------- ---------- -------------------- Achille Lauro 2 Starlauro Costa Allegra 4 Costa Crociere Eugenio Costa 3 Costa Crociere Monterey 3 Starlauro Queen Elizabeth 2 5 Cunard 2) SQL> create view batcab(nom_bateau, cie, no_cabine) as select bateau.nom_bateau, cie, no_cabine from bateau, cabine where bateau.nom_bateau = cabine.nom_bateau; View created. SQL> select * from batcab; NOM_BATEAU CIE NO_CABIN -------------------- -------------------- -------- Achille Lauro Starlauro AL0001 Achille Lauro Starlauro AL0329 Costa Allegra Costa Crociere CA0001 Costa Allegra Costa Crociere CA0269 Eugenio Costa Costa Crociere EC0001 Eugenio Costa Costa Crociere EC1125 Monterey Starlauro M0001 Monterey Starlauro M0101 Queen Elizabeth 2 Cunard QE0001 Queen Elizabeth 2 Cunard QE2125 10 rows selected. 3) create view resage (nom_agence, no_agence, ville_agence, reserve) as select agence.nom_agence, agence.no_agence, agence.ville_agence, reservation.reserve from reservation, agence where reserve='o'; View created. SQL> select * from resage; NOM_AGENCE NO_AGENCE VILLE_AGENCE RES A. Heinrichs & E. Corbery 24
-------------------- ---------- -------------------- --- KuaniGe 1 Geneve o KuaniVs 2 Sion o KuaniVd 3 Lausanne o A. Heinrichs & E. Corbery 25
16. Conclusion Par la suite nous allons intégrer les règles d intégrités adéquates qui permettront une plus grandre rigueur dans l entrée des données. Cette base de donnée permettra aux agences Kuani de Suisse de trouver des informations plus rapidement ainsi que d effectuer des mises à jour. Par la suite il faudra affiner les prix par rapport à chaque cabine et non en fonction d'une borne inférieure et supérieure. Il ne faut pas oublier que nos clients sont les agences et donc les clients des agences sont uniquement de leur ressort. Ce travail nous a permis d'aquérir les bases de la constitution d'une base de donnée relationnelle. A. Heinrichs & E. Corbery 26