wiki:DatabaseCreation

Version 4 (modified by 232026, 6 hours ago) ( diff )

--

DDL

1. Вовед

DDL-от беше генериран од страна на Visual Paradigm, испробан локално и дополнет со constraints. Потоа, направивме pg_dump и го импортиравме на нашата remote база за предметот.

DDL:

CREATE TABLE "User" (

user_id SERIAL, name varchar(255), surname varchar(255), email varchar(255), password varchar(255), phone_number varchar(255), registration_date date, PRIMARY KEY (user_id),

CONSTRAINT email_check CHECK (email ~* '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'),

CONSTRAINT password_complexity CHECK (

password ~ '[0-9]' AND password ~ '[a-zA-Z0-9]'

)

);

CREATE TABLE VehicleType (

vehicle_type_id SERIAL, vehicle_type varchar(255), PRIMARY KEY (vehicle_type_id)

);

CREATE TABLE Vehicle (

vehicle_id SERIAL, registration varchar(255), vehicle_type_id int DEFAULT -1, PRIMARY KEY (vehicle_id), FOREIGN KEY (vehicle_type_id) REFERENCES VehicleType(vehicle_type_id)

ON DELETE SET DEFAULT ON UPDATE CASCADE

);

CREATE TABLE Driver (

driver_id int DEFAULT -1, vehicle_id int DEFAULT -1, status varchar(255), hire_date date, PRIMARY KEY (driver_id), FOREIGN KEY (driver_id) REFERENCES "User"(user_id)

ON DELETE CASCADE ON UPDATE CASCADE,

FOREIGN KEY (vehicle_id) REFERENCES Vehicle(vehicle_id)

ON DELETE SET DEFAULT ON UPDATE CASCADE

);

CREATE TABLE Customer (

customer_id int DEFAULT -1, PRIMARY KEY (customer_id), FOREIGN KEY (customer_id) REFERENCES "User"(user_id)

ON DELETE CASCADE ON UPDATE CASCADE

);

CREATE TABLE LoyalCustomer (

loyalty_id int DEFAULT -1, points int DEFAULT 0 CHECK (points >= 0), joined_day date, birthday date, PRIMARY KEY (loyalty_id), FOREIGN KEY (loyalty_id) REFERENCES Customer(customer_id)

ON DELETE CASCADE ON UPDATE CASCADE

);

CREATE TABLE City (

city_id SERIAL, city_name varchar(255), postal_code int, PRIMARY KEY (city_id)

);

CREATE TABLE StoreType (

store_type_id SERIAL, type_name varchar(255), description varchar(255), PRIMARY KEY (store_type_id)

);

CREATE TABLE Store (

store_id SERIAL, store_name varchar(255), city_id int DEFAULT -1, store_type_id int DEFAULT -1, rating double precision CHECK (rating >= 0 AND rating <= 5), PRIMARY KEY (store_id), FOREIGN KEY (city_id) REFERENCES City(city_id)

ON DELETE SET DEFAULT ON UPDATE CASCADE,

FOREIGN KEY (store_type_id) REFERENCES StoreType(store_type_id)

ON DELETE SET DEFAULT ON UPDATE CASCADE

);

CREATE TABLE DeliveryZone (

zone_id SERIAL, city_id int DEFAULT -1, zone_name varchar(255), PRIMARY KEY (zone_id), FOREIGN KEY (city_id) REFERENCES City(city_id)

ON DELETE SET DEFAULT ON UPDATE CASCADE

);

CREATE TABLE Address (

address_id SERIAL, zone_id int DEFAULT -1, street varchar(255), street_number int, door_number int, PRIMARY KEY (address_id), FOREIGN KEY (zone_id) REFERENCES DeliveryZone(zone_id)

ON DELETE SET DEFAULT ON UPDATE CASCADE

);

CREATE TABLE StoreInstance (

store_instance_id SERIAL, store_id int DEFAULT -1, address_id int DEFAULT -1, phone varchar(255), zone_id int DEFAULT -1, PRIMARY KEY (store_instance_id), FOREIGN KEY (store_id) REFERENCES Store(store_id)

ON DELETE SET DEFAULT ON UPDATE CASCADE,

FOREIGN KEY (address_id) REFERENCES Address(address_id)

ON DELETE SET DEFAULT ON UPDATE CASCADE,

FOREIGN KEY (zone_id) REFERENCES DeliveryZone(zone_id)

ON DELETE SET DEFAULT ON UPDATE CASCADE

);

CREATE TABLE Delivery_zone_Store_instance (

zone_id int DEFAULT -1, store_instance_id int DEFAULT -1,

FOREIGN KEY (zone_id) REFERENCES DeliveryZone(zone_id)

ON DELETE CASCADE ON UPDATE CASCADE,

FOREIGN KEY (store_instance_id) REFERENCES StoreInstance(store_instance_id)

ON DELETE CASCADE ON UPDATE CASCADE,

PRIMARY KEY (zone_id, store_instance_id)

);

CREATE TABLE Product (

product_id SERIAL, store_id int DEFAULT -1, name varchar(255), price int DEFAULT 0 CHECK (price >= 0), PRIMARY KEY (product_id), FOREIGN KEY (store_id) REFERENCES Store(store_id)

ON DELETE SET DEFAULT ON UPDATE CASCADE

);

CREATE TABLE Promotion (

promotion_id SERIAL, store_id int DEFAULT -1, promotion_name varchar(255), discount_percent int DEFAULT 0, start_date date, end_date date, PRIMARY KEY (promotion_id), FOREIGN KEY (store_id) REFERENCES Store(store_id)

ON DELETE SET DEFAULT ON UPDATE CASCADE,

CHECK (discount_percent >= 0 AND discount_percent <= 100), CHECK (start_date <= end_date)

);

CREATE TABLE "Order" (

order_id SERIAL, customer_id int DEFAULT -1, promotion_id int DEFAULT -1, driver_id int DEFAULT -1, store_instance_id int DEFAULT -1, delivery_zone_id int DEFAULT -1, status varchar(255), delivery_fee int DEFAULT 0 CHECK (delivery_fee >= 0), total_price int DEFAULT 0 CHECK (total_price >= 0), PRIMARY KEY (order_id), FOREIGN KEY (customer_id) REFERENCES Customer(customer_id)

ON DELETE SET DEFAULT ON UPDATE CASCADE,

FOREIGN KEY (promotion_id) REFERENCES Promotion(promotion_id)

ON DELETE SET DEFAULT ON UPDATE CASCADE,

FOREIGN KEY (driver_id) REFERENCES Driver(driver_id)

ON DELETE SET DEFAULT ON UPDATE CASCADE,

FOREIGN KEY (store_instance_id) REFERENCES StoreInstance(store_instance_id)

ON DELETE SET DEFAULT ON UPDATE CASCADE,

FOREIGN KEY (delivery_zone_id) REFERENCES DeliveryZone(zone_id)

ON DELETE SET DEFAULT ON UPDATE CASCADE

);

CREATE TABLE OrderItem (

order_item_id SERIAL, order_id int DEFAULT -1, product_id int DEFAULT -1, quantity int DEFAULT 1 CHECK (quantity > 0), PRIMARY KEY (order_item_id), FOREIGN KEY (order_id) REFERENCES "Order"(order_id)

ON DELETE SET DEFAULT ON UPDATE CASCADE,

FOREIGN KEY (product_id) REFERENCES Product(product_id)

ON DELETE SET DEFAULT ON UPDATE CASCADE

);

CREATE TABLE Review (

review_id SERIAL, order_id int DEFAULT -1, customer_id int DEFAULT -1, rating double precision CHECK (rating >= 0 AND rating <= 5), comment varchar(255), review_date date, PRIMARY KEY (review_id), FOREIGN KEY (order_id) REFERENCES "Order"(order_id)

ON DELETE SET DEFAULT ON UPDATE CASCADE,

FOREIGN KEY (customer_id) REFERENCES Customer(customer_id)

ON DELETE SET DEFAULT ON UPDATE CASCADE

);

CREATE TABLE Products_review (

review_id int DEFAULT -1, store_instance_id int DEFAULT -1, FOREIGN KEY (review_id ) REFERENCES Review(review_id)

ON DELETE CASCADE ON UPDATE CASCADE,

FOREIGN KEY (store_instance_id ) REFERENCES StoreInstance(store_instance_id)

ON DELETE SET default ON UPDATE CASCADE,

PRIMARY KEY(review_id));

CREATE TABLE Delivery_review (

review_id int DEFAULT -1, driver_id int DEFAULT -1, FOREIGN KEY (review_id ) REFERENCES Review(review_id)

ON DELETE CASCADE ON UPDATE CASCADE,

FOREIGN KEY (driver_id ) REFERENCES Driver(driver_id)

ON DELETE SET default ON UPDATE CASCADE,

PRIMARY KEY(review_id));

CREATE TABLE Payment_method (

payment_method_id SERIAL, payment varchar(255), PRIMARY KEY (payment_method_id)

);

CREATE TABLE Payment (

payment_id SERIAL, status varchar(255), payment_date date, payment_method_id int DEFAULT -1, order_id int DEFAULT -1, PRIMARY KEY (payment_id), FOREIGN KEY (payment_method_id) REFERENCES Payment_method(payment_method_id)

ON DELETE SET DEFAULT ON UPDATE CASCADE,

FOREIGN KEY (order_id) REFERENCES "Order"(order_id)

ON DELETE SET DEFAULT ON UPDATE CASCADE

);

CREATE TABLE Customer_payment_method (

customer_id int DEFAULT -1, payment_method_id int DEFAULT -1, date_added date DEFAULT CURRENT_DATE,

-- Композитен примарен клуч

-- Референца кон Customer FOREIGN KEY (customer_id) REFERENCES Customer(customer_id)

ON DELETE CASCADE ON UPDATE CASCADE,

-- Референца кон Payment_method FOREIGN KEY (payment_method_id) REFERENCES Payment_method(payment_method_id)

ON DELETE CASCADE ON UPDATE CASCADE,

PRIMARY KEY (customer_id, payment_method_id)

);

CREATE TABLE Customer_Address (

customer_id int DEFAULT -1, address_id int DEFAULT -1, address_label varchar(255), -- Опционално: за ознаки како 'Home', 'Work'

FOREIGN KEY (customer_id) REFERENCES Customer(customer_id)

ON DELETE CASCADE ON UPDATE CASCADE,

FOREIGN KEY (address_id) REFERENCES Address(address_id)

ON DELETE CASCADE ON UPDATE CASCADE,

PRIMARY KEY (customer_id, address_id)

);

Note: See TracWiki for help on using the wiki.