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