RelationalDesign: schema_creation.sql

File schema_creation.sql, 5.1 KB (added by 223091, 2 days ago)
Line 
1DROP SCHEMA IF EXISTS project CASCADE;
2CREATE SCHEMA project;
3SET search_path TO project;
4
5CREATE TABLE buildings (
6 building_id INTEGER GENERATED BY DEFAULT AS IDENTITY,
7 name VARCHAR(128) NOT NULL,
8 address VARCHAR(128) NOT NULL,
9
10 CONSTRAINT pk_buildings
11 PRIMARY KEY (building_id),
12
13 CONSTRAINT uq_buildings_name_address
14 UNIQUE (name, address)
15);
16
17CREATE TABLE rooms (
18 room_id INTEGER GENERATED BY DEFAULT AS IDENTITY,
19 building_id INTEGER NOT NULL,
20 room_code VARCHAR(128) NOT NULL,
21 capacity INTEGER NOT NULL,
22 type VARCHAR(128) NOT NULL,
23
24 CONSTRAINT pk_rooms
25 PRIMARY KEY (room_id),
26
27 CONSTRAINT fk_rooms_buildings
28 FOREIGN KEY (building_id)
29 REFERENCES buildings(building_id)
30 ON DELETE RESTRICT
31 ON UPDATE CASCADE,
32
33 CONSTRAINT uq_rooms_room_code
34 UNIQUE (room_code),
35
36 CONSTRAINT chk_rooms_capacity
37 CHECK (capacity > 0),
38
39 CONSTRAINT chk_rooms_type
40 CHECK (type IN ('classroom', 'office', 'meeting_room', 'lab'))
41);
42
43CREATE TABLE equipment (
44 equipment_id INTEGER GENERATED BY DEFAULT AS IDENTITY,
45 name VARCHAR(128) NOT NULL,
46 stock_quantity INTEGER NOT NULL,
47
48 CONSTRAINT pk_equipment
49 PRIMARY KEY (equipment_id),
50
51 CONSTRAINT uq_equipment_name
52 UNIQUE (name),
53
54 CONSTRAINT chk_equipment_stock_quantity
55 CHECK (stock_quantity >= 0)
56);
57
58CREATE TABLE room_equipment (
59 room_id INTEGER NOT NULL,
60 equipment_id INTEGER NOT NULL,
61 quantity INTEGER NOT NULL,
62
63 CONSTRAINT pk_room_equipment
64 PRIMARY KEY (room_id, equipment_id),
65
66 CONSTRAINT fk_room_equipment_rooms
67 FOREIGN KEY (room_id)
68 REFERENCES rooms(room_id)
69 ON DELETE CASCADE
70 ON UPDATE CASCADE,
71
72 CONSTRAINT fk_room_equipment_equipment
73 FOREIGN KEY (equipment_id)
74 REFERENCES equipment(equipment_id)
75 ON DELETE RESTRICT
76 ON UPDATE CASCADE,
77
78 CONSTRAINT chk_room_equipment_quantity
79 CHECK (quantity > 0)
80);
81
82CREATE TABLE users (
83 user_id INTEGER GENERATED BY DEFAULT AS IDENTITY,
84 username VARCHAR(128) NOT NULL,
85 email VARCHAR(128) NOT NULL,
86 full_name VARCHAR(128) NOT NULL,
87 role VARCHAR(128) NOT NULL,
88
89 CONSTRAINT pk_users
90 PRIMARY KEY (user_id),
91
92 CONSTRAINT uq_users_username
93 UNIQUE (username),
94
95 CONSTRAINT uq_users_email
96 UNIQUE (email),
97
98 CONSTRAINT chk_users_email
99 CHECK (position('@' in email) > 1),
100
101 CONSTRAINT chk_users_role
102 CHECK (role IN ('regular', 'admin', 'approver'))
103);
104
105CREATE TABLE reservations (
106 reservation_id INTEGER GENERATED BY DEFAULT AS IDENTITY,
107 room_id INTEGER,
108 user_id INTEGER NOT NULL,
109 reservation_date DATE NOT NULL,
110 start_time TIME NOT NULL,
111 end_time TIME NOT NULL,
112 status VARCHAR(128) NOT NULL,
113
114 CONSTRAINT pk_reservations
115 PRIMARY KEY (reservation_id),
116
117 CONSTRAINT fk_reservations_rooms
118 FOREIGN KEY (room_id)
119 REFERENCES rooms(room_id)
120 ON DELETE RESTRICT
121 ON UPDATE CASCADE,
122
123 CONSTRAINT fk_reservations_users
124 FOREIGN KEY (user_id)
125 REFERENCES users(user_id)
126 ON DELETE RESTRICT
127 ON UPDATE CASCADE,
128
129 CONSTRAINT chk_reservations_time
130 CHECK (end_time > start_time),
131
132 CONSTRAINT chk_reservations_status
133 CHECK (status IN ('pending', 'approved', 'rejected', 'cancelled')),
134
135 CONSTRAINT uq_reservations_room_exact_interval
136 UNIQUE (room_id, reservation_date, start_time, end_time)
137);
138
139CREATE TABLE reservation_equipment (
140 reservation_id INTEGER NOT NULL,
141 equipment_id INTEGER NOT NULL,
142 requested_quantity INTEGER NOT NULL,
143
144 CONSTRAINT pk_reservation_equipment
145 PRIMARY KEY (reservation_id, equipment_id),
146
147 CONSTRAINT fk_reservation_equipment_reservations
148 FOREIGN KEY (reservation_id)
149 REFERENCES reservations(reservation_id)
150 ON DELETE CASCADE
151 ON UPDATE CASCADE,
152
153 CONSTRAINT fk_reservation_equipment_equipment
154 FOREIGN KEY (equipment_id)
155 REFERENCES equipment(equipment_id)
156 ON DELETE RESTRICT
157 ON UPDATE CASCADE,
158
159 CONSTRAINT chk_reservation_equipment_requested_quantity
160 CHECK (requested_quantity > 0)
161);
162
163CREATE TABLE approvals (
164 approval_id INTEGER GENERATED BY DEFAULT AS IDENTITY,
165 reservation_id INTEGER NOT NULL,
166 approver_id INTEGER NOT NULL,
167 decision VARCHAR(128) NOT NULL,
168 decision_time TIMESTAMP NOT NULL,
169 note VARCHAR(255),
170
171 CONSTRAINT pk_approvals
172 PRIMARY KEY (approval_id),
173
174 CONSTRAINT fk_approvals_reservations
175 FOREIGN KEY (reservation_id)
176 REFERENCES reservations(reservation_id)
177 ON DELETE CASCADE
178 ON UPDATE CASCADE,
179
180 CONSTRAINT fk_approvals_users
181 FOREIGN KEY (approver_id)
182 REFERENCES users(user_id)
183 ON DELETE RESTRICT
184 ON UPDATE CASCADE,
185
186 CONSTRAINT uq_approvals_reservation
187 UNIQUE (reservation_id),
188
189 CONSTRAINT chk_approvals_decision
190 CHECK (decision IN ('approved', 'rejected'))
191);