Update README.md

This commit is contained in:
2026-06-16 18:04:51 +00:00
parent ff87e1572f
commit 231793f6a1
+192 -528
View File
@@ -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).