Changes between Initial Version and Version 1 of DdlScript


Ignore:
Timestamp:
05/04/26 11:30:12 (3 weeks ago)
Author:
231141
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DdlScript

    v1 v1  
     1{{{
     2#!sql
     3CREATE TABLE UserAccount (
     4    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
     5    email VARCHAR(255) NOT NULL UNIQUE,
     6    name VARCHAR(100) NOT NULL,
     7    surname VARCHAR(100) NOT NULL,
     8    phone_number VARCHAR(20) NOT NULL UNIQUE,
     9    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
     10    updated_at TIMESTAMP,
     11    deleted_at TIMESTAMP,
     12
     13    CONSTRAINT chk_user_updated_at CHECK (updated_at IS NULL OR updated_at >= created_at),
     14    CONSTRAINT chk_user_deleted_at CHECK (deleted_at IS NULL OR deleted_at >= created_at),
     15    CONSTRAINT chk_email CHECK (email ~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'),
     16    CONSTRAINT chk_phone CHECK (phone_number ~ '^\+?[0-9]{7,15}$'),
     17    CONSTRAINT chk_user_created_at CHECK (created_at <= CURRENT_TIMESTAMP)
     18);
     19
     20CREATE TABLE Location (
     21    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
     22    city VARCHAR(100) NOT NULL,
     23    latitude DECIMAL(9,6) NOT NULL,
     24    longitude DECIMAL(9,6) NOT NULL,
     25    CONSTRAINT uq_location_cords UNIQUE (latitude, longitude),
     26    CONSTRAINT chk_latitude CHECK (latitude BETWEEN -90 AND 90),
     27    CONSTRAINT chk_longitude CHECK (longitude BETWEEN -180 AND 180)
     28);
     29
     30CREATE TABLE Category (
     31    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
     32    category_name VARCHAR(100) NOT NULL UNIQUE,
     33    description VARCHAR(500),
     34    parent_category_id INT,
     35    CONSTRAINT fk_category_parent
     36        FOREIGN KEY (parent_category_id)
     37        REFERENCES Category(id)
     38        ON DELETE SET NULL
     39);
     40
     41CREATE TABLE NotificationType (
     42    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
     43    name VARCHAR(100) NOT NULL,
     44    description VARCHAR(500)
     45);
     46
     47CREATE TABLE Badge (
     48    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
     49    badge_name VARCHAR(100) NOT NULL,
     50    description VARCHAR(500),
     51    category_id INT NOT NULL,
     52    min_price INT,
     53    max_price INT,
     54    tier_level INT,
     55
     56    CONSTRAINT chk_min_price CHECK (min_price >= 0),
     57    CONSTRAINT chk_max_price CHECK (max_price >= 0),
     58    CONSTRAINT chk_price_range CHECK (min_price <= max_price),
     59    CONSTRAINT chk_tier_range CHECK (1<=tier_level and 5>=tier_level),
     60
     61    CONSTRAINT fk_badge_category
     62        FOREIGN KEY (category_id)
     63        REFERENCES Category(id)
     64        ON DELETE RESTRICT
     65);
     66
     67CREATE TABLE Worker (
     68    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
     69    user_id INT NOT NULL,
     70    work_mode VARCHAR(20) NOT NULL,
     71    service_radius_km INT NOT NULL,
     72    location_id INT NOT NULL,
     73    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
     74    updated_at TIMESTAMP,
     75
     76    CONSTRAINT chk_worker_created_at CHECK (created_at<=CURRENT_TIMESTAMP),
     77    CONSTRAINT chk_worker_updated_at CHECK (updated_at IS NULL OR updated_at >= created_at),
     78    CONSTRAINT chk_radius CHECK (service_radius_km > 0),
     79    CONSTRAINT chk_worker_work_mode CHECK (work_mode IN ('HYBRID','ONSITE','REMOTE')),
     80    CONSTRAINT fk_worker_user
     81        FOREIGN KEY (user_id)
     82        REFERENCES UserAccount(id)
     83        ON DELETE CASCADE,
     84    CONSTRAINT fk_worker_location
     85        FOREIGN KEY (location_id)
     86        REFERENCES Location(id)
     87        ON DELETE RESTRICT
     88);
     89
     90CREATE TABLE Client (
     91    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
     92    user_id INT NOT NULL,
     93    CONSTRAINT fk_client_user
     94        FOREIGN KEY (user_id)
     95        REFERENCES UserAccount(id)
     96        ON DELETE CASCADE
     97);
     98
     99CREATE TABLE Favourite (
     100    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
     101    worker_id INT NOT NULL,
     102    client_id INT NOT NULL,
     103    CONSTRAINT fk_favourite_worker
     104        FOREIGN KEY (worker_id)
     105        REFERENCES Worker(id)
     106        ON DELETE CASCADE,
     107    CONSTRAINT fk_favourite_client
     108        FOREIGN KEY (client_id)
     109        REFERENCES Client(id)
     110        ON DELETE CASCADE,
     111    CONSTRAINT unq_worker_client UNIQUE(worker_id,client_id)
     112);
     113
     114CREATE TABLE WorkerCategory (
     115    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
     116    worker_id INT NOT NULL,
     117    category_id INT NOT NULL,
     118    CONSTRAINT unq_worker_category UNIQUE(worker_id, category_id),
     119    CONSTRAINT fk_worker_category_worker
     120        FOREIGN KEY (worker_id)
     121        REFERENCES Worker(id)
     122        ON DELETE CASCADE ,
     123    CONSTRAINT fk_worker_category_category
     124        FOREIGN KEY (category_id)
     125        REFERENCES Category(id)
     126        ON DELETE CASCADE
     127);
     128
     129CREATE TABLE WorkerBadge (
     130    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
     131    badge_id INT NOT NULL,
     132    worker_id INT NOT NULL,
     133    date_acquired DATE,
     134    is_active BOOLEAN,
     135    CONSTRAINT unq_worker_badge UNIQUE(badge_id, worker_id),
     136    CONSTRAINT fk_worker_badge_badge
     137        FOREIGN KEY (badge_id)
     138        REFERENCES Badge(id)
     139        ON DELETE CASCADE,
     140    CONSTRAINT fk_worker_badge_worker
     141        FOREIGN KEY (worker_id)
     142        REFERENCES Worker(id)
     143        ON DELETE CASCADE
     144);
     145
     146CREATE TABLE TaskRequest (
     147    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
     148    client_id INT NOT NULL,
     149    description VARCHAR(1000) NOT NULL,
     150    work_mode VARCHAR(20) NOT NULL,
     151    status VARCHAR(20) CHECK (status in('OPEN','CLOSED')),
     152    category_id INT NOT NULL,
     153    location_id INT NOT NULL,
     154    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
     155    updated_at TIMESTAMP,
     156    deleted_at TIMESTAMP,
     157    CONSTRAINT chk_task_req_work_mode CHECK (work_mode IN ('HYBRID','ONSITE','REMOTE')),
     158    CONSTRAINT chk_task_req_created_at CHECK (created_at <= CURRENT_TIMESTAMP),
     159    CONSTRAINT chk_task_req_updated_at CHECK
     160        (updated_at IS NULL OR (updated_at >= created_at AND updated_at <= CURRENT_TIMESTAMP)),
     161    CONSTRAINT chk_task_req_deleted_at CHECK
     162        (deleted_at IS NULL OR (deleted_at >= created_at AND deleted_at <= CURRENT_TIMESTAMP)),
     163    CONSTRAINT fk_task_request_client
     164        FOREIGN KEY (client_id)
     165        REFERENCES Client(id)
     166        ON DELETE CASCADE,
     167    CONSTRAINT fk_task_request_category
     168        FOREIGN KEY (category_id)
     169        REFERENCES Category(id)
     170        ON DELETE RESTRICT,
     171    CONSTRAINT fk_task_request_location
     172        FOREIGN KEY (location_id)
     173        REFERENCES Location(id)
     174        ON DELETE RESTRICT
     175);
     176
     177CREATE TABLE Offer (
     178    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
     179    worker_id INT NOT NULL,
     180    task_request_id INT NOT NULL,
     181    price INT NOT NULL,
     182    offer_status VARCHAR(20) NOT NULL,
     183    initiated_by VARCHAR(10) NOT NULL CHECK (initiated_by IN ('CLIENT','WORKER')),
     184    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
     185    updated_at TIMESTAMP,
     186    deleted_at TIMESTAMP,
     187    CONSTRAINT chk_price CHECK (price > 0),
     188    CONSTRAINT chk_offer_status CHECK (offer_status IN ('PENDING', 'ACCEPTED', 'REJECTED')),
     189    CONSTRAINT chk_offer_created_at CHECK (created_at <= CURRENT_TIMESTAMP),
     190    CONSTRAINT chk_task_off_updated_at CHECK
     191        (updated_at IS NULL OR (updated_at >= created_at AND updated_at <= CURRENT_TIMESTAMP)),
     192    CONSTRAINT chk_task_off_deleted_at CHECK
     193        (deleted_at IS NULL OR (deleted_at >= created_at AND deleted_at <= CURRENT_TIMESTAMP)),
     194    CONSTRAINT fk_offer_worker
     195        FOREIGN KEY (worker_id)
     196        REFERENCES Worker(id)
     197        ON DELETE CASCADE,
     198    CONSTRAINT fk_offer_task_request
     199        FOREIGN KEY (task_request_id)
     200        REFERENCES TaskRequest(id)
     201        ON DELETE RESTRICT
     202);
     203
     204CREATE TABLE Task (
     205    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
     206    offer_id INT NOT NULL,
     207    status VARCHAR(20) NOT NULL,
     208    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
     209    updated_at TIMESTAMP,
     210    completed_at TIMESTAMP,
     211    CONSTRAINT chk_task_status CHECK (status IN ('ACTIVE', 'COMPLETED', 'CANCELLED')),
     212    CONSTRAINT chk_created_at CHECK (created_at <= CURRENT_TIMESTAMP),
     213    CONSTRAINT chk_completed_at CHECK (completed_at <= CURRENT_TIMESTAMP),
     214    CONSTRAINT chk_timeline CHECK (updated_at IS NULL OR updated_at >= created_at),
     215    CONSTRAINT fk_task_offer
     216        FOREIGN KEY (offer_id)
     217        REFERENCES Offer(id)
     218        ON DELETE RESTRICT
     219);
     220
     221CREATE TABLE Message (
     222    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
     223    text VARCHAR(1000) NOT NULL,
     224    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
     225    task_id INT NOT NULL,
     226    sender_id INT NOT NULL,
     227
     228    CONSTRAINT chk_sent_at CHECK (created_at <= CURRENT_TIMESTAMP),
     229
     230    CONSTRAINT fk_message_task
     231        FOREIGN KEY (task_id)
     232        REFERENCES Task(id)
     233        ON DELETE RESTRICT,
     234    CONSTRAINT fk_message_sender
     235        FOREIGN KEY (sender_id)
     236        REFERENCES UserAccount(id)
     237        ON DELETE RESTRICT
     238);
     239
     240CREATE TABLE Review (
     241    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
     242    comment TEXT,
     243    rating INT NOT NULL,
     244    task_id INT NOT NULL,
     245    reviewed_id INT NOT NULL,
     246    reviewer_id INT NOT NULL,
     247    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
     248    CONSTRAINT chk_rating CHECK (rating BETWEEN 1 AND 5),
     249    CONSTRAINT chk_created CHECK (created_at <= CURRENT_TIMESTAMP),
     250    CONSTRAINT fk_review_task
     251        FOREIGN KEY (task_id)
     252        REFERENCES Task(id)
     253        ON DELETE RESTRICT,
     254    CONSTRAINT fk_review_reviewed
     255        FOREIGN KEY (reviewed_id)
     256        REFERENCES UserAccount(id)
     257        ON DELETE RESTRICT,
     258    CONSTRAINT fk_review_reviewer
     259        FOREIGN KEY (reviewer_id)
     260        REFERENCES UserAccount(id)
     261        ON DELETE RESTRICT,
     262    CONSTRAINT unq UNIQUE(task_id, reviewer_id)
     263);
     264
     265CREATE TABLE Complaint (
     266    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
     267    reason VARCHAR(255) NOT NULL,
     268    description VARCHAR(1000),
     269    status VARCHAR(20) NOT NULL,
     270    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
     271    updated_at TIMESTAMP,
     272    task_id INT NOT NULL,
     273    client_id INT NOT NULL,
     274    worker_id INT NOT NULL,
     275    CONSTRAINT chk_complaint_status CHECK (status IN ('OPEN', 'RESOLVED', 'DISMISSED')),
     276    CONSTRAINT chk_complaint_created_at CHECK (created_at <= CURRENT_TIMESTAMP),
     277    CONSTRAINT chk_timeline CHECK (updated_at IS NULL OR updated_at >= created_at),
     278    CONSTRAINT fk_complaint_task
     279        FOREIGN KEY (task_id)
     280        REFERENCES Task(id)
     281        ON DELETE RESTRICT,
     282    CONSTRAINT fk_complaint_client
     283        FOREIGN KEY (client_id)
     284        REFERENCES Client(id)
     285        ON DELETE RESTRICT,
     286    CONSTRAINT fk_complaint_worker
     287        FOREIGN KEY (worker_id)
     288        REFERENCES Worker(id)
     289        ON DELETE RESTRICT
     290);
     291
     292CREATE TABLE ComplaintAttachment (
     293    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
     294    file_url VARCHAR(500) NOT NULL,
     295    description VARCHAR(500),
     296    complaint_id INT NOT NULL,
     297    user_id INT,
     298    CONSTRAINT fk_complaint_attachment_complaint
     299        FOREIGN KEY (complaint_id)
     300        REFERENCES Complaint(id)
     301        ON DELETE CASCADE,
     302    CONSTRAINT fk_complaint_attachment_user
     303        FOREIGN KEY (user_id)
     304        REFERENCES UserAccount(id)
     305        ON DELETE SET NULL
     306);
     307
     308CREATE TABLE Payment (
     309    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
     310    amount INT NOT NULL,
     311    payment_method VARCHAR(50) NOT NULL,
     312    status VARCHAR(20) NOT NULL,
     313    task_id INT NOT NULL,
     314    client_id INT NOT NULL,
     315    worker_id INT NOT NULL,
     316    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
     317    updated_at TIMESTAMP,
     318
     319    CONSTRAINT chk_amount CHECK (amount > 0),
     320    CONSTRAINT chk_status CHECK (status IN ('PENDING', 'PAID', 'FAILED')),
     321    CONSTRAINT chk_payment_method CHECK (payment_method IN ('CARD','CASH','PAYPAL')),
     322    CONSTRAINT chk_p_created_at CHECK (created_at <= CURRENT_TIMESTAMP),
     323    CONSTRAINT chk_task_p_updated_at CHECK
     324        (updated_at IS NULL OR (updated_at >= created_at AND updated_at <= CURRENT_TIMESTAMP)),
     325    CONSTRAINT fk_payment_task
     326        FOREIGN KEY (task_id)
     327        REFERENCES Task(id)
     328        ON DELETE RESTRICT,
     329    CONSTRAINT fk_payment_client
     330        FOREIGN KEY (client_id)
     331        REFERENCES Client(id)
     332        ON DELETE RESTRICT,
     333    CONSTRAINT fk_payment_worker
     334        FOREIGN KEY (worker_id)
     335        REFERENCES Worker(id)
     336        ON DELETE RESTRICT
     337);
     338
     339CREATE TABLE TaskPayment (
     340    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
     341    payment_id INT NOT NULL,
     342    task_id INT NOT NULL,
     343    CONSTRAINT fk_task_payment_payment
     344        FOREIGN KEY (payment_id)
     345        REFERENCES Payment(id)
     346        ON DELETE RESTRICT,
     347    CONSTRAINT fk_task_payment_task
     348        FOREIGN KEY (task_id)
     349        REFERENCES Task(id)
     350        ON DELETE RESTRICT
     351);
     352
     353CREATE TABLE NotificationPreference (
     354    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
     355    is_enabled BOOLEAN NOT NULL,
     356    channel VARCHAR(10) NOT NULL,
     357    user_id INT NOT NULL,
     358    notification_type_id INT NOT NULL,
     359    CONSTRAINT fk_notification_preference_user
     360        FOREIGN KEY (user_id)
     361        REFERENCES UserAccount(id)
     362        ON DELETE CASCADE,
     363    CONSTRAINT fk_notification_preference_type
     364        FOREIGN KEY (notification_type_id)
     365        REFERENCES NotificationType(id)
     366        ON DELETE RESTRICT,
     367    CONSTRAINT chk_channel CHECK (channel IN ('EMAIL','SMS','PUSH'))
     368);
     369
     370CREATE TABLE Notification (
     371    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
     372    title VARCHAR(255) NOT NULL,
     373    body VARCHAR(1000) NOT NULL,
     374    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
     375    user_id INT NOT NULL,
     376    notification_type_id INT,
     377    task_id INT,
     378    offer_id INT,
     379    payment_id INT,
     380    CONSTRAINT chk_notification_time CHECK (created_at <= CURRENT_TIMESTAMP),
     381    CONSTRAINT fk_notification_user
     382        FOREIGN KEY (user_id)
     383        REFERENCES UserAccount(id)
     384        ON DELETE CASCADE,
     385    CONSTRAINT fk_notification_type
     386        FOREIGN KEY (notification_type_id)
     387        REFERENCES NotificationType(id)
     388        ON DELETE SET NULL,
     389    CONSTRAINT fk_notification_task
     390        FOREIGN KEY (task_id)
     391        REFERENCES Task(id)
     392        ON DELETE SET NULL,
     393    CONSTRAINT fk_notification_offer
     394        FOREIGN KEY (offer_id)
     395        REFERENCES Offer(id)
     396        ON DELETE SET NULL,
     397    CONSTRAINT fk_notification_payment
     398        FOREIGN KEY (payment_id)
     399        REFERENCES Payment(id)
     400        ON DELETE SET NULL
     401);
     402
     403CREATE TABLE cities (
     404    city VARCHAR(25),
     405    latitude DECIMAL,
     406    longitude DECIMAL
     407);
     408}}}