scf.sql 4.15 KB
Newer Older
1
---Ville (#nom_ville: varchar) ;
David Gustavo De La Rocha Ramirez's avatar
SQL V1  
David Gustavo De La Rocha Ramirez committed
2
CREATE TABLE Ville (
3
4
    nom_ville VARCHAR UNIQUE NOT NULL,
    PRIMARY KEY(nom_ville)
David Gustavo De La Rocha Ramirez's avatar
SQL V1  
David Gustavo De La Rocha Ramirez committed
5
6
);

7
---Gare (#nom_gare: varchar, #nom_ville=>Ville, adresse: varchar, zone_horaire: int) ;
David Gustavo De La Rocha Ramirez's avatar
SQL V1  
David Gustavo De La Rocha Ramirez committed
8
CREATE TABLE Gare (
9
    id_gare INTEGER UNIQUE NOT NULL,
10
11
    nom_gare VARCHAR NOT NULL,
    nom_ville VARCHAR NOT NULL REFERENCES Ville(nom_ville),
12
13
    adresse VARCHAR NOT NULL,
    zone_horaire INTEGER NOT NULL,
14
    PRIMARY KEY(id_gare)
David Gustavo De La Rocha Ramirez's avatar
SQL V1  
David Gustavo De La Rocha Ramirez committed
15
16
);

17
---Ligne (#id_ligne: integer, nom_ligne: varchar, origine=>Gare, terminus=>Gare) ;
David Gustavo De La Rocha Ramirez's avatar
SQL V1  
David Gustavo De La Rocha Ramirez committed
18
CREATE TABLE Ligne (
19
20
21
22
    id_ligne INTEGER UNIQUE NOT NULL, 
    nom_ligne VARCHAR NOT NULL, 
    origine INTEGER REFERENCES Gare(id_gare) NOT NULL, 
    terminus INTEGER REFERENCES Gare(id_gare) NOT NULL,
23
    PRIMARY KEY(id_ligne)
David Gustavo De La Rocha Ramirez's avatar
SQL V1  
David Gustavo De La Rocha Ramirez committed
24
);
25

26
---Train (#numero:integer, type: {TGV, TER}, places_max : integer, premiere_class : bool, vitesse_max : integer) ;
27
28
CREATE TYPE typeTrain AS ENUM('TGV', 'TER');
CREATE TABLE Train (
29
    numero INTEGER UNIQUE NOT NULL, 
30
31
32
33
    type_train typeTrain NOT NULL, 
    places_max INTEGER NOT NULL, 
    premiere_class BOOLEAN NOT NULL, 
    vitesse_max INTEGER NOT NULL,
34
35
36
37
38
39
    PRIMARY KEY(numero)
);

---Arrêt ( #position:integer, #gare=>Gare, #ligne=>Ligne);
CREATE TABLE Arret (
    ---On ajoute une cle artificielle unique pour povoir l'instancier
40
    id_arret INTEGER UNIQUE NOT NULL,
41
42
43
44
45
46
47
48
49
50
51
    position INTEGER NOT NULL,
    gare INTEGER REFERENCES Gare(id_gare) NOT NULL,
    ligne INTEGER REFERENCES Ligne(id_ligne) NOT NULL,
    PRIMARY KEY(id_arret)
);

---Calendrier (#jour : {lundi, mardi, mercredi, jeudi, vendredi, samedi, dimanche})
CREATE TYPE typeJour AS ENUM('lundi', 'mardi', 'mecredi', 'jeudi', 'vendredi', 'samedi', 'dimanche');
CREATE TABLE Calendrier (
    jour typeJour UNIQUE NOT NULL,
    PRIMARY KEY(jour)
52
53
);

54
55
56
57
58
59
60
---Horaires (#id_horaires: int, #id_train =>Train, départ : heure, arrivée : heure, arrêt=>Arrêt, 
---             date : date, jour=>Calendrier, type: {régulier, exceptionnel}, type_except : {ajout, suppression}) ;
CREATE TYPE typeHoraire AS ENUM('régulier', 'exceptionnel');
CREATE TYPE typeExcept AS ENUM('ajout', 'suppression');
CREATE TABLE Horaires (
    id_horaires SERIAL,
    id_train INTEGER NOT NULL REFERENCES Train(numero),
61
62
63
64
65
    depart TIME NOT NULL,
    arrivee TIME NOT NULL,
    arret INTEGER NOT NULL REFERENCES Arret(id_arret) NOT NULL,
    date_horaires DATE NOT NULL,
    jour typeJour REFERENCES Calendrier(jour) NOT NULL,
Clement Lucas's avatar
Clement Lucas committed
66
    type_horaire typeHoraire NOT NULL,
67
    type_except typeExcept,
68
69
    PRIMARY KEY(id_horaires),
    CHECK (NOT(type_horaire = 'régulier') OR type_except = NULL)
70
71
72
73
74
);

---Voyageur(#id_voyageur: int, nom: varchar, prenom: varchar, adresse: varchar,
---        tel: longint, paiement: {carte, espèce, chèque}, id_carte: integer,
---        status: {voyageur, grand, plus}, type: {occasionnel, régulier});
75
76
77
78
CREATE TYPE typePaiement AS ENUM('carte', 'espèce', 'chèque');
CREATE TYPE typeStatus AS ENUM('voyageur', 'grand', 'plus');
CREATE TYPE typeVoyageur AS ENUM('occasionnel', 'régulier');
CREATE TABLE Voyageur (
79
80
81
82
83
84
    id_voyageur INTEGER UNIQUE NOT NULL, 
    nom VARCHAR NOT NULL, 
    prenom VARCHAR NOT NULL, 
    adresse VARCHAR NOT NULL,
    tel BIGINT NOT NULL, 
    paiement typePaiement NOT NULL, 
85
86
    id_carte INTEGER,
    status_voyageur typeStatus, 
87
    type_voyageur typeVoyageur,
88
89
    PRIMARY KEY(id_voyageur),
    CHECK (NOT(type_voyageur = 'occasionnel') OR (id_carte = NULL AND status_voyageur = NULL))
90
91
);

92
---Billet(#id_billet: int, prix : reel, assurance : bool, id_voyageur=>Voyageur) ;
93
CREATE TABLE Billet (
94
    id_billet SERIAL, 
95
96
97
    prix NUMERIC NOT NULL, 
    assurance BOOLEAN NOT NULL, 
    id_voyageur INTEGER REFERENCES Voyageur(id_voyageur) NOT NULL,
98
99
100
101
102
103
104
    PRIMARY KEY(id_billet)
);

---Trajet (#id_trajet : int,  #id_billet=>Billet, numéro_place :integer, durée: heure, 
---            horaire_départ=>Horaires, horaire_arrivée=>Horaires);
CREATE TABLE Trajet (
    id_trajet SERIAL,
105
106
107
108
109
    id_billet INTEGER REFERENCES Billet(id_billet) NOT NULL,
    numero_place INTEGER NOT NULL,
    duree TIME NOT NULL,
    horaire_depart INTEGER REFERENCES Horaires(id_horaires) NOT NULL,
    horaire_arrivee INTEGER REFERENCES Horaires(id_horaires) NOT NULL,
110
111
    PRIMARY KEY(id_trajet)
);