RelationalDesign: ddl.sql

File ddl.sql, 23.1 KB (added by 231175, 12 hours ago)
Line 
1
2DROP TABLE IF EXISTS user_favorite_course CASCADE;
3DROP TABLE IF EXISTS meeting_email_reminder CASCADE;
4DROP TABLE IF EXISTS course_tag CASCADE;
5DROP TABLE IF EXISTS user_tag CASCADE;
6DROP TABLE IF EXISTS tag_translate CASCADE;
7DROP TABLE IF EXISTS tag CASCADE;
8DROP TABLE IF EXISTS verification_token CASCADE;
9DROP TABLE IF EXISTS user_course_progress CASCADE;
10DROP TABLE IF EXISTS review CASCADE;
11DROP TABLE IF EXISTS payment CASCADE;
12DROP TABLE IF EXISTS enrollment CASCADE;
13DROP TABLE IF EXISTS course_lecture_translate CASCADE;
14DROP TABLE IF EXISTS course_lecture CASCADE;
15DROP TABLE IF EXISTS course_content_translate CASCADE;
16DROP TABLE IF EXISTS course_content CASCADE;
17DROP TABLE IF EXISTS course_translate CASCADE;
18DROP TABLE IF EXISTS course_version CASCADE;
19DROP TABLE IF EXISTS course CASCADE;
20DROP TABLE IF EXISTS expert CASCADE;
21DROP TABLE IF EXISTS "user" CASCADE;
22DROP TABLE IF EXISTS account CASCADE;
23DROP TABLE IF EXISTS language CASCADE;
24
25DROP TYPE IF EXISTS login_provider CASCADE;
26DROP TYPE IF EXISTS company_size CASCADE;
27DROP TYPE IF EXISTS enrollment_status CASCADE;
28DROP TYPE IF EXISTS payment_method CASCADE;
29DROP TYPE IF EXISTS payment_status CASCADE;
30DROP TYPE IF EXISTS difficulty CASCADE;
31DROP TYPE IF EXISTS content_type CASCADE;
32DROP TYPE IF EXISTS tag_type CASCADE;
33
34-- -----------------------------------------------------------------------------
35-- Enum types
36-- -----------------------------------------------------------------------------
37CREATE TYPE login_provider AS ENUM ('local', 'google');
38CREATE TYPE company_size AS ENUM ('freelance', 'micro', 'small', 'medium', 'mid_market', 'enterprise', 'other');
39CREATE TYPE enrollment_status AS ENUM ('pending', 'active', 'completed');
40CREATE TYPE payment_method AS ENUM ('card', 'paypal', 'casys');
41CREATE TYPE payment_status AS ENUM ('pending', 'completed', 'failed');
42CREATE TYPE difficulty AS ENUM ('beginner', 'intermediate', 'advanced', 'expert');
43CREATE TYPE content_type AS ENUM ('text', 'file', 'video', 'quiz');
44CREATE TYPE tag_type AS ENUM ('skill', 'topic');
45
46-- -----------------------------------------------------------------------------
47-- 22. language
48-- -----------------------------------------------------------------------------
49CREATE TABLE language (
50 id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
51 value varchar(64) NOT NULL,
52 CONSTRAINT uq_language_value UNIQUE (value)
53);
54
55-- -----------------------------------------------------------------------------
56-- 1. account
57-- -----------------------------------------------------------------------------
58CREATE TABLE account (
59 id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
60 email varchar(320) NOT NULL,
61 password_hash varchar(255) NOT NULL,
62 name varchar(255) NOT NULL,
63 CONSTRAINT uq_account_email UNIQUE (email)
64);
65
66-- -----------------------------------------------------------------------------
67-- 2. "user"
68-- -----------------------------------------------------------------------------
69CREATE TABLE "user" (
70 user_id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
71 name varchar(255) NOT NULL,
72 email varchar(320) NOT NULL,
73 password_hash varchar(255) NOT NULL,
74 login_provider login_provider NOT NULL,
75 is_verified boolean NOT NULL DEFAULT false,
76 is_profile_complete boolean NOT NULL DEFAULT false,
77 has_used_free_consultation boolean NOT NULL DEFAULT false,
78 work_position varchar(255) NOT NULL,
79 company_size company_size NOT NULL,
80 points integer NOT NULL DEFAULT 0,
81 account_id bigint NOT NULL,
82 CONSTRAINT uq_user_email UNIQUE (email),
83 CONSTRAINT uq_user_account_id UNIQUE (account_id),
84 CONSTRAINT fk_user_account FOREIGN KEY (account_id)
85 REFERENCES account (id) ON DELETE CASCADE,
86 CONSTRAINT ck_user_points_non_negative CHECK (points >= 0)
87);
88
89-- -----------------------------------------------------------------------------
90-- 3. expert
91-- -----------------------------------------------------------------------------
92CREATE TABLE expert (
93 expert_id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
94 account_id bigint NOT NULL,
95 CONSTRAINT uq_expert_account_id UNIQUE (account_id),
96 CONSTRAINT fk_expert_account FOREIGN KEY (account_id)
97 REFERENCES account (id) ON DELETE CASCADE
98);
99
100-- -----------------------------------------------------------------------------
101-- 8. course
102-- -----------------------------------------------------------------------------
103CREATE TABLE course (
104 course_id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
105 color varchar(32) NOT NULL,
106 difficulty difficulty NOT NULL,
107 duration_minutes integer NOT NULL,
108 image_url varchar(1024) NOT NULL,
109 price numeric(12,2) NOT NULL,
110 CONSTRAINT ck_course_duration_positive CHECK (duration_minutes > 0),
111 CONSTRAINT ck_course_price_non_negative CHECK (price >= 0)
112);
113
114-- -----------------------------------------------------------------------------
115-- 7. course_version
116-- -----------------------------------------------------------------------------
117CREATE TABLE course_version (
118 course_version_id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
119 version_number integer NOT NULL,
120 created_at date NOT NULL,
121 is_active boolean NOT NULL DEFAULT false,
122 course_id bigint NOT NULL,
123 CONSTRAINT uq_course_version_number UNIQUE (course_id, version_number),
124 CONSTRAINT fk_course_version_course FOREIGN KEY (course_id)
125 REFERENCES course (course_id) ON DELETE CASCADE,
126 CONSTRAINT ck_course_version_number_positive CHECK (version_number > 0)
127);
128
129-- Only one active version per course.
130CREATE UNIQUE INDEX uq_course_version_one_active
131 ON course_version (course_id) WHERE is_active;
132
133-- -----------------------------------------------------------------------------
134-- 9. course_translate
135-- -----------------------------------------------------------------------------
136CREATE TABLE course_translate (
137 course_translate_id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
138 description_short text NOT NULL,
139 description text NOT NULL,
140 description_long text NOT NULL,
141 title_short varchar(255) NOT NULL,
142 title varchar(512) NOT NULL,
143 what_will_be_learned text[] NOT NULL,
144 course_id bigint NOT NULL,
145 language_id bigint NOT NULL,
146 CONSTRAINT uq_course_translate UNIQUE (course_id, language_id),
147 CONSTRAINT fk_course_translate_course FOREIGN KEY (course_id)
148 REFERENCES course (course_id) ON DELETE CASCADE,
149 CONSTRAINT fk_course_translate_language FOREIGN KEY (language_id)
150 REFERENCES language (id) ON DELETE RESTRICT
151);
152
153-- -----------------------------------------------------------------------------
154-- 10. course_content
155-- -----------------------------------------------------------------------------
156CREATE TABLE course_content (
157 course_content_id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
158 position integer NOT NULL,
159 course_version_id bigint NOT NULL,
160 CONSTRAINT uq_course_content_position UNIQUE (course_version_id, position),
161 CONSTRAINT fk_course_content_version FOREIGN KEY (course_version_id)
162 REFERENCES course_version (course_version_id) ON DELETE CASCADE,
163 CONSTRAINT ck_course_content_position_positive CHECK (position > 0)
164);
165
166-- -----------------------------------------------------------------------------
167-- 11. course_content_translate
168-- -----------------------------------------------------------------------------
169CREATE TABLE course_content_translate (
170 course_content_translate_id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
171 title varchar(512) NOT NULL,
172 course_content_id bigint NOT NULL,
173 language_id bigint NOT NULL,
174 CONSTRAINT uq_course_content_translate UNIQUE (course_content_id, language_id),
175 CONSTRAINT fk_cct_content FOREIGN KEY (course_content_id)
176 REFERENCES course_content (course_content_id) ON DELETE CASCADE,
177 CONSTRAINT fk_cct_language FOREIGN KEY (language_id)
178 REFERENCES language (id) ON DELETE RESTRICT
179);
180
181-- -----------------------------------------------------------------------------
182-- 12. course_lecture
183-- -----------------------------------------------------------------------------
184CREATE TABLE course_lecture (
185 course_lecture_id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
186 position integer NOT NULL,
187 duration_minutes integer NOT NULL,
188 content_type content_type NOT NULL,
189 course_content_id bigint NOT NULL,
190 CONSTRAINT uq_course_lecture_position UNIQUE (course_content_id, position),
191 CONSTRAINT fk_course_lecture_content FOREIGN KEY (course_content_id)
192 REFERENCES course_content (course_content_id) ON DELETE CASCADE,
193 CONSTRAINT ck_course_lecture_position_positive CHECK (position > 0),
194 CONSTRAINT ck_course_lecture_duration_positive CHECK (duration_minutes > 0)
195);
196
197-- -----------------------------------------------------------------------------
198-- 13. course_lecture_translate
199-- -----------------------------------------------------------------------------
200CREATE TABLE course_lecture_translate (
201 course_lecture_translate_id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
202 content_file_name varchar(512),
203 content_text text,
204 description text NOT NULL,
205 title varchar(512) NOT NULL,
206 course_lecture_id bigint NOT NULL,
207 language_id bigint NOT NULL,
208 CONSTRAINT uq_course_lecture_translate UNIQUE (course_lecture_id, language_id),
209 CONSTRAINT fk_clt_lecture FOREIGN KEY (course_lecture_id)
210 REFERENCES course_lecture (course_lecture_id) ON DELETE CASCADE,
211 CONSTRAINT fk_clt_language FOREIGN KEY (language_id)
212 REFERENCES language (id) ON DELETE RESTRICT
213);
214
215-- -----------------------------------------------------------------------------
216-- 4. enrollment
217-- -----------------------------------------------------------------------------
218CREATE TABLE enrollment (
219 enrollment_id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
220 enrollment_status enrollment_status NOT NULL,
221 activation_date date,
222 completion_date date,
223 purchase_date date NOT NULL,
224 user_id bigint NOT NULL,
225 course_version_id bigint NOT NULL,
226 CONSTRAINT uq_enrollment_user_version UNIQUE (user_id, course_version_id),
227 CONSTRAINT fk_enrollment_user FOREIGN KEY (user_id)
228 REFERENCES "user" (user_id) ON DELETE CASCADE,
229 CONSTRAINT fk_enrollment_course_version FOREIGN KEY (course_version_id)
230 REFERENCES course_version (course_version_id) ON DELETE RESTRICT,
231 CONSTRAINT ck_enrollment_status_dates CHECK (
232 (enrollment_status = 'pending' AND activation_date IS NULL AND completion_date IS NULL)
233 OR (enrollment_status = 'active' AND activation_date IS NOT NULL AND completion_date IS NULL)
234 OR (enrollment_status = 'completed' AND activation_date IS NOT NULL AND completion_date IS NOT NULL)
235 )
236);
237
238-- -----------------------------------------------------------------------------
239-- 5. payment
240-- -----------------------------------------------------------------------------
241CREATE TABLE payment (
242 payment_id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
243 amount numeric(12,2) NOT NULL,
244 payment_date date NOT NULL,
245 payment_method payment_method NOT NULL,
246 payment_status payment_status NOT NULL,
247 enrollment_id bigint NOT NULL,
248 CONSTRAINT fk_payment_enrollment FOREIGN KEY (enrollment_id)
249 REFERENCES enrollment (enrollment_id) ON DELETE RESTRICT,
250 CONSTRAINT ck_payment_amount_non_negative CHECK (amount >= 0)
251);
252
253-- -----------------------------------------------------------------------------
254-- 6. review
255-- -----------------------------------------------------------------------------
256CREATE TABLE review (
257 review_id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
258 rating integer NOT NULL,
259 comment text NOT NULL,
260 review_date date NOT NULL,
261 enrollment_id bigint NOT NULL,
262 CONSTRAINT uq_review_enrollment UNIQUE (enrollment_id),
263 CONSTRAINT fk_review_enrollment FOREIGN KEY (enrollment_id)
264 REFERENCES enrollment (enrollment_id) ON DELETE CASCADE,
265 CONSTRAINT ck_review_rating_range CHECK (rating BETWEEN 1 AND 5)
266);
267
268-- -----------------------------------------------------------------------------
269-- 14. user_course_progress
270-- -----------------------------------------------------------------------------
271CREATE TABLE user_course_progress (
272 user_course_progress_id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
273 is_completed boolean NOT NULL DEFAULT false,
274 completed_at timestamp,
275 course_lecture_id bigint NOT NULL,
276 enrollment_id bigint NOT NULL,
277 CONSTRAINT uq_ucp UNIQUE (enrollment_id, course_lecture_id),
278 CONSTRAINT fk_ucp_lecture FOREIGN KEY (course_lecture_id)
279 REFERENCES course_lecture (course_lecture_id) ON DELETE CASCADE,
280 CONSTRAINT fk_ucp_enrollment FOREIGN KEY (enrollment_id)
281 REFERENCES enrollment (enrollment_id) ON DELETE CASCADE,
282 CONSTRAINT ck_ucp_completed CHECK (
283 (is_completed AND completed_at IS NOT NULL) OR (NOT is_completed AND completed_at IS NULL)
284 )
285);
286
287-- -----------------------------------------------------------------------------
288-- 15. verification_token
289-- -----------------------------------------------------------------------------
290CREATE TABLE verification_token (
291 verification_token_uuid uuid PRIMARY KEY DEFAULT gen_random_uuid(),
292 expires_at timestamp NOT NULL,
293 created_at timestamp NOT NULL DEFAULT now(),
294 user_id bigint NOT NULL,
295 CONSTRAINT fk_verification_token_user FOREIGN KEY (user_id)
296 REFERENCES "user" (user_id) ON DELETE CASCADE,
297 CONSTRAINT ck_verification_token_expiry CHECK (expires_at > created_at)
298);
299
300-- -----------------------------------------------------------------------------
301-- 16. tag
302-- -----------------------------------------------------------------------------
303CREATE TABLE tag (
304 tag_id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
305 tag_type tag_type NOT NULL
306);
307
308-- -----------------------------------------------------------------------------
309-- 17. tag_translate
310-- -----------------------------------------------------------------------------
311CREATE TABLE tag_translate (
312 tag_translate_id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
313 value varchar(255) NOT NULL,
314 tag_id bigint NOT NULL,
315 language_id bigint NOT NULL,
316 CONSTRAINT uq_tag_translate UNIQUE (tag_id, language_id),
317 CONSTRAINT fk_tag_translate_tag FOREIGN KEY (tag_id)
318 REFERENCES tag (tag_id) ON DELETE CASCADE,
319 CONSTRAINT fk_tag_translate_language FOREIGN KEY (language_id)
320 REFERENCES language (id) ON DELETE RESTRICT
321);
322
323-- -----------------------------------------------------------------------------
324-- 18. user_tag
325-- -----------------------------------------------------------------------------
326CREATE TABLE user_tag (
327 tag_id bigint NOT NULL,
328 user_id bigint NOT NULL,
329 CONSTRAINT pk_user_tag PRIMARY KEY (user_id, tag_id),
330 CONSTRAINT fk_user_tag_tag FOREIGN KEY (tag_id)
331 REFERENCES tag (tag_id) ON DELETE CASCADE,
332 CONSTRAINT fk_user_tag_user FOREIGN KEY (user_id)
333 REFERENCES "user" (user_id) ON DELETE CASCADE
334);
335
336-- -----------------------------------------------------------------------------
337-- 19. course_tag
338-- -----------------------------------------------------------------------------
339CREATE TABLE course_tag (
340 tag_id bigint NOT NULL,
341 course_id bigint NOT NULL,
342 CONSTRAINT pk_course_tag PRIMARY KEY (course_id, tag_id),
343 CONSTRAINT fk_course_tag_tag FOREIGN KEY (tag_id)
344 REFERENCES tag (tag_id) ON DELETE CASCADE,
345 CONSTRAINT fk_course_tag_course FOREIGN KEY (course_id)
346 REFERENCES course (course_id) ON DELETE CASCADE
347);
348
349-- -----------------------------------------------------------------------------
350-- 20. meeting_email_reminder
351-- -----------------------------------------------------------------------------
352CREATE TABLE meeting_email_reminder (
353 id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
354 meeting_at timestamp NOT NULL,
355 scheduled_at timestamp NOT NULL,
356 sent boolean NOT NULL DEFAULT false,
357 meeting_link varchar(1024) NOT NULL,
358 user_id bigint NOT NULL,
359 CONSTRAINT fk_mer_user FOREIGN KEY (user_id)
360 REFERENCES "user" (user_id) ON DELETE CASCADE
361);
362
363-- -----------------------------------------------------------------------------
364-- 21. user_favorite_course
365-- -----------------------------------------------------------------------------
366CREATE TABLE user_favorite_course (
367 user_id bigint NOT NULL,
368 course_id bigint NOT NULL,
369 CONSTRAINT pk_user_favorite_course PRIMARY KEY (user_id, course_id),
370 CONSTRAINT fk_ufc_user FOREIGN KEY (user_id)
371 REFERENCES "user" (user_id) ON DELETE CASCADE,
372 CONSTRAINT fk_ufc_course FOREIGN KEY (course_id)
373 REFERENCES course (course_id) ON DELETE CASCADE
374);