DatabaseCreation: base.sql

File base.sql, 9.0 KB (added by 231088, 23 hours ago)
Line 
1CREATE TABLE Location (
2 location_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
3 city VARCHAR(100) NOT NULL,
4 region VARCHAR(100),
5 country VARCHAR(100) NOT NULL
6);
7
8CREATE TABLE Users (
9 user_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
10 email VARCHAR(150) UNIQUE NOT NULL,
11 password_hash VARCHAR(255) NOT NULL,
12 first_name VARCHAR(100),
13 last_name VARCHAR(100),
14 phone VARCHAR(30),
15 registration_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
16 account_status VARCHAR(30) DEFAULT 'PENDING',
17 CHECK (email LIKE '%@%.%'),
18 CHECK (account_status IN ('ACTIVE','INACTIVE','SUSPENDED','PENDING'))
19);
20
21CREATE TABLE Role (
22 role_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
23 role_name VARCHAR(50) UNIQUE NOT NULL
24);
25
26CREATE TABLE UserRole (
27 user_id INTEGER NOT NULL,
28 role_id INTEGER NOT NULL,
29 PRIMARY KEY (user_id, role_id),
30 FOREIGN KEY (user_id) REFERENCES Users(user_id) ON DELETE CASCADE,
31 FOREIGN KEY (role_id) REFERENCES Role(role_id) ON DELETE RESTRICT
32);
33
34CREATE TABLE Genre (
35 genre_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
36 genre_name VARCHAR(100) UNIQUE NOT NULL
37);
38
39CREATE TABLE ArtistType (
40 artist_type_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
41 type_name VARCHAR(100) UNIQUE NOT NULL,
42 description TEXT
43);
44
45CREATE TABLE VenueType (
46 venue_type_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
47 name VARCHAR(100) UNIQUE NOT NULL,
48 description TEXT
49);
50
51CREATE TABLE Venue (
52 venue_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
53 venue_type_id INTEGER NOT NULL,
54 location_id INTEGER,
55 venue_name VARCHAR(150) NOT NULL,
56 address VARCHAR(255) NOT NULL,
57 capacity INTEGER,
58 indoor_outdoor VARCHAR(20),
59 FOREIGN KEY (venue_type_id) REFERENCES VenueType(venue_type_id) ON DELETE RESTRICT,
60 FOREIGN KEY (location_id) REFERENCES Location(location_id) ON DELETE SET NULL,
61 CHECK (capacity IS NULL OR capacity > 0),
62 CHECK (indoor_outdoor IN ('INDOOR','OUTDOOR','MIXED'))
63);
64
65CREATE TABLE PerformanceDurationOption (
66 duration_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
67 label VARCHAR(50) NOT NULL,
68 duration_minutes INTEGER NOT NULL,
69 CHECK (duration_minutes > 0)
70);
71
72CREATE TABLE ClientProfile (
73 client_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
74 user_id INTEGER UNIQUE NOT NULL,
75 display_name VARCHAR(150),
76 company_name VARCHAR(150),
77 preferred_contact_method VARCHAR(50) DEFAULT 'EMAIL',
78 location_id INTEGER,
79 FOREIGN KEY (user_id) REFERENCES Users(user_id) ON DELETE CASCADE,
80 FOREIGN KEY (location_id) REFERENCES Location(location_id) ON DELETE SET NULL
81);
82
83CREATE TABLE Bookable (
84 bookable_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
85 bookable_type VARCHAR(20) NOT NULL,
86 display_name VARCHAR(150) NOT NULL,
87 description TEXT,
88 base_price_from DECIMAL(10,2),
89 average_rating DECIMAL(3,2),
90 location_id INTEGER,
91 is_active BOOLEAN DEFAULT TRUE,
92 FOREIGN KEY (location_id) REFERENCES Location(location_id) ON DELETE SET NULL,
93 CHECK (bookable_type IN ('ARTIST','BAND')),
94 CHECK (average_rating IS NULL OR (average_rating >= 0 AND average_rating <= 5))
95);
96
97CREATE TABLE ArtistProfile (
98 artist_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
99 bookable_id INTEGER UNIQUE NOT NULL,
100 user_id INTEGER UNIQUE NOT NULL,
101 artist_type_id INTEGER NOT NULL,
102 stage_name VARCHAR(150),
103 biography TEXT,
104 is_verified BOOLEAN DEFAULT FALSE,
105 FOREIGN KEY (bookable_id) REFERENCES Bookable(bookable_id) ON DELETE CASCADE,
106 FOREIGN KEY (user_id) REFERENCES Users(user_id) ON DELETE CASCADE,
107 FOREIGN KEY (artist_type_id) REFERENCES ArtistType(artist_type_id) ON DELETE RESTRICT
108);
109
110CREATE TABLE BandProfile (
111 band_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
112 bookable_id INTEGER UNIQUE NOT NULL,
113 owner_user_id INTEGER,
114 band_name VARCHAR(150) NOT NULL,
115 formation_year INTEGER,
116 biography TEXT,
117 FOREIGN KEY (bookable_id) REFERENCES Bookable(bookable_id) ON DELETE CASCADE,
118 FOREIGN KEY (owner_user_id) REFERENCES Users(user_id) ON DELETE SET NULL
119);
120
121CREATE TABLE BandMember (
122 band_id INTEGER NOT NULL,
123 artist_id INTEGER NOT NULL,
124 PRIMARY KEY (band_id, artist_id),
125 FOREIGN KEY (band_id) REFERENCES BandProfile(band_id) ON DELETE CASCADE,
126 FOREIGN KEY (artist_id) REFERENCES ArtistProfile(artist_id) ON DELETE CASCADE
127);
128
129CREATE TABLE BookableGenre (
130 bookable_id INTEGER NOT NULL,
131 genre_id INTEGER NOT NULL,
132 PRIMARY KEY (bookable_id, genre_id),
133 FOREIGN KEY (bookable_id) REFERENCES Bookable(bookable_id) ON DELETE CASCADE,
134 FOREIGN KEY (genre_id) REFERENCES Genre(genre_id) ON DELETE CASCADE
135);
136
137CREATE TABLE PricingRule (
138 pricing_rule_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
139 bookable_id INTEGER NOT NULL,
140 duration_id INTEGER NOT NULL,
141 venue_type_id INTEGER,
142 base_price DECIMAL(10,2) NOT NULL,
143 valid_from TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
144 valid_to TIMESTAMP,
145 FOREIGN KEY (bookable_id) REFERENCES Bookable(bookable_id) ON DELETE CASCADE,
146 FOREIGN KEY (duration_id) REFERENCES PerformanceDurationOption(duration_id) ON DELETE RESTRICT,
147 FOREIGN KEY (venue_type_id) REFERENCES VenueType(venue_type_id) ON DELETE SET NULL
148);
149
150CREATE TABLE AvailabilitySlot (
151 slot_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
152 bookable_id INTEGER NOT NULL,
153 start_datetime TIMESTAMP NOT NULL,
154 end_datetime TIMESTAMP NOT NULL,
155 status VARCHAR(30) NOT NULL DEFAULT 'AVAILABLE',
156 FOREIGN KEY (bookable_id) REFERENCES Bookable(bookable_id) ON DELETE CASCADE,
157 CHECK (end_datetime > start_datetime),
158 CHECK (status IN ('AVAILABLE','BOOKED','BLOCKED'))
159);
160
161CREATE TABLE BookingRequest (
162 request_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
163 client_id INTEGER NOT NULL,
164 duration_id INTEGER NOT NULL,
165 event_type VARCHAR(100) NOT NULL,
166 event_date DATE NOT NULL,
167 location_id INTEGER,
168 venue_id INTEGER,
169 venue_type_id INTEGER,
170 FOREIGN KEY (client_id) REFERENCES ClientProfile(client_id) ON DELETE CASCADE,
171 FOREIGN KEY (duration_id) REFERENCES PerformanceDurationOption(duration_id) ON DELETE RESTRICT,
172 FOREIGN KEY (location_id) REFERENCES Location(location_id) ON DELETE SET NULL,
173 FOREIGN KEY (venue_id) REFERENCES Venue(venue_id) ON DELETE SET NULL,
174 FOREIGN KEY (venue_type_id) REFERENCES VenueType(venue_type_id) ON DELETE SET NULL
175);
176
177CREATE TABLE Offer (
178 offer_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
179 request_id INTEGER NOT NULL,
180 bookable_id INTEGER NOT NULL,
181 duration_id INTEGER NOT NULL,
182 total_price DECIMAL(10,2) NOT NULL,
183 FOREIGN KEY (request_id) REFERENCES BookingRequest(request_id) ON DELETE CASCADE,
184 FOREIGN KEY (bookable_id) REFERENCES Bookable(bookable_id) ON DELETE CASCADE,
185 FOREIGN KEY (duration_id) REFERENCES PerformanceDurationOption(duration_id) ON DELETE RESTRICT
186);
187
188CREATE TABLE Booking (
189 booking_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
190 offer_id INTEGER UNIQUE NOT NULL,
191 final_price DECIMAL(10,2) NOT NULL,
192 booking_status VARCHAR(30) NOT NULL DEFAULT 'CREATED',
193 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
194 FOREIGN KEY (offer_id) REFERENCES Offer(offer_id) ON DELETE RESTRICT,
195 CHECK (booking_status IN ('CREATED','CONFIRMED','COMPLETED','CANCELLED'))
196);
197
198CREATE TABLE BookingStatusHistory (
199 booking_status_history_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
200 booking_id INTEGER NOT NULL,
201 changed_by_user_id INTEGER,
202 new_status VARCHAR(30) NOT NULL,
203 changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
204 FOREIGN KEY (booking_id) REFERENCES Booking(booking_id) ON DELETE CASCADE,
205 FOREIGN KEY (changed_by_user_id) REFERENCES Users(user_id) ON DELETE SET NULL,
206 CHECK (new_status IN ('CREATED','CONFIRMED','COMPLETED','CANCELLED'))
207);
208
209CREATE TABLE Payment (
210 payment_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
211 booking_id INTEGER NOT NULL,
212 amount DECIMAL(10,2) NOT NULL,
213 payment_status VARCHAR(30) NOT NULL DEFAULT 'PENDING',
214 FOREIGN KEY (booking_id) REFERENCES Booking(booking_id) ON DELETE CASCADE,
215 CHECK (payment_status IN ('PAID','PENDING','FAILED'))
216);
217
218CREATE TABLE Review (
219 review_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
220 booking_id INTEGER NOT NULL,
221 rating INTEGER NOT NULL,
222 comment TEXT,
223 FOREIGN KEY (booking_id) REFERENCES Booking(booking_id) ON DELETE CASCADE,
224 CHECK (rating BETWEEN 1 AND 5)
225);
226
227CREATE TABLE Message (
228 message_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
229 sender_user_id INTEGER,
230 receiver_user_id INTEGER,
231 request_id INTEGER,
232 booking_id INTEGER,
233 content TEXT NOT NULL,
234 sent_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
235 FOREIGN KEY (sender_user_id) REFERENCES Users(user_id) ON DELETE SET NULL,
236 FOREIGN KEY (receiver_user_id) REFERENCES Users(user_id) ON DELETE SET NULL,
237 FOREIGN KEY (request_id) REFERENCES BookingRequest(request_id) ON DELETE CASCADE,
238 FOREIGN KEY (booking_id) REFERENCES Booking(booking_id) ON DELETE CASCADE
239);