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 | |