Design: V1__initial_schema.sql

File V1__initial_schema.sql, 4.9 KB (added by 213140, 13 days ago)
Line 
1CREATE SCHEMA IF NOT EXISTS mental_health_app;
2SET search_path = mental_health_app, public;
3
4-- ========== TABLES ==========
5
6-- USER
7CREATE TABLE IF NOT EXISTS "user" (
8 id_user SERIAL PRIMARY KEY,
9 username VARCHAR(50) NOT NULL UNIQUE,
10 name VARCHAR(100) NOT NULL,
11 surname VARCHAR(100) NOT NULL,
12 email VARCHAR(255) NOT NULL UNIQUE,
13 password VARCHAR(255) NOT NULL
14);
15
16-- THERAPIST (extends USER)
17CREATE TABLE IF NOT EXISTS therapist (
18 id_user INTEGER PRIMARY KEY,
19 office_location VARCHAR(255) NOT NULL,
20 degree VARCHAR(100) NOT NULL,
21 years_exp INTEGER NOT NULL CHECK (years_exp >= 0),
22 consultation_slots DATE[],
23 CONSTRAINT fk_therapist_user
24 FOREIGN KEY (id_user) REFERENCES "user"(id_user)
25 ON UPDATE CASCADE ON DELETE CASCADE
26);
27
28-- PATIENT (extends USER)
29CREATE TABLE IF NOT EXISTS patient (
30 id_user INTEGER PRIMARY KEY,
31 id_therapist INTEGER,
32 CONSTRAINT fk_patient_user
33 FOREIGN KEY (id_user) REFERENCES "user"(id_user)
34 ON UPDATE CASCADE ON DELETE CASCADE,
35 CONSTRAINT fk_patient_therapist
36 FOREIGN KEY (id_therapist) REFERENCES therapist(id_user)
37 ON UPDATE CASCADE ON DELETE SET NULL
38);
39
40-- BLOG
41CREATE TABLE IF NOT EXISTS blog (
42 id_blog SERIAL PRIMARY KEY,
43 id_patient INTEGER NOT NULL,
44 content TEXT NOT NULL,
45 title VARCHAR(200) NOT NULL,
46 date_of_post TIMESTAMPTZ NOT NULL DEFAULT NOW(),
47 CONSTRAINT fk_blog_patient
48 FOREIGN KEY (id_patient) REFERENCES patient(id_user)
49 ON UPDATE CASCADE ON DELETE CASCADE
50);
51
52-- COMMENT
53CREATE TABLE IF NOT EXISTS comment (
54 id_comment SERIAL PRIMARY KEY,
55 id_blog INTEGER NOT NULL,
56 id_patient INTEGER NOT NULL,
57 content TEXT NOT NULL,
58 date_of_comment TIMESTAMPTZ NOT NULL DEFAULT NOW(),
59 CONSTRAINT fk_comment_blog
60 FOREIGN KEY (id_blog) REFERENCES blog(id_blog)
61 ON UPDATE CASCADE ON DELETE CASCADE,
62 CONSTRAINT fk_comment_patient
63 FOREIGN KEY (id_patient) REFERENCES patient(id_user)
64 ON UPDATE CASCADE ON DELETE CASCADE
65);
66
67-- DIARY
68CREATE TABLE IF NOT EXISTS diary (
69 id_diary SERIAL PRIMARY KEY,
70 id_patient INTEGER NOT NULL,
71 date DATE NOT NULL,
72 daily_rating SMALLINT NOT NULL CHECK (daily_rating BETWEEN 1 AND 10),
73 content TEXT NOT NULL,
74 CONSTRAINT uq_diary_patient_date UNIQUE (id_patient, date),
75 CONSTRAINT fk_diary_patient
76 FOREIGN KEY (id_patient) REFERENCES patient(id_user)
77 ON UPDATE CASCADE ON DELETE CASCADE
78);
79
80-- CONSULTATION
81CREATE TABLE IF NOT EXISTS consultation (
82 id_consultation SERIAL PRIMARY KEY,
83 id_patient INTEGER NOT NULL,
84 id_therapist INTEGER NOT NULL,
85 date DATE NOT NULL,
86 date_of_payment DATE NULL,
87 price DECIMAL(10,2) NOT NULL CHECK (price >= 0),
88 advice TEXT,
89 CONSTRAINT fk_consultation_patient
90 FOREIGN KEY (id_patient) REFERENCES patient(id_user)
91 ON UPDATE CASCADE ON DELETE CASCADE,
92 CONSTRAINT fk_consultation_therapist
93 FOREIGN KEY (id_therapist) REFERENCES therapist(id_user)
94 ON UPDATE CASCADE ON DELETE CASCADE
95);
96
97-- THERAPY
98CREATE TABLE IF NOT EXISTS therapy (
99 id_therapy SERIAL PRIMARY KEY,
100 name VARCHAR(100) NOT NULL,
101 dose VARCHAR(50) NOT NULL,
102 exp_date DATE NOT NULL,
103 id_consultation INTEGER NOT NULL,
104 CONSTRAINT fk_therapy_consultation
105 FOREIGN KEY (id_consultation) REFERENCES consultation(id_consultation)
106 ON UPDATE CASCADE ON DELETE CASCADE
107);
108
109-- ========== RELATIONS ==========
110
111-- Likes: patients <-> blogs
112CREATE TABLE IF NOT EXISTS patient_likes_blog (
113 id_patient INTEGER NOT NULL,
114 id_blog INTEGER NOT NULL,
115 PRIMARY KEY (id_patient, id_blog),
116 CONSTRAINT fk_plb_patient
117 FOREIGN KEY (id_patient) REFERENCES patient(id_user)
118 ON UPDATE CASCADE ON DELETE CASCADE,
119 CONSTRAINT fk_plb_blog
120 FOREIGN KEY (id_blog) REFERENCES blog(id_blog)
121 ON UPDATE CASCADE ON DELETE CASCADE
122);
123
124-- ========== INDEXES ==========
125CREATE INDEX IF NOT EXISTS idx_patient_therapist
126 ON patient (id_therapist);
127
128CREATE INDEX IF NOT EXISTS idx_blog_patient_date
129 ON blog (id_patient, date_of_post DESC);
130
131CREATE INDEX IF NOT EXISTS idx_comment_blog_date
132 ON comment (id_blog, date_of_comment DESC);
133
134CREATE INDEX IF NOT EXISTS idx_consultation_patient_date
135 ON consultation (id_patient, date DESC);
136
137CREATE INDEX IF NOT EXISTS idx_consultation_therapist_date
138 ON consultation (id_therapist, date DESC);
139