Spaces:
Sleeping
Sleeping
# Unified Database Schema Design | |
## Overview | |
Refactor from multiple hotel-specific databases to a single unified `Tabble.db` with hotel_id discrimination. | |
## Current vs Target Architecture | |
### Current Architecture | |
- **Multiple Databases:** Each hotel has separate .db file | |
- **Authentication:** database_name + password | |
- **Data Isolation:** Separate database files | |
- **Connection Management:** DatabaseManager switches between databases per session | |
### Target Architecture | |
- **Single Database:** Tabble.db | |
- **Authentication:** hotel_name + password (from hotels.csv) | |
- **Data Isolation:** hotel_id foreign key filtering | |
- **Connection Management:** Single connection with hotel_id context | |
## Hotels Registry Table | |
```sql | |
CREATE TABLE hotels ( | |
id INTEGER PRIMARY KEY, | |
hotel_name VARCHAR NOT NULL UNIQUE, | |
password VARCHAR NOT NULL, | |
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, | |
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP | |
); | |
``` | |
**Data Migration from hotels.csv:** | |
```csv | |
hotel_name,password,hotel_id | |
tabble_new,myhotel,1 | |
anifa,anifa123,2 | |
hotelgood,hotelgood123,3 | |
hotelmoon,moon123,4 | |
shine,shine123,5 | |
``` | |
## Updated Table Schemas | |
### 1. Dishes Table | |
```sql | |
CREATE TABLE dishes ( | |
id INTEGER PRIMARY KEY, | |
hotel_id INTEGER NOT NULL, | |
name VARCHAR, | |
description TEXT, | |
category VARCHAR, | |
price FLOAT, | |
quantity INTEGER DEFAULT 0, | |
image_path VARCHAR, | |
discount FLOAT DEFAULT 0, | |
is_offer INTEGER DEFAULT 0, | |
is_special INTEGER DEFAULT 0, | |
visibility INTEGER DEFAULT 1, | |
created_at DATETIME, | |
updated_at DATETIME, | |
FOREIGN KEY (hotel_id) REFERENCES hotels (id) | |
); | |
``` | |
### 2. Persons Table | |
```sql | |
CREATE TABLE persons ( | |
id INTEGER PRIMARY KEY, | |
hotel_id INTEGER NOT NULL, | |
username VARCHAR, | |
password VARCHAR, | |
phone_number VARCHAR, | |
visit_count INTEGER DEFAULT 0, | |
last_visit DATETIME, | |
created_at DATETIME, | |
FOREIGN KEY (hotel_id) REFERENCES hotels (id), | |
UNIQUE(hotel_id, username), | |
UNIQUE(hotel_id, phone_number) | |
); | |
``` | |
### 3. Orders Table | |
```sql | |
CREATE TABLE orders ( | |
id INTEGER PRIMARY KEY, | |
hotel_id INTEGER NOT NULL, | |
person_id INTEGER, | |
table_number INTEGER, | |
total_amount FLOAT, | |
status VARCHAR, | |
unique_id VARCHAR, | |
created_at DATETIME, | |
updated_at DATETIME, | |
FOREIGN KEY (hotel_id) REFERENCES hotels (id), | |
FOREIGN KEY (person_id) REFERENCES persons (id) | |
); | |
``` | |
### 4. Order Items Table | |
```sql | |
CREATE TABLE order_items ( | |
id INTEGER PRIMARY KEY, | |
hotel_id INTEGER NOT NULL, | |
order_id INTEGER, | |
dish_id INTEGER, | |
quantity INTEGER, | |
price FLOAT, | |
FOREIGN KEY (hotel_id) REFERENCES hotels (id), | |
FOREIGN KEY (order_id) REFERENCES orders (id), | |
FOREIGN KEY (dish_id) REFERENCES dishes (id) | |
); | |
``` | |
### 5. Tables Table | |
```sql | |
CREATE TABLE tables ( | |
id INTEGER PRIMARY KEY, | |
hotel_id INTEGER NOT NULL, | |
table_number INTEGER, | |
is_occupied BOOLEAN DEFAULT FALSE, | |
current_order_id INTEGER, | |
created_at DATETIME, | |
updated_at DATETIME, | |
FOREIGN KEY (hotel_id) REFERENCES hotels (id), | |
FOREIGN KEY (current_order_id) REFERENCES orders (id), | |
UNIQUE(hotel_id, table_number) | |
); | |
``` | |
### 6. Settings Table | |
```sql | |
CREATE TABLE settings ( | |
id INTEGER PRIMARY KEY, | |
hotel_id INTEGER NOT NULL, | |
hotel_name VARCHAR NOT NULL, | |
address VARCHAR, | |
contact_number VARCHAR, | |
email VARCHAR, | |
tax_id VARCHAR, | |
logo_path VARCHAR, | |
created_at DATETIME, | |
updated_at DATETIME, | |
FOREIGN KEY (hotel_id) REFERENCES hotels (id), | |
UNIQUE(hotel_id) | |
); | |
``` | |
### 7. Feedback Table | |
```sql | |
CREATE TABLE feedback ( | |
id INTEGER PRIMARY KEY, | |
hotel_id INTEGER NOT NULL, | |
order_id INTEGER, | |
person_id INTEGER, | |
rating INTEGER, | |
comment TEXT, | |
created_at DATETIME, | |
FOREIGN KEY (hotel_id) REFERENCES hotels (id), | |
FOREIGN KEY (order_id) REFERENCES orders (id), | |
FOREIGN KEY (person_id) REFERENCES persons (id) | |
); | |
``` | |
### 8. Loyalty Program Table | |
```sql | |
CREATE TABLE loyalty_tiers ( | |
id INTEGER PRIMARY KEY, | |
hotel_id INTEGER NOT NULL, | |
visit_count INTEGER, | |
discount_percentage FLOAT, | |
is_active BOOLEAN DEFAULT TRUE, | |
created_at DATETIME, | |
updated_at DATETIME, | |
FOREIGN KEY (hotel_id) REFERENCES hotels (id) | |
); | |
``` | |
### 9. Selection Offers Table | |
```sql | |
CREATE TABLE selection_offers ( | |
id INTEGER PRIMARY KEY, | |
hotel_id INTEGER NOT NULL, | |
min_amount FLOAT, | |
discount_amount FLOAT, | |
is_active BOOLEAN DEFAULT TRUE, | |
description VARCHAR, | |
created_at DATETIME, | |
updated_at DATETIME, | |
FOREIGN KEY (hotel_id) REFERENCES hotels (id) | |
); | |
``` | |
## Key Changes Required | |
### 1. Database Models (SQLAlchemy) | |
- Add `hotel_id` column to all models | |
- Add foreign key relationships to hotels table | |
- Update unique constraints to include hotel_id | |
### 2. Authentication System | |
- Change from `database_name + password` to `hotel_name + password` | |
- Update middleware to validate against hotels table | |
- Modify frontend to use hotel names instead of database names | |
### 3. Database Manager | |
- Remove database switching logic | |
- Use single connection to Tabble.db | |
- Add hotel_id context to session management | |
### 4. Query Filtering | |
- Add `filter(Model.hotel_id == current_hotel_id)` to all queries | |
- Update all CRUD operations to include hotel_id | |
- Ensure data isolation through query filtering | |
### 5. Migration Strategy | |
- Create migration script to: | |
1. Create new Tabble.db with unified schema | |
2. Migrate data from existing hotel databases | |
3. Populate hotels table from hotels.csv | |
4. Add hotel_id to all migrated records | |
## Data Isolation Verification | |
- All queries must include hotel_id filtering | |
- No cross-hotel data access possible | |
- Maintain same security level as separate databases | |