| | 1 | = Logical and Physical Design, DB Creation (DDL) |
| | 2 | == DDL |
| | 3 | {{{ |
| | 4 | |
| | 5 | CREATE TABLE "User" ( |
| | 6 | user_id BIGSERIAL PRIMARY KEY, |
| | 7 | username VARCHAR(50) NOT NULL UNIQUE, |
| | 8 | email VARCHAR(255) NOT NULL UNIQUE, |
| | 9 | role VARCHAR(30) NOT NULL, |
| | 10 | fullname VARCHAR(100), |
| | 11 | name VARCHAR(50), |
| | 12 | surname VARCHAR(50), |
| | 13 | created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() |
| | 14 | ); |
| | 15 | |
| | 16 | |
| | 17 | CREATE TABLE "VetClinic" ( |
| | 18 | clinic_id BIGSERIAL PRIMARY KEY, |
| | 19 | name VARCHAR(100) NOT NULL, |
| | 20 | address VARCHAR(200), |
| | 21 | city VARCHAR(80), |
| | 22 | location VARCHAR(100), |
| | 23 | email VARCHAR(255), |
| | 24 | phone VARCHAR(30) |
| | 25 | ); |
| | 26 | |
| | 27 | CREATE TABLE "Animal" ( |
| | 28 | animal_id BIGSERIAL PRIMARY KEY, |
| | 29 | owner_id BIGINT NOT NULL, |
| | 30 | name VARCHAR(80) NOT NULL, |
| | 31 | species VARCHAR(50), |
| | 32 | type VARCHAR(50), |
| | 33 | breed VARCHAR(80), |
| | 34 | sex VARCHAR(10), |
| | 35 | date_of_birth DATE, |
| | 36 | located VARCHAR(100), |
| | 37 | photo_url TEXT, |
| | 38 | CONSTRAINT fk_animal_owner |
| | 39 | FOREIGN KEY (owner_id) |
| | 40 | REFERENCES "User"(user_id) |
| | 41 | ON DELETE CASCADE |
| | 42 | ); |
| | 43 | |
| | 44 | |
| | 45 | CREATE TABLE "Listing" ( |
| | 46 | listing_id BIGSERIAL PRIMARY KEY, |
| | 47 | user_id BIGINT NOT NULL, |
| | 48 | animal_id BIGINT NOT NULL, |
| | 49 | status VARCHAR(30) NOT NULL, |
| | 50 | price NUMERIC(10,2) NOT NULL, |
| | 51 | description TEXT, |
| | 52 | created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), |
| | 53 | CONSTRAINT fk_listing_user |
| | 54 | FOREIGN KEY (user_id) |
| | 55 | REFERENCES "User"(user_id) |
| | 56 | ON DELETE CASCADE, |
| | 57 | CONSTRAINT fk_listing_animal |
| | 58 | FOREIGN KEY (animal_id) |
| | 59 | REFERENCES "Animal"(animal_id) |
| | 60 | ON DELETE CASCADE |
| | 61 | ); |
| | 62 | |
| | 63 | CREATE TABLE "Appointment" ( |
| | 64 | appointment_id BIGSERIAL PRIMARY KEY, |
| | 65 | animal_id BIGINT NOT NULL, |
| | 66 | clinic_id BIGINT NOT NULL, |
| | 67 | date_time TIMESTAMPTZ NOT NULL, |
| | 68 | status VARCHAR(30) NOT NULL, |
| | 69 | notes TEXT, |
| | 70 | CONSTRAINT fk_appt_animal |
| | 71 | FOREIGN KEY (animal_id) |
| | 72 | REFERENCES "Animal"(animal_id) |
| | 73 | ON DELETE CASCADE, |
| | 74 | CONSTRAINT fk_appt_clinic |
| | 75 | FOREIGN KEY (clinic_id) |
| | 76 | REFERENCES "VetClinic"(clinic_id) |
| | 77 | ON DELETE CASCADE |
| | 78 | ); |
| | 79 | |
| | 80 | |
| | 81 | CREATE TABLE "HealthRecord" ( |
| | 82 | healthrecord_id BIGSERIAL PRIMARY KEY, |
| | 83 | animal_id BIGINT NOT NULL, |
| | 84 | appointment_id BIGINT, |
| | 85 | clinic_id BIGINT, |
| | 86 | type VARCHAR(50), |
| | 87 | description TEXT, |
| | 88 | date DATE NOT NULL, |
| | 89 | CONSTRAINT fk_hr_animal |
| | 90 | FOREIGN KEY (animal_id) |
| | 91 | REFERENCES "Animal"(animal_id) |
| | 92 | ON DELETE CASCADE, |
| | 93 | CONSTRAINT fk_hr_appt |
| | 94 | FOREIGN KEY (appointment_id) |
| | 95 | REFERENCES "Appointment"(appointment_id) |
| | 96 | ON DELETE SET NULL, |
| | 97 | CONSTRAINT fk_hr_clinic |
| | 98 | FOREIGN KEY (clinic_id) |
| | 99 | REFERENCES "VetClinic"(clinic_id) |
| | 100 | ON DELETE SET NULL |
| | 101 | ); |
| | 102 | |
| | 103 | CREATE TABLE "Notification" ( |
| | 104 | notification_id BIGSERIAL PRIMARY KEY, |
| | 105 | user_id BIGINT NOT NULL, |
| | 106 | message TEXT NOT NULL, |
| | 107 | type VARCHAR(50), |
| | 108 | is_read BOOLEAN NOT NULL DEFAULT FALSE, |
| | 109 | created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), |
| | 110 | CONSTRAINT fk_notification_user |
| | 111 | FOREIGN KEY (user_id) |
| | 112 | REFERENCES "User"(user_id) |
| | 113 | ON DELETE CASCADE |
| | 114 | ); |
| | 115 | |
| | 116 | |
| | 117 | CREATE TABLE "Review" ( |
| | 118 | review_id BIGSERIAL PRIMARY KEY, |
| | 119 | reviewer_id BIGINT NOT NULL, |
| | 120 | target_user_id BIGINT, |
| | 121 | target_clinic_id BIGINT, |
| | 122 | rating SMALLINT NOT NULL CHECK (rating BETWEEN 1 AND 5), |
| | 123 | comment TEXT, |
| | 124 | created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), |
| | 125 | CONSTRAINT fk_review_reviewer |
| | 126 | FOREIGN KEY (reviewer_id) |
| | 127 | REFERENCES "User"(user_id) |
| | 128 | ON DELETE CASCADE, |
| | 129 | CONSTRAINT fk_review_target_user |
| | 130 | FOREIGN KEY (target_user_id) |
| | 131 | REFERENCES "User"(user_id) |
| | 132 | ON DELETE CASCADE, |
| | 133 | CONSTRAINT fk_review_target_clinic |
| | 134 | FOREIGN KEY (target_clinic_id) |
| | 135 | REFERENCES "VetClinic"(clinic_id) |
| | 136 | ON DELETE CASCADE, |
| | 137 | CONSTRAINT review_must_have_target |
| | 138 | CHECK (target_user_id IS NOT NULL OR target_clinic_id IS NOT NULL) |
| | 139 | ); |
| | 140 | |
| | 141 | }}} |
| | 142 | == DML |