Restaurant Database Management System

This commit is contained in:
2026-07-18 00:02:30 +03:30
parent 00f990c653
commit de5b97a295
20 changed files with 896 additions and 159 deletions
+59 -104
View File
@@ -1,141 +1,96 @@
-- 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.
-- This script creates the whole schema from scratch and inserts some
-- initial data. It can be run from start to finish without errors.
--
-- Run with: psql -U postgres -d restaurant_db -f database.sql
-- Drop old tables first so the script is re-runnable.
-- Order matters because of the foreign keys (drop children before parents).
DROP TABLE IF EXISTS order_details CASCADE;
DROP TABLE IF EXISTS orders CASCADE;
DROP TABLE IF EXISTS menu_items 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 ...
-- Passwords are stored as a hash (never plain text) by the Java app.
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL, -- SHA-256 hex hash
email VARCHAR(255) -- optional
);
-- =======================================================
-- 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_items (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
description TEXT, -- optional
price NUMERIC(10, 2) NOT NULL CHECK (price > 0),
category VARCHAR(50) -- optional
);
-- =======================================================
-- ORDER TABLE
-- ORDER TABLE ("order" is a reserved word, so we use "orders")
-- =======================================================
--
-- 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 ...
-- Each order belongs to exactly one user (One-to-Many: user -> orders).
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL REFERENCES users(id),
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
total_price NUMERIC(10, 2) NOT NULL DEFAULT 0 CHECK (total_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 ...
-- One line inside an order (One-to-Many: order -> order_details).
-- "price" is the item price at the moment of purchase, so history stays
-- correct even if the menu price changes later.
CREATE TABLE order_details (
id SERIAL PRIMARY KEY,
order_id INT NOT NULL REFERENCES orders(id) ON DELETE CASCADE,
menu_item_id INT NOT NULL REFERENCES menu_items(id),
quantity INT NOT NULL CHECK (quantity > 0),
price NUMERIC(10, 2) NOT NULL CHECK (price > 0)
);
-- =======================================================
-- INITIAL MENU DATA
-- INITIAL MENU DATA (at least 3 items)
-- =======================================================
--
-- Insert at least 3 food or drink items.
--
-- Example categories:
-- - Pizza
-- - Burger
-- - Pasta
-- - Drink
--
-- INSERT INTO ...
INSERT INTO menu_items (name, description, price, category) VALUES
('Margherita Pizza', 'Classic pizza with tomato, mozzarella and basil', 10.00, 'Pizza'),
('Cheeseburger', 'Beef patty with cheddar, lettuce and tomato', 8.00, 'Burger'),
('Pasta Bolognese', 'Spaghetti with rich beef and tomato sauce', 12.00, 'Pasta'),
('Caesar Salad', 'Romaine, croutons, parmesan and Caesar dressing', 6.50, 'Salad'),
('Coca-Cola', 'Chilled 330ml can', 2.50, 'Drink');
-- =======================================================
-- OPTIONAL TEST DATA
-- =======================================================
--
-- You may insert sample users and orders for testing.
-- This section is optional.
--
-- INSERT INTO ...
-- Sample user. The password below is the SHA-256 hash of the text "1234"
-- so you can log in with username "admin" / password "1234" for testing.
INSERT INTO users (username, password, email) VALUES
('admin', '03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4', 'admin@pizzeria.com');
-- =======================================================
-- VERIFICATION QUERIES
-- VERIFICATION QUERIES (optional, uncomment to check)
-- =======================================================
--
-- Uncomment these queries to verify your database.
--
-- SELECT * FROM ...;
-- SELECT * FROM ...;
-- SELECT * FROM ...;
-- SELECT * FROM ...;
-- SELECT * FROM users;
-- SELECT * FROM menu_items;
-- SELECT * FROM orders;
-- SELECT * FROM order_details;