# Schema Design ## MySQL Database Design ### Table: patients _Patient information_ - id: INT, Primary Key, Auto Increment - user_id: INT, Foreign Key → user(id) - age: INT, Not Null, Constraint(age > 0) - description: VARCHAR - phone_number: VARCHAR -- Validated via Code - email_address: VARCHAR -- Validated via Code - home_address: VARCHAR - archived: BOOLEAN, Not Null, default False -- When patient is removed it is marked as Archived and his active appointments are marked as Cancelled. ### Table: appointments _Appointment information_ - id: INT, Primary Key, Auto Increment - doctor_id: INT, Foreign Key → doctors(id) - patient_id: INT, Foreign Key → patients(id) - appointment_time: DATETIME, Not Null - status: INT (0 = Scheduled, 1 = Completed, 2 = Cancelled) - status_changed_timestamp: DATETIME, Not Null - reason: VARCHAR, Not Null ### Table: doctors _Doctor information_ - id: INT, Primary Key, Auto Increment - user_id: INT, Foreign Key → user(id) - specialization: VARCHAR, Not Null - phone_number: VARCHAR -- Validated via Code - email_address: VARCHAR -- Validated via Code - archived: BOOLEAN, Not Null, default False -- When doctor is removed it is marked as Archived and his active appointments are marked as Cancelled. ### Table: user _Basic user information for all system users_ - id: INT, Primary Key, Auto Increment - username: VARCHAR, Not Null, Unique - password: CHAR(64) -- SHA256 hashed password value - role: INT (0 = Admin, 1 = Doctor, 2 = Patient) - name: VARCHAR, Not Null - last_login_timestamp: DATETIME - registration_timestamp: DATETIME, Not Null ### Table: office_hours _Table storing regular office hours for a doctor_ - id: INT, Primary Key, Auto Increment - doctor_id: Foreign Key → doctors(id) - day: INT (0 = Monday, 1 = Tuesday, 2 = Wednesday, 3 = Thursday, 4 = Friday), Not Null - start: TIME, Not Null - end: TIME, Not Null - Constraint: start < end ### Table: unavailability_schedule _Table storing temporary unavailability for a doctor_ - id: INT, Primary Key, Auto Increment - doctor_id: Foreign Key → doctors(id) - start: TIMETIME, Not Null - end: TIMETIME, Not Null - Constraint: start < end ## MongoDB Collection Design ### Collection: prescriptions _Collection describing a prescriptions for the patients_ ```json { "_id": "ObjectId('64abc123456')", "doctorId":222222, "patientId": 123213, "appointmentId": 51, "medication": "Paracetamol", "dosage": "500mg", "doctorNotes": "Take 1 tablet every 6 hours.", "refillCount": 2, "pharmacy": { "name": "Walgreens SF", "location": "Market Street" } "timestamp": "2011-12-03T10:15:30Z", "expires:" "2012-12-03T10:15:30Z" } ``` ### Collection: messages _Chat message between Doctor and Patient_ ```json { "_id": "ObjectId('64abc123456')", "_parentId": "ObjectId('64abc123456')", "fromUserId": 121, "toUserId": 121, "message": "Where can I get the medicine from", "timestamp": "2011-12-03T10:15:30Z" } ```