1+ CREATE TABLE IF NOT EXISTS academic_staff (
2+ id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY ,
3+ first_name TEXT NOT NULL ,
4+ last_name TEXT NOT NULL ,
5+ academic_rank TEXT ,
6+ committee_time INT CHECK (committee_time IS NULL OR committee_time >= 0 ),
7+ UNIQUE (first_name, last_name, academic_rank)
8+ );
9+
10+ CREATE TABLE IF NOT EXISTS staff_availability (
11+ id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY ,
12+ staff_id BIGINT NOT NULL REFERENCES academic_staff(id) ON DELETE CASCADE ,
13+ availability_date DATE NOT NULL ,
14+ start_time TIME NOT NULL ,
15+ end_time TIME NOT NULL ,
16+ CHECK (end_time > start_time)
17+ );
18+
19+ CREATE TABLE IF NOT EXISTS soft_constraints (
20+ id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY ,
21+ staff_id BIGINT NOT NULL REFERENCES academic_staff(id) ON DELETE CASCADE ,
22+ colleague_id BIGINT NOT NULL REFERENCES academic_staff(id) ON DELETE CASCADE ,
23+ likes BOOLEAN NOT NULL ,
24+ CHECK (staff_id <> colleague_id),
25+ UNIQUE (staff_id, colleague_id)
26+ );
27+
28+ CREATE TABLE IF NOT EXISTS theses (
29+ id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY ,
30+ student_first_name TEXT NOT NULL ,
31+ student_last_name TEXT NOT NULL ,
32+ reviewer_id BIGINT NOT NULL REFERENCES academic_staff(id) ON DELETE RESTRICT,
33+ supervisor_id BIGINT NOT NULL REFERENCES academic_staff(id) ON DELETE RESTRICT,
34+ field_of_study TEXT NOT NULL ,
35+ thesis_title TEXT NOT NULL ,
36+ CHECK (reviewer_id <> supervisor_id)
37+ );
38+
39+ CREATE TABLE IF NOT EXISTS defense_schedule (
40+ id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY ,
41+ defense_date DATE NOT NULL ,
42+ chairman_id BIGINT NOT NULL REFERENCES academic_staff(id) ON DELETE RESTRICT,
43+ member2_id BIGINT NOT NULL REFERENCES academic_staff(id) ON DELETE RESTRICT,
44+ member3_id BIGINT NOT NULL REFERENCES academic_staff(id) ON DELETE RESTRICT,
45+ start_time TIME NOT NULL ,
46+ end_time TIME NOT NULL ,
47+ thesis_count INT NOT NULL CHECK (thesis_count >= 0 ),
48+ CHECK (end_time > start_time),
49+ CHECK (chairman_id <> member2_id
50+ AND chairman_id <> member3_id
51+ AND member2_id <> member3_id)
52+ );
53+
54+ CREATE TABLE IF NOT EXISTS committee_thesis_assignment (
55+ id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY ,
56+ defense_schedule_id BIGINT NOT NULL REFERENCES defense_schedule(id) ON DELETE CASCADE ,
57+ thesis_id BIGINT NOT NULL REFERENCES theses(id) ON DELETE CASCADE ,
58+ assignment_order INT NOT NULL ,
59+ UNIQUE (thesis_id),
60+ UNIQUE (defense_schedule_id, assignment_order)
61+ );
62+
63+ CREATE INDEX IF NOT EXISTS idx_staff_availability_staff_time
64+ ON staff_availability (staff_id, availability_date, start_time, end_time);
65+
66+ CREATE INDEX IF NOT EXISTS idx_soft_constraints_colleague
67+ ON soft_constraints (colleague_id);
68+
69+ CREATE INDEX IF NOT EXISTS idx_theses_reviewer
70+ ON theses (reviewer_id);
71+
72+ CREATE INDEX IF NOT EXISTS idx_theses_supervisor
73+ ON theses (supervisor_id);
74+
75+ CREATE INDEX IF NOT EXISTS idx_defsch_chairman
76+ ON defense_schedule (chairman_id);
77+
78+ CREATE INDEX IF NOT EXISTS idx_defsch_member2
79+ ON defense_schedule (member2_id);
80+
81+ CREATE INDEX IF NOT EXISTS idx_defsch_member3
82+ ON defense_schedule (member3_id);
83+
84+ CREATE INDEX IF NOT EXISTS idx_defsch_start_time
85+ ON defense_schedule (start_time);
86+
87+ CREATE INDEX IF NOT EXISTS idx_committee_thesis_defense
88+ ON committee_thesis_assignment (defense_schedule_id);
89+
90+ CREATE INDEX IF NOT EXISTS idx_committee_thesis_thesis
91+ ON committee_thesis_assignment (thesis_id);
0 commit comments