diff --git a/database.sql b/database.sql index 2169346..bac0ec9 100644 --- a/database.sql +++ b/database.sql @@ -1,141 +1,83 @@ --- Restaurant Database Management System --- --- Instructions: --- 1. Create all required tables. --- 2. Design appropriate PRIMARY KEY and FOREIGN KEY relationships. --- 3. Add suitable constraints based on the requirements. --- 4. Insert initial mock data. --- 5. Insert at least 3 menu items. --- 6. The script should be executable from start to finish without errors. + +DROP TABLE IF EXISTS order_details CASCADE; +DROP TABLE IF EXISTS orders CASCADE; +DROP TABLE IF EXISTS menu_item CASCADE; +DROP TABLE IF EXISTS users CASCADE; - --- ======================================================= --- USER TABLE --- ======================================================= --- --- Represents customers using the system. --- --- Required information: --- - Unique identifier --- - Username --- - Password --- - Email (optional) --- --- Requirements: --- - Each user must have a unique identifier. --- - Usernames must be unique. --- - Username and password are required. --- - Passwords should not be stored in plain text. --- --- CREATE TABLE ... +CREATE TABLE users ( + uid SERIAL PRIMARY KEY, + username VARCHAR(50) UNIQUE NOT NULL, + password VARCHAR(255) NOT NULL, + email VARCHAR(100) +); - --- ======================================================= --- MENU ITEM TABLE --- ======================================================= --- --- Represents available food and drink items. --- --- Required information: --- - Unique identifier --- - Name --- - Description (optional) --- - Price --- - Category (optional) --- --- Requirements: --- - Each menu item must have a unique identifier. --- - Name is required. --- - Price must always be positive. --- --- CREATE TABLE ... +CREATE TABLE menu_item ( + uid SERIAL PRIMARY KEY, + name VARCHAR(50) NOT NULL, + price DECIMAL(10, 2) NOT NULL CHECK (price > 0), + category VARCHAR(50) +); +CREATE TABLE orders ( + uid SERIAL PRIMARY KEY, + user_id INTEGER NOT NULL, + order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + total_price DECIMAL(10, 2) NOT NULL CHECK (total_price >= 0), --- ======================================================= --- ORDER TABLE --- ======================================================= --- --- Represents orders placed by customers. --- --- Required information: --- - Unique identifier --- - Reference to customer --- - Creation date and time --- - Total price --- --- Requirements: --- - Each order must belong to exactly one user. --- - A user can have multiple orders. --- - The relationship between User and Order must be implemented. --- --- Note: --- Avoid using reserved SQL keywords as table names. --- Consider using a name such as "orders" or "customer_orders". --- --- CREATE TABLE ... + CONSTRAINT fk_orders_user + FOREIGN KEY (user_id) + REFERENCES users(uid) + ON DELETE CASCADE +); +CREATE TABLE order_details ( + uid SERIAL PRIMARY KEY, + order_id INTEGER NOT NULL, + item_id INTEGER NOT NULL, + quantity INTEGER NOT NULL CHECK (quantity > 0), + item_price DECIMAL(10, 2) NOT NULL CHECK (item_price >= 0), --- ======================================================= --- ORDER DETAIL TABLE --- ======================================================= --- --- Represents items inside an order. --- --- Required information: --- - Unique identifier --- - Reference to an order --- - Reference to a menu item --- - Quantity --- - Item price at purchase time --- --- Requirements: --- - Each detail record must belong to one order. --- - Each detail record must reference one menu item. --- - Quantity must always be greater than zero. --- - Store the item's price at the moment of purchase. --- --- CREATE TABLE ... + CONSTRAINT fk_order_details_order + FOREIGN KEY (order_id) + REFERENCES orders(uid) + ON DELETE CASCADE, + + CONSTRAINT fk_order_details_menu_item + FOREIGN KEY (item_id) + REFERENCES menu_item(uid) + ON DELETE RESTRICT +); - --- ======================================================= --- INITIAL MENU DATA --- ======================================================= --- --- Insert at least 3 food or drink items. --- --- Example categories: --- - Pizza --- - Burger --- - Pasta --- - Drink --- --- INSERT INTO ... +INSERT INTO menu_item (name, price, category) VALUES + ('French Fries', 1.00, 'Appetizer'), + ('Chicken Burger', 4.05, 'Burger'), + ('Pepperoni Pizza', 8.39, 'Pizza'), + ('Milkshake', 2.20, 'Drink'), + ('Ravioli', 9.00, 'Pasta'); - --- ======================================================= --- OPTIONAL TEST DATA --- ======================================================= --- --- You may insert sample users and orders for testing. --- This section is optional. --- --- INSERT INTO ... +INSERT INTO users (username, password, email) VALUES + ('saraz', '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', 'sarrr@gmail.com'), + ('kave02', '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', 'kaviii02@gmail.com'), + ('titami_t', '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', 'titaza@gmil.com'); +INSERT INTO orders (user_id, order_date, total_price) VALUES + (1, CURRENT_TIMESTAMP, 9.39), + (2, CURRENT_TIMESTAMP, 13.05), + (1, CURRENT_TIMESTAMP, 2.20), + (3, CURRENT_TIMESTAMP, 8.39); --- ======================================================= --- VERIFICATION QUERIES --- ======================================================= --- --- Uncomment these queries to verify your database. --- --- SELECT * FROM ...; --- SELECT * FROM ...; --- SELECT * FROM ...; --- SELECT * FROM ...; \ No newline at end of file + +INSERT INTO order_details (order_id, item_id, quantity, item_price) VALUES + (1, 1, 1, 1.00), + (1, 3, 1, 8.39), + (2, 2, 1, 4.05), + (2, 5, 1, 9.00), + (3, 4, 1, 2.20), + (4, 3, 1, 8.39); \ No newline at end of file