wiki:DatabaseCreation

Version 1 (modified by 231198, 6 days ago) ( diff )

--

Database Creation

Имплементациски детали

Во овој проект, преку DDL наредби се креирани сите потребни табели за системот за управување со такси апликација, како и нивните меѓусебни релации.

Во скриптите се опфатени:

  • примарни клучеви (PRIMARY KEY)
  • надворешни клучеви (FOREIGN KEY)
  • ограничувања за интегритет (CHECK, UNIQUE, NOT NULL)
  • правила за ажурирање и бришење (ON DELETE, ON UPDATE)

Со овие DDL наредби се обезбедува конзистентност, интегритет и правилна организација на податоците во базата.

DDL Скрипти

` CREATE TABLE Status (

status_id SERIAL PRIMARY KEY,

status_tip VARCHAR(255) NOT NULL,

status_text VARCHAR(255) NOT NULL

);                                                  CREATE TABLE Vehicles_model (

Vehicles_model_id SERIAL PRIMARY KEY,

Model VARCHAR(255) NOT NULL

);                                                  CREATE TABLE Locations (

location_id SERIAL PRIMARY KEY,

latitude NUMERIC(9,6) NOT NULL,

longitude NUMERIC(9,6) NOT NULL,

grad VARCHAR(255) NOT NULL,

naselba VARCHAR(255) NOT NULL,

ulica VARCHAR(255) NOT NULL,

broj VARCHAR(255) NOT NULL,

created_at TIMESTAMP NOT NULL

); 

CREATE TABLE Users (

User_id SERIAL PRIMARY KEY,

name VARCHAR(255) NOT NULL,

username VARCHAR(255) NOT NULL UNIQUE,

phone VARCHAR(255) NOT NULL UNIQUE,

email VARCHAR(255) NOT NULL UNIQUE,

password_hash TEXT NOT NULL,

created_at TIMESTAMP NOT NULL,

status_id INT NOT NULL,

CONSTRAINT chk_users_phone CHECK (phone ~ '[0-9+]+$'),

CONSTRAINT chk_users_email CHECK (email ~ '[@]+@[@]+\.[@]+$'),

CONSTRAINT FK_Users_Status

FOREIGN KEY (status_id) REFERENCES Status(status_id)

ON DELETE RESTRICT

ON UPDATE CASCADE

);

CREATE TABLE Drivers (

driver_id SERIAL PRIMARY KEY,

name VARCHAR(255) NOT NULL,

phone VARCHAR(255) NOT NULL UNIQUE,

license_number VARCHAR(255) NOT NULL UNIQUE,

registration_date DATE NOT NULL,

rating NUMERIC(3,2) NOT NULL,

status_id INT NOT NULL,

CONSTRAINT chk_drivers_phone CHECK (phone ~ '[0-9+]+$'),

CONSTRAINT chk_drivers_rating CHECK (rating BETWEEN 0 AND 5),

CONSTRAINT FK_Drivers_Status

FOREIGN KEY (status_id) REFERENCES Status(status_id)

ON DELETE RESTRICT

ON UPDATE CASCADE

);

CREATE TABLE Admins (

admins_id SERIAL PRIMARY KEY,

name VARCHAR(255) NOT NULL,

username VARCHAR(255) NOT NULL UNIQUE,

phone VARCHAR(255) NOT NULL UNIQUE,

email VARCHAR(255) NOT NULL UNIQUE,

password_hash TEXT NOT NULL,

created_at TIMESTAMP NOT NULL,

status_id INT NOT NULL,

CONSTRAINT chk_admins_phone CHECK (phone ~ '[0-9+]+$'),

CONSTRAINT chk_admins_email CHECK (email ~ '[@]+@[@]+\.[@]+$'),

CONSTRAINT FK_Admins_Status

FOREIGN KEY (status_id) REFERENCES Status(status_id)

ON DELETE RESTRICT

ON UPDATE CASCADE

);

CREATE TABLE Vehicle_types (

vehicle_type_id SERIAL PRIMARY KEY,

type_name VARCHAR(255) NOT NULL,

description VARCHAR(255) NOT NULL,

Vehicles_model_id INT NOT NULL,

CONSTRAINT FK_Vehicle_types_Model

FOREIGN KEY (Vehicles_model_id)

REFERENCES Vehicles_model(Vehicles_model_id)

ON DELETE RESTRICT

ON UPDATE CASCADE

);

CREATE TABLE Vehicle_ownership (

Vehicle_ownership_id SERIAL PRIMARY KEY,

Plate VARCHAR(255) NOT NULL UNIQUE,

Traffic_permit VARCHAR(255) NOT NULL UNIQUE,

Color VARCHAR(255) NOT NULL,

year INT NOT NULL,

vehicle_type_id INT NOT NULL,

CONSTRAINT chk_vehicle_year CHECK (year >= 1900),

CONSTRAINT FK_Vehicle_ownership_Type

FOREIGN KEY (vehicle_type_id)

REFERENCES Vehicle_types(vehicle_type_id)

ON DELETE RESTRICT

ON UPDATE CASCADE

);

CREATE TABLE Pricing_rules (

tariff_id SERIAL PRIMARY KEY,

base_price NUMERIC(10,2) NOT NULL,

price_per_km NUMERIC(10,2) NOT NULL,

vehicle_type_id INT NOT NULL,

CONSTRAINT chk_price CHECK (base_price >= 0 AND price_per_km >= 0),

CONSTRAINT FK_Pricing_rules_Vehicle_types

FOREIGN KEY (vehicle_type_id)

REFERENCES Vehicle_types(vehicle_type_id)

ON DELETE RESTRICT

ON UPDATE CASCADE

);

CREATE TABLE Drivers_Vehicle_ownership (

driver_id INT NOT NULL,

Vehicle_ownership_id INT NOT NULL,

PRIMARY KEY (driver_id, Vehicle_ownership_id),

CONSTRAINT FK_DVO_Drivers

FOREIGN KEY (driver_id)

REFERENCES Drivers(driver_id)

ON DELETE CASCADE,

CONSTRAINT FK_DVO_Vehicles

FOREIGN KEY (Vehicle_ownership_id)

REFERENCES Vehicle_ownership(Vehicle_ownership_id)

ON DELETE CASCADE

);

CREATE TABLE Active_drivers (

driver_id INT PRIMARY KEY,

current_location_id INT NOT NULL,

is_available BOOLEAN NOT NULL,

working_start TIMESTAMP NOT NULL,

working_end TIMESTAMP NOT NULL,

vehicle_ownership_id INT NOT NULL,

CONSTRAINT FK_Active_drivers_Drivers

FOREIGN KEY (driver_id)

REFERENCES Drivers(driver_id)

ON DELETE CASCADE,

CONSTRAINT FK_Active_drivers_Locations

FOREIGN KEY (current_location_id)

REFERENCES Locations(location_id)

ON DELETE RESTRICT,

CONSTRAINT FK_Active_drivers_vehicle_ownership_id

FOREIGN KEY (vehicle_ownership_id)

REFERENCES Vehicle_ownership(Vehicle_ownership_id)

ON DELETE RESTRICT

);

CREATE TABLE Rides (

ride_id SERIAL PRIMARY KEY,

user_id INT NOT NULL,

driver_id INT NOT NULL,

vehicle_ownership_id INT NOT NULL,

pickup_location_id INT NOT NULL,

dropoff_location_id INT NOT NULL,

status_id INT NOT NULL,

request_time TIMESTAMP NOT NULL,

pickup_time TIMESTAMP NOT NULL,

start_time TIMESTAMP NOT NULL,

end_time TIMESTAMP NOT NULL,

distance_km NUMERIC(6,2) NOT NULL,

final_price NUMERIC(10,2) NOT NULL,

discount_percentage NUMERIC(5,2) NOT NULL,

CONSTRAINT chk_distance CHECK (distance_km >= 0),

CONSTRAINT chk_discount CHECK (discount_percentage BETWEEN 0 AND 100),

CONSTRAINT FK_Rides_Users

FOREIGN KEY (user_id) REFERENCES Users(User_id) ON DELETE RESTRICT,

CONSTRAINT FK_Rides_vehicle_ownership_id

FOREIGN KEY (vehicle_ownership_id) REFERENCES Vehicle_ownership(Vehicle_ownership_id) ON DELETE RESTRICT,

CONSTRAINT FK_Rides_Drivers

FOREIGN KEY (driver_id) REFERENCES Drivers(driver_id) ON DELETE RESTRICT,

CONSTRAINT FK_Rides_Pickup_Location

FOREIGN KEY (pickup_location_id) REFERENCES Locations(location_id) ON DELETE RESTRICT,

CONSTRAINT FK_Rides_Dropoff_Location

FOREIGN KEY (dropoff_location_id) REFERENCES Locations(location_id) ON DELETE RESTRICT,

CONSTRAINT FK_Rides_Status

FOREIGN KEY (status_id) REFERENCES Status(status_id) ON DELETE RESTRICT

);

CREATE TABLE Payment_methods(

payment_method_id SERIAL PRIMARY KEY,

payment_tip  VARCHAR(255) NOT NULL

);

CREATE TABLE Payments (

payment_id SERIAL PRIMARY KEY,

amount NUMERIC(10,2) NOT NULL,

payment_method_id INT NOT NULL,

payment_time TIMESTAMP NOT NULL,

ride_id INT NOT NULL,

status_id INT NOT NULL,

CONSTRAINT chk_amount CHECK (amount >= 0),

CONSTRAINT FK_Payments_Rides

FOREIGN KEY (ride_id) REFERENCES Rides(ride_id) ON DELETE CASCADE,

CONSTRAINT FK_Payments_Status

FOREIGN KEY (status_id) REFERENCES Status(status_id) ON DELETE RESTRICT,

CONSTRAINT FK_Payments_Method

FOREIGN KEY (payment_method_id) REFERENCES Payment_methods(payment_method_id) ON DELETE RESTRICT

);

CREATE TABLE Ratings (

rating_id SERIAL PRIMARY KEY,

score INT NOT NULL,

comment VARCHAR(255),

created_at TIMESTAMP NOT NULL,

ride_id INT NOT NULL,

User_id INT NOT NULL,

driver_id INT NOT NULL,

CONSTRAINT chk_score CHECK (score BETWEEN 1 AND 5),

CONSTRAINT FK_Ratings_Rides

FOREIGN KEY (ride_id) REFERENCES Rides(ride_id) ON DELETE CASCADE,

CONSTRAINT FK_Ratings_Users

FOREIGN KEY (User_id) REFERENCES Users(User_id) ON DELETE CASCADE,

CONSTRAINT FK_Ratings_Drivers

FOREIGN KEY (driver_id) REFERENCES Drivers(driver_id) ON DELETE CASCADE

);

CREATE TABLE Cancellations (

cancellation_id SERIAL PRIMARY KEY,

cancelled_by_type VARCHAR(255) NOT NULL,

cancelled_by_id INT NOT NULL,

reason VARCHAR(255) NOT NULL,

cancellation_fee NUMERIC(10,2) NOT NULL,

created_at TIMESTAMP NOT NULL,

ride_id INT NOT NULL,

CONSTRAINT chk_fee CHECK (cancellation_fee >= 0),

CONSTRAINT chk_cancelled_by_type CHECK (cancelled_by_type IN ('USER', 'DRIVER', 'ADMIN')),

CONSTRAINT FK_Cancellations_Rides

FOREIGN KEY (ride_id) REFERENCES Rides(ride_id) ON DELETE CASCADE

);

CREATE TABLE Messages(

message_id SERIAL PRIMARY KEY,

message_text VARCHAR(255) NOT NULL

);

CREATE TABLE Notifications (

notification_id SERIAL PRIMARY KEY,

message_id INT NOT NULL,

sent_time TIMESTAMP NOT NULL,

User_id INT NOT NULL,

ride_id INT NOT NULL,

status_id INT NOT NULL,

CONSTRAINT FK_Notifications_Users

FOREIGN KEY (User_id) REFERENCES Users(User_id) ON DELETE CASCADE,

CONSTRAINT FK_Notifications_Rides

                    

FOREIGN KEY (ride_id) REFERENCES Rides(ride_id) ON DELETE CASCADE,

CONSTRAINT FK_Notifications_Status

FOREIGN KEY (status_id) REFERENCES Status(status_id) ON DELETE RESTRICT,

CONSTRAINT FK_Notifications_Messages

FOREIGN KEY (message_id) REFERENCES Messages(message_id) ON DELETE CASCADE

); `

Note: See TracWiki for help on using the wiki.