RelationalDesign: schema_creation.sql

File schema_creation.sql, 9.0 KB (added by 193284, 5 months ago)
Line 
1DROP SCHEMA IF EXISTS project CASCADE;
2CREATE SCHEMA project;
3SET search_path TO project;
4
5-- =====================
6-- USER
7-- =====================
8CREATE TABLE "user" (
9 user_id SERIAL PRIMARY KEY,
10 first_name VARCHAR(50) NOT NULL,
11 last_name VARCHAR(50) NOT NULL,
12 email VARCHAR(120) NOT NULL UNIQUE,
13 phone_number VARCHAR(30),
14 gender VARCHAR(20),
15 birthday DATE
16);
17
18-- =====================
19-- WEDDING
20-- =====================
21CREATE TABLE wedding (
22 wedding_id SERIAL PRIMARY KEY,
23 "date" DATE NOT NULL,
24 budget NUMERIC(12,2),
25 notes TEXT,
26 user_id INTEGER NOT NULL,
27 CONSTRAINT fk_wedding_user
28 FOREIGN KEY (user_id)
29 REFERENCES "user"(user_id)
30 ON UPDATE CASCADE
31 ON DELETE CASCADE
32);
33
34-- =====================
35-- CHURCH & PRIEST
36-- =====================
37CREATE TABLE church (
38 church_id SERIAL PRIMARY KEY,
39 name VARCHAR(120) NOT NULL,
40 location VARCHAR(150) NOT NULL,
41 contact VARCHAR(120) NOT NULL,
42 wedding_id INTEGER UNIQUE,
43 CONSTRAINT fk_church_wedding
44 FOREIGN KEY (wedding_id)
45 REFERENCES wedding(wedding_id)
46 ON UPDATE CASCADE
47 ON DELETE SET NULL
48);
49
50CREATE TABLE priest (
51 priest_id SERIAL PRIMARY KEY,
52 name VARCHAR(120) NOT NULL,
53 contact VARCHAR(120) NOT NULL,
54 church_id INTEGER NOT NULL,
55 CONSTRAINT fk_priest_church
56 FOREIGN KEY (church_id)
57 REFERENCES church(church_id)
58 ON UPDATE CASCADE
59 ON DELETE CASCADE
60);
61
62-- =====================
63-- EVENT
64-- =====================
65CREATE TABLE event (
66 event_id SERIAL PRIMARY KEY,
67 event_type VARCHAR(60) NOT NULL,
68 "date" DATE NOT NULL,
69 start_time TIME NOT NULL,
70 end_time TIME NOT NULL,
71 status VARCHAR(30) NOT NULL,
72 wedding_id INTEGER NOT NULL,
73 CONSTRAINT fk_event_wedding
74 FOREIGN KEY (wedding_id)
75 REFERENCES wedding(wedding_id)
76 ON UPDATE CASCADE
77 ON DELETE CASCADE,
78 CONSTRAINT chk_event_time CHECK (end_time > start_time)
79);
80
81-- =====================
82-- GUEST
83-- =====================
84CREATE TABLE guest (
85 guest_id SERIAL PRIMARY KEY,
86 first_name VARCHAR(50) NOT NULL,
87 last_name VARCHAR(50) NOT NULL,
88 email VARCHAR(120),
89 wedding_id INTEGER NOT NULL,
90 CONSTRAINT fk_guest_wedding
91 FOREIGN KEY (wedding_id)
92 REFERENCES wedding(wedding_id)
93 ON UPDATE CASCADE
94 ON DELETE CASCADE
95);
96
97-- =====================
98-- RSVP
99-- =====================
100CREATE TABLE event_rsvp (
101 response_id SERIAL PRIMARY KEY,
102 status VARCHAR(30) NOT NULL,
103 response_date DATE NOT NULL,
104 guest_id INTEGER NOT NULL,
105 event_id INTEGER NOT NULL,
106 CONSTRAINT fk_rsvp_guest
107 FOREIGN KEY (guest_id) REFERENCES guest(guest_id)
108 ON UPDATE CASCADE
109 ON DELETE CASCADE,
110 CONSTRAINT fk_rsvp_event
111 FOREIGN KEY (event_id) REFERENCES event(event_id)
112 ON UPDATE CASCADE
113 ON DELETE CASCADE,
114 CONSTRAINT uq_rsvp UNIQUE (guest_id, event_id)
115);
116
117-- =====================
118-- ATTENDANCE
119-- =====================
120CREATE TABLE attendance (
121 attendance_id SERIAL PRIMARY KEY,
122 status VARCHAR(30) NOT NULL,
123 table_number INTEGER,
124 role VARCHAR(40) NOT NULL,
125 guest_id INTEGER NOT NULL,
126 event_id INTEGER NOT NULL,
127 CONSTRAINT fk_att_guest
128 FOREIGN KEY (guest_id) REFERENCES guest(guest_id)
129 ON UPDATE CASCADE
130 ON DELETE CASCADE,
131 CONSTRAINT fk_att_event
132 FOREIGN KEY (event_id) REFERENCES event(event_id)
133 ON UPDATE CASCADE
134 ON DELETE CASCADE,
135 CONSTRAINT uq_attendance UNIQUE (guest_id, event_id),
136 CONSTRAINT chk_table_number CHECK (table_number IS NULL OR table_number > 0)
137);
138
139-- =====================
140-- VENUE
141-- =====================
142CREATE TABLE venue_type (
143 type_id SERIAL PRIMARY KEY,
144 type_name VARCHAR(50) NOT NULL UNIQUE
145);
146
147CREATE TABLE venue (
148 venue_id SERIAL PRIMARY KEY,
149 name VARCHAR(120) NOT NULL,
150 location VARCHAR(150) NOT NULL,
151 city VARCHAR(80) NOT NULL,
152 address VARCHAR(150) NOT NULL,
153 capacity INTEGER NOT NULL CHECK (capacity > 0),
154 menu TEXT,
155 phone_number VARCHAR(30),
156 price_per_guest NUMERIC(10,2) NOT NULL CHECK (price_per_guest >= 0),
157 type_id INTEGER NOT NULL,
158 CONSTRAINT fk_venue_type
159 FOREIGN KEY (type_id)
160 REFERENCES venue_type(type_id)
161 ON UPDATE CASCADE
162 ON DELETE RESTRICT
163);
164
165CREATE TABLE venue_booking (
166 booking_id SERIAL PRIMARY KEY,
167 "date" DATE NOT NULL,
168 start_time TIME NOT NULL,
169 end_time TIME NOT NULL,
170 status VARCHAR(30) NOT NULL,
171 price NUMERIC(12,2) NOT NULL,
172 venue_id INTEGER NOT NULL,
173 wedding_id INTEGER NOT NULL,
174 CONSTRAINT fk_vb_venue
175 FOREIGN KEY (venue_id) REFERENCES venue(venue_id)
176 ON UPDATE CASCADE
177 ON DELETE CASCADE,
178 CONSTRAINT fk_vb_wedding
179 FOREIGN KEY (wedding_id) REFERENCES wedding(wedding_id)
180 ON UPDATE CASCADE
181 ON DELETE CASCADE,
182 CONSTRAINT chk_vb_time CHECK (end_time > start_time)
183);
184
185-- =====================
186-- PHOTOGRAPHER
187-- =====================
188CREATE TABLE photographer (
189 photographer_id SERIAL PRIMARY KEY,
190 name VARCHAR(120) NOT NULL,
191 email VARCHAR(120) NOT NULL UNIQUE,
192 phone_number VARCHAR(30) NOT NULL,
193 price_per_hour NUMERIC(10,2) NOT NULL CHECK (price_per_hour >= 0)
194);
195
196CREATE TABLE photographer_booking (
197 booking_id SERIAL PRIMARY KEY,
198 "date" DATE NOT NULL,
199 start_time TIME NOT NULL,
200 end_time TIME NOT NULL,
201 status VARCHAR(30) NOT NULL,
202 photographer_id INTEGER NOT NULL,
203 wedding_id INTEGER NOT NULL,
204 CONSTRAINT fk_pb_photographer
205 FOREIGN KEY (photographer_id)
206 REFERENCES photographer(photographer_id)
207 ON UPDATE CASCADE
208 ON DELETE CASCADE,
209 CONSTRAINT fk_pb_wedding
210 FOREIGN KEY (wedding_id)
211 REFERENCES wedding(wedding_id)
212 ON UPDATE CASCADE
213 ON DELETE CASCADE,
214 CONSTRAINT chk_pb_time CHECK (end_time > start_time)
215);
216
217-- =====================
218-- BAND
219-- =====================
220CREATE TABLE band (
221 band_id SERIAL PRIMARY KEY,
222 band_name VARCHAR(120) NOT NULL,
223 genre VARCHAR(60) NOT NULL,
224 equipment TEXT,
225 phone_number VARCHAR(30) NOT NULL,
226 price_per_hour NUMERIC(10,2) NOT NULL CHECK (price_per_hour >= 0)
227);
228
229CREATE TABLE band_booking (
230 booking_id SERIAL PRIMARY KEY,
231 "date" DATE NOT NULL,
232 start_time TIME NOT NULL,
233 end_time TIME NOT NULL,
234 status VARCHAR(30) NOT NULL,
235 band_id INTEGER NOT NULL,
236 wedding_id INTEGER NOT NULL,
237 CONSTRAINT fk_bb_band
238 FOREIGN KEY (band_id) REFERENCES band(band_id)
239 ON UPDATE CASCADE
240 ON DELETE CASCADE,
241 CONSTRAINT fk_bb_wedding
242 FOREIGN KEY (wedding_id) REFERENCES wedding(wedding_id)
243 ON UPDATE CASCADE
244 ON DELETE CASCADE,
245 CONSTRAINT chk_bb_time CHECK (end_time > start_time)
246);
247
248-- =====================
249-- REGISTRAR
250-- =====================
251CREATE TABLE registrar (
252 registrar_id SERIAL PRIMARY KEY,
253 name VARCHAR(120) NOT NULL,
254 contact VARCHAR(100),
255 location VARCHAR(150),
256 working_hours VARCHAR(100)
257);
258
259CREATE TABLE registrar_booking (
260 booking_id SERIAL PRIMARY KEY,
261 "date" DATE NOT NULL,
262 start_time TIME NOT NULL,
263 end_time TIME NOT NULL,
264 status VARCHAR(30) NOT NULL,
265 registrar_id INTEGER NOT NULL,
266 wedding_id INTEGER NOT NULL,
267 CONSTRAINT fk_rb_registrar
268 FOREIGN KEY (registrar_id)
269 REFERENCES registrar(registrar_id)
270 ON UPDATE CASCADE
271 ON DELETE CASCADE,
272 CONSTRAINT fk_rb_wedding
273 FOREIGN KEY (wedding_id)
274 REFERENCES wedding(wedding_id)
275 ON UPDATE CASCADE
276 ON DELETE CASCADE,
277 CONSTRAINT chk_rb_time CHECK (end_time > start_time)
278);
279
280-- =====================
281-- INDEXES
282-- =====================
283CREATE INDEX idx_wedding_user ON wedding(user_id);
284CREATE INDEX idx_event_wedding ON event(wedding_id);
285CREATE INDEX idx_guest_wedding ON guest(wedding_id);
286CREATE INDEX idx_vb_wedding ON venue_booking(wedding_id);
287CREATE INDEX idx_vb_venue ON venue_booking(venue_id);
288CREATE INDEX idx_pb_wedding ON photographer_booking(wedding_id);
289CREATE INDEX idx_bb_wedding ON band_booking(wedding_id);
290CREATE INDEX idx_rb_wedding ON registrar_booking(wedding_id);