Update README.md
This commit is contained in:
@@ -1,604 +1,268 @@
|
||||
# WS-11-Database
|
||||
# WS-10-Database
|
||||
|
||||
# Restaurant Database Management System 🍕🗄️
|
||||
# 🍕🗄️ Restaurant Database Management System
|
||||
|
||||
## Overview
|
||||
## 📖 Overview
|
||||
|
||||
In this workshop, you will build a **restaurant management system focused on database design, PostgreSQL, and JDBC integration**.
|
||||
In this workshop, you will build a **Restaurant Management System** focused on database design, PostgreSQL, and JDBC integration.
|
||||
|
||||
The main goal of this project is to practice working with relational databases, designing a proper database schema, managing relationships between tables, and connecting a Java application to PostgreSQL.
|
||||
The primary goal of this project is to practice working with relational databases. You will design a well-structured database schema, manage relationships between tables (Primary and Foreign Keys), and connect a Java application to a PostgreSQL database to perform CRUD operations.
|
||||
|
||||
You will implement a backend system where users can create accounts, view menu items, create orders, and store all information permanently inside a database.
|
||||
You will implement a backend system where users can create accounts, view the restaurant's menu, place orders, and store all transaction data permanently in a database.
|
||||
|
||||
The project should be implemented using:
|
||||
**Tech Stack:**
|
||||
|
||||
- Java 23
|
||||
- **Language:** Java 23
|
||||
|
||||
- Maven
|
||||
- **Build Tool:** Maven
|
||||
|
||||
- PostgreSQL
|
||||
- **Database:** PostgreSQL
|
||||
|
||||
- JDBC
|
||||
- **API:** JDBC
|
||||
|
||||
|
||||
---
|
||||
## ✅ Prerequisites
|
||||
|
||||
# Prerequisites ✅
|
||||
|
||||
Make sure you have installed:
|
||||
Before starting, ensure you have the following installed on your machine:
|
||||
|
||||
- Git
|
||||
|
||||
- Java 23
|
||||
- Java 23 (JDK)
|
||||
|
||||
- Maven
|
||||
|
||||
- PostgreSQL
|
||||
|
||||
- PostgreSQL Client (pgAdmin is recommended)
|
||||
- A PostgreSQL Database GUI (e.g., pgAdmin, DBeaver, or DataGrip)
|
||||
|
||||
|
||||
---
|
||||
## ⚙️ Maven Configuration
|
||||
|
||||
# Maven Configuration
|
||||
This project relies on **Maven** to manage dependencies. Your project must contain a `pom.xml` file configured for Java 23 and the PostgreSQL JDBC driver.
|
||||
|
||||
This project must use **Maven** as the build tool.
|
||||
**Example `pom.xml` snippet:**
|
||||
|
||||
Your project should contain:
|
||||
XML
|
||||
|
||||
```
|
||||
pom.xml
|
||||
```
|
||||
|
||||
The `pom.xml` file is responsible for managing project dependencies and configuring the Java version.
|
||||
|
||||
Example:
|
||||
|
||||
```xml
|
||||
<properties>
|
||||
<properties>
|
||||
<maven.compiler.source>23</maven.compiler.source>
|
||||
<maven.compiler.target>23</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
|
||||
<postgresql.version>42.7.8</postgresql.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.postgresql</groupId>
|
||||
<artifactId>postgresql</artifactId>
|
||||
<version>${postgresql.version}</version>
|
||||
<groupId>org.postgresql</groupId>
|
||||
<artifactId>postgresql</artifactId>
|
||||
<version>${postgresql.version}</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
</dependencies>
|
||||
```
|
||||
|
||||
This dependency allows your Java application to connect to PostgreSQL using JDBC.
|
||||
## 🎯 Objectives
|
||||
|
||||
By completing this assignment, you will be able to:
|
||||
|
||||
---
|
||||
|
||||
# Objectives ✏️
|
||||
|
||||
By completing this assignment, you will:
|
||||
|
||||
- Learn how to design a relational database
|
||||
- Design a structured relational database schema.
|
||||
|
||||
- Understand database relationships
|
||||
- Understand and implement database relationships (One-to-Many).
|
||||
|
||||
- Work with Primary Keys and Foreign Keys
|
||||
- Work effectively with **Primary Keys (PK)** and **Foreign Keys (FK)**.
|
||||
|
||||
- Use SQL to create and manage tables
|
||||
- Write SQL scripts to create tables and insert initial data.
|
||||
|
||||
- Connect Java applications to PostgreSQL using JDBC
|
||||
- Connect a Java application to PostgreSQL using JDBC.
|
||||
|
||||
- Implement CRUD operations
|
||||
- Implement **CRUD** (Create, Read, Update, Delete) operations via Java.
|
||||
|
||||
- Handle database transactions
|
||||
- Build a modular and object-oriented backend application.
|
||||
|
||||
- Build a structured backend application
|
||||
|
||||
## 🏗️ Database Entities & Schema
|
||||
|
||||
---
|
||||
Your database must be created via a `database.sql` script. This file must include all `CREATE TABLE` statements, keys, constraints, and initial mock data.
|
||||
|
||||
# Important Concepts
|
||||
Here are the required entities:
|
||||
|
||||
## CRUD Operations
|
||||
### 1. User (Customer)
|
||||
|
||||
CRUD represents the four basic operations used to manage data in a database.
|
||||
Represents a customer using the system.
|
||||
|
||||
CRUD stands for:
|
||||
|
||||
---
|
||||
|
||||
## Create
|
||||
|
||||
Adding new records to the database.
|
||||
|
||||
Example:
|
||||
|
||||
```sql
|
||||
INSERT INTO users(username, password)
|
||||
VALUES ('ali', 'hashed_password');
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Read
|
||||
|
||||
Retrieving information from the database.
|
||||
|
||||
Example:
|
||||
|
||||
```sql
|
||||
SELECT * FROM menu_items;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Update
|
||||
|
||||
Changing existing information.
|
||||
|
||||
Example:
|
||||
|
||||
```sql
|
||||
UPDATE users
|
||||
SET email='new@email.com'
|
||||
WHERE id=1;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Delete
|
||||
|
||||
Removing records.
|
||||
|
||||
Example:
|
||||
|
||||
```sql
|
||||
DELETE FROM menu_items
|
||||
WHERE id=3;
|
||||
```
|
||||
|
||||
Your application should support CRUD operations where appropriate.
|
||||
|
||||
---
|
||||
|
||||
# Database Entities
|
||||
|
||||
Your database must contain these entities:
|
||||
|
||||
---
|
||||
|
||||
# 1. User
|
||||
|
||||
Represents a customer.
|
||||
|
||||
## Attributes:
|
||||
|
||||
- id
|
||||
- **id:** `SERIAL PRIMARY KEY`
|
||||
|
||||
- Primary Key
|
||||
|
||||
- username
|
||||
- **username:** `VARCHAR` (Required, UNIQUE)
|
||||
|
||||
- Required
|
||||
|
||||
- Unique
|
||||
|
||||
- password
|
||||
- **password:** `TEXT` (Required, stored as a hashed value)
|
||||
|
||||
- Stored as hashed value
|
||||
|
||||
- email
|
||||
- **email:** `VARCHAR` (Optional)
|
||||
|
||||
- _Relationship:_ A User can have many Orders (1-to-N).
|
||||
|
||||
- Optional
|
||||
|
||||
|
||||
## Relationship:
|
||||
### 2. MenuItem
|
||||
|
||||
One user can have many orders.
|
||||
Represents the food/drink items available in the restaurant.
|
||||
|
||||
- **id:** `SERIAL PRIMARY KEY`
|
||||
|
||||
- **name:** `VARCHAR` (Required)
|
||||
|
||||
- **description:** `TEXT` (Optional)
|
||||
|
||||
- **price:** `NUMERIC` or `DECIMAL` (Required, must be strictly positive)
|
||||
|
||||
- **category:** `VARCHAR` (Optional)
|
||||
|
||||
- _Requirement:_ You must pre-populate this table with at least 3 items using `INSERT` statements in your SQL file.
|
||||
|
||||
|
||||
### 3. Order
|
||||
|
||||
Represents a specific order placed by a customer.
|
||||
|
||||
- **id:** `SERIAL PRIMARY KEY`
|
||||
|
||||
- **userId:** `FOREIGN KEY` (References `User.id`)
|
||||
|
||||
- **createdAt:** `TIMESTAMP` (Default to current time)
|
||||
|
||||
- **totalPrice:** `NUMERIC` or `DECIMAL`
|
||||
|
||||
- _Relationship:_ An Order belongs to one User. An Order contains many OrderDetails (1-to-N).
|
||||
|
||||
|
||||
### 4. OrderDetail
|
||||
|
||||
Acts as a bridge table storing the specific items and quantities inside a single order.
|
||||
|
||||
- **id:** `SERIAL PRIMARY KEY`
|
||||
|
||||
- **orderId:** `FOREIGN KEY` (References `Order.id`)
|
||||
|
||||
- **menuItemId:** `FOREIGN KEY` (References `MenuItem.id`)
|
||||
|
||||
- **quantity:** `INTEGER` (Must be > 0)
|
||||
|
||||
- **price:** `NUMERIC` (Snapshot of the item's price at the time of purchase)
|
||||
|
||||
|
||||
## 💻 Required Features & App Flow
|
||||
|
||||
You must create a Java application that communicates solely with PostgreSQL using JDBC. **Do not store any application data in local text files.**
|
||||
|
||||
### Feature 1: User Management (Auth)
|
||||
|
||||
- **Register:** Insert a new user. Verify the username is unique and hash the password before saving.
|
||||
|
||||
- **Login:** Validate credentials against the database. Handle incorrect username or password scenarios gracefully.
|
||||
|
||||
|
||||
### Feature 2: Menu Browsing
|
||||
|
||||
- Fetch and display all available `MenuItem` records from the database.
|
||||
|
||||
|
||||
### Feature 3: Order Creation
|
||||
|
||||
- Allow the logged-in user to select items from the menu and specify a quantity.
|
||||
|
||||
- Calculate the total price.
|
||||
|
||||
- Save the `Order` record, and subsequently save the corresponding `OrderDetail` records.
|
||||
|
||||
|
||||
### Feature 4: Receipt Generation
|
||||
|
||||
- After an order is placed, query the database to print a detailed receipt.
|
||||
|
||||
- **Must include:** Item names, quantities, unit prices, subtotal per item, and the final grand total.
|
||||
|
||||
|
||||
### Feature 5: Order History (Bonus ⭐)
|
||||
|
||||
- Allow a user to view all their past orders and the total amount spent on each.
|
||||
|
||||
|
||||
## 📱 Sample Console Menu Template
|
||||
|
||||
To give you an idea of how your application should flow, here is a recommended structure for your Command Line Interface :
|
||||
|
||||
Plaintext
|
||||
|
||||
```
|
||||
User 1 -------- N Order
|
||||
=======================================
|
||||
🍕 WELCOME TO JAVA PIZZERIA 🍕
|
||||
=======================================
|
||||
1. Login
|
||||
2. Register New Account
|
||||
3. Exit
|
||||
=======================================
|
||||
Choose an option: 1
|
||||
|
||||
[Login]
|
||||
Enter username: ***
|
||||
Enter password: ***
|
||||
|
||||
=======================================
|
||||
🍽️ MAIN MENU 🍽️
|
||||
=======================================
|
||||
1. View Menu
|
||||
2. Place a New Order
|
||||
3. View Order History (Bonus)
|
||||
4. Logout
|
||||
=======================================
|
||||
Choose an option: 2
|
||||
|
||||
[Placing Order]
|
||||
Available Items:
|
||||
1. Pizza - $10.00
|
||||
2. Burger - $8.00
|
||||
3. Pasta - $12.00
|
||||
|
||||
Enter the ID of the item to add (or 0 to finish): 1
|
||||
Enter quantity: 2
|
||||
Added 2x Pizza to your cart.
|
||||
|
||||
Enter the ID of the item to add (or 0 to finish): 0
|
||||
|
||||
[Order Summary / Receipt]
|
||||
---------------------------------------
|
||||
Item Qty Unit Total
|
||||
---------------------------------------
|
||||
Pizza 2 $10.00 $20.00
|
||||
---------------------------------------
|
||||
Final Total: $20.00
|
||||
Order saved successfully!
|
||||
```
|
||||
|
||||
---
|
||||
## 📃 Evaluation Criteria
|
||||
|
||||
# 2. MenuItem
|
||||
Your project will be graded based on the following:
|
||||
|
||||
Represents restaurant menu items.
|
||||
**1. Database Design:**
|
||||
|
||||
## Attributes:
|
||||
|
||||
- id
|
||||
- Correct schema design with appropriately chosen data types.
|
||||
|
||||
- Primary Key
|
||||
|
||||
- name
|
||||
- Proper use of Primary Keys, Foreign Keys, and Constraints (e.g., `NOT NULL`, `UNIQUE`).
|
||||
|
||||
- description
|
||||
|
||||
- Optional
|
||||
|
||||
- price
|
||||
|
||||
- category
|
||||
|
||||
- Optional
|
||||
|
||||
|
||||
## Requirement:
|
||||
|
||||
Database must contain at least 3 initial menu items.
|
||||
|
||||
Example:
|
||||
|
||||
|Name|Price|Category|
|
||||
|---|---|---|
|
||||
|Pizza|10|Fast Food|
|
||||
|Burger|8|Fast Food|
|
||||
|Pasta|12|Italian|
|
||||
|
||||
---
|
||||
|
||||
# 3. Order
|
||||
|
||||
Represents a customer's order.
|
||||
|
||||
## Attributes:
|
||||
|
||||
- id
|
||||
|
||||
- Primary Key
|
||||
|
||||
- userId
|
||||
|
||||
- Foreign Key
|
||||
|
||||
- createdAt
|
||||
|
||||
- totalPrice
|
||||
- A working `database.sql` initialization script.
|
||||
|
||||
|
||||
## Relationships:
|
||||
**2. JDBC Integration:**
|
||||
|
||||
```
|
||||
User 1 -------- N Order
|
||||
```
|
||||
|
||||
```
|
||||
Order 1 -------- N OrderDetail
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# 4. OrderDetail
|
||||
|
||||
Stores each ordered item.
|
||||
|
||||
## Attributes:
|
||||
|
||||
- id
|
||||
- Successful connection to PostgreSQL.
|
||||
|
||||
- Primary Key
|
||||
|
||||
- orderId
|
||||
- Use of `PreparedStatement` to prevent SQL injection.
|
||||
|
||||
- Foreign Key
|
||||
|
||||
- menuItemId
|
||||
|
||||
- Foreign Key
|
||||
|
||||
- quantity
|
||||
|
||||
- price
|
||||
- Proper exception handling (`SQLException`).
|
||||
|
||||
|
||||
Example:
|
||||
**3. Code Quality & OOP:**
|
||||
|
||||
Order:
|
||||
|
||||
```
|
||||
Pizza x2
|
||||
Burger x1
|
||||
```
|
||||
|
||||
Stored as:
|
||||
|
||||
|Order ID|Item|Quantity|
|
||||
|---|---|---|
|
||||
|1|Pizza|2|
|
||||
|1|Burger|1|
|
||||
|
||||
---
|
||||
|
||||
# Database Requirements
|
||||
|
||||
Create:
|
||||
|
||||
```
|
||||
database.sql
|
||||
```
|
||||
|
||||
This file must include:
|
||||
|
||||
- CREATE TABLE statements
|
||||
- Clean structure (e.g., separating database logic into DAO classes).
|
||||
|
||||
- Primary Keys
|
||||
- Avoidance of code duplication.
|
||||
|
||||
- Foreign Keys
|
||||
|
||||
- Constraints
|
||||
|
||||
- Initial data
|
||||
|
||||
|
||||
Example:
|
||||
|
||||
```sql
|
||||
CREATE TABLE users(
|
||||
|
||||
id SERIAL PRIMARY KEY,
|
||||
|
||||
username VARCHAR(50) UNIQUE NOT NULL,
|
||||
|
||||
password TEXT NOT NULL
|
||||
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Java + JDBC Requirements
|
||||
|
||||
Create a Java application that communicates with PostgreSQL using JDBC.
|
||||
|
||||
All data must be stored inside PostgreSQL.
|
||||
|
||||
Do not store application data in files.
|
||||
|
||||
---
|
||||
|
||||
# Required Features
|
||||
|
||||
## User Management
|
||||
|
||||
The system must support:
|
||||
|
||||
### Register User
|
||||
|
||||
Insert a new user.
|
||||
|
||||
Required:
|
||||
|
||||
- Username
|
||||
|
||||
- Password
|
||||
|
||||
- Email (optional)
|
||||
|
||||
|
||||
Rules:
|
||||
|
||||
- Username must be unique
|
||||
|
||||
- Password must be hashed
|
||||
|
||||
|
||||
---
|
||||
|
||||
### Login Validation
|
||||
|
||||
Check credentials from database.
|
||||
|
||||
Possible results:
|
||||
|
||||
- Login successful
|
||||
|
||||
- Username not found
|
||||
|
||||
- Wrong password
|
||||
|
||||
|
||||
---
|
||||
|
||||
# Menu Management
|
||||
|
||||
Load menu items from database.
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
ID | Name | Price
|
||||
|
||||
1 | Pizza | 10
|
||||
2 | Burger | 8
|
||||
3 | Pasta | 12
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Order Management
|
||||
|
||||
Users should be able to create orders.
|
||||
|
||||
Process:
|
||||
|
||||
1. Select user
|
||||
|
||||
2. Select food items
|
||||
|
||||
3. Set quantity
|
||||
|
||||
4. Save order
|
||||
|
||||
|
||||
Database example:
|
||||
|
||||
Order:
|
||||
|
||||
|ID|User ID|Total|
|
||||
|---|---|---|
|
||||
|1|5|28|
|
||||
|
||||
OrderDetail:
|
||||
|
||||
|Order ID|Item|Quantity|
|
||||
|---|---|---|
|
||||
|1|Pizza|2|
|
||||
|1|Burger|1|
|
||||
|
||||
---
|
||||
|
||||
# Receipt Generation
|
||||
|
||||
After creating an order, retrieve the order information from database.
|
||||
|
||||
Receipt must include:
|
||||
|
||||
- Food name
|
||||
|
||||
- Quantity
|
||||
|
||||
- Unit price
|
||||
|
||||
- Item total price
|
||||
|
||||
- Final order price
|
||||
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
Pizza
|
||||
|
||||
Quantity: 2
|
||||
Unit Price: 10
|
||||
Total: 20
|
||||
|
||||
|
||||
Burger
|
||||
|
||||
Quantity: 1
|
||||
Unit Price: 8
|
||||
Total: 8
|
||||
|
||||
|
||||
Final Price: 28
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Order History (Bonus)
|
||||
|
||||
Users can view previous orders.
|
||||
|
||||
---
|
||||
|
||||
# Database Rules
|
||||
|
||||
Required:
|
||||
|
||||
- Every table must have Primary Key
|
||||
|
||||
- Relationships must use Foreign Keys
|
||||
|
||||
- Username must be UNIQUE
|
||||
|
||||
- Required fields must be NOT NULL
|
||||
|
||||
- Price must be positive
|
||||
|
||||
|
||||
---
|
||||
|
||||
# Transaction Requirement
|
||||
|
||||
Creating an order must use a database transaction.
|
||||
|
||||
Steps:
|
||||
|
||||
1. Insert Order
|
||||
|
||||
2. Insert OrderDetails
|
||||
|
||||
|
||||
If any step fails:
|
||||
|
||||
Rollback the entire operation.
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
BEGIN TRANSACTION
|
||||
|
||||
Insert Order
|
||||
|
||||
Insert OrderDetails
|
||||
|
||||
COMMIT
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Evaluation Criteria 📃
|
||||
|
||||
## Database Design
|
||||
|
||||
- Correct schema design
|
||||
|
||||
- Proper relationships
|
||||
|
||||
- Correct constraints
|
||||
|
||||
- SQL initialization file
|
||||
|
||||
|
||||
## JDBC Integration
|
||||
|
||||
- PostgreSQL connection
|
||||
|
||||
- Correct SQL queries
|
||||
|
||||
- PreparedStatement usage
|
||||
|
||||
- Exception handling
|
||||
|
||||
|
||||
## Functionality
|
||||
|
||||
The application must support:
|
||||
|
||||
- Creating users
|
||||
|
||||
- Login verification
|
||||
|
||||
- Reading menu items
|
||||
|
||||
- Creating orders
|
||||
|
||||
- Saving order details
|
||||
|
||||
- Generating receipts
|
||||
|
||||
- Viewing order history
|
||||
|
||||
|
||||
## Code Quality
|
||||
|
||||
The code should:
|
||||
|
||||
- Follow Object-Oriented principles
|
||||
|
||||
- Have clean structure
|
||||
|
||||
- Avoid duplicated code
|
||||
|
||||
- Separate database logic from application logic
|
||||
|
||||
|
||||
---
|
||||
- Application successfully covers all required functionalities (Auth, Menu, Ordering, Receipts).
|
||||
Reference in New Issue
Block a user