| 385 | | * Users(user_id, username, email, name, surname, full_name, password_hash, user_created_at) |
| 386 | | * Clients(client_id, user_id, is_blocked, blocked_at, blocked_reason) |
| 387 | | * Admins(admin_id, user_id) |
| 388 | | * Owners(owner_id, client_id) |
| 389 | | * Notifications(notification_id, user_id, notification_type, notification_message, notification_created_at, is_read) |
| 390 | | * VetClinics(clinic_id, clinic_name, clinic_email, clinic_phone, clinic_address, clinic_location, clinic_city) |
| 391 | | * VetClinicApplications(application_id, clinic_id, app_name, app_email, app_phone, app_city, app_address, submitted_at, app_status, reviewed_at, reviewed_by, denial_reason) |
| 392 | | * Animals(animal_id, owner_id, animal_name, located_name, species, animal_type, breed, sex, date_of_birth, photo_url) |
| 393 | | * Listings(listing_id, admin_id, animal_id, listing_status, listing_created_at, price, listing_description) |
| 394 | | * FavoriteListings(saved_user_id, saved_listing_id) |
| 395 | | * Appointments(appointment_id, clinic_id, animal_id, date_time, appointment_status, notes) |
| 396 | | * HealthRecords(healthrecord_id, appointment_id, animal_id, hr_type, hr_description, hr_date) |
| 397 | | * Reviews(review_id, reviewer_id, rating, comment, review_created_at, updated_at, is_deleted) |
| 398 | | * UserReviews(review_id, target_user_id) |
| 399 | | * ClinicReviews(review_id, target_clinic_id) |
| | 385 | Final relations |
| | 386 | |
| | 387 | After applying normalization up to 4NF, the final normalized schema consists of the following relations: |
| | 388 | |
| | 389 | {{{ |
| | 390 | UserEntity(user_id, first_name, last_name, email, password, role) |
| | 391 | Users(user_id) |
| | 392 | Administrators(admin_id, user_id) |
| | 393 | Instructors(instructor_id, user_id) |
| | 394 | |
| | 395 | SubscriptionPlan(plan_id, plan_name, price, duration_months, plan_description, access_type) |
| | 396 | UserSubscription(subscription_id, user_id, plan_id, start_date, end_date, subscription_status) |
| | 397 | Payment(payment_id, user_id, subscription_id, amount) |
| | 398 | |
| | 399 | SupportTicket(ticket_id, user_id, admin_id, subject, ticket_description, ticket_status, created_at) |
| | 400 | |
| | 401 | Category(category_id, category_name, category_description) |
| | 402 | Course(course_id, course_name, course_price, course_status, instructor_id) |
| | 403 | CourseCategory(course_id, category_id) |
| | 404 | |
| | 405 | Module(module_id, course_id, module_title, module_description) |
| | 406 | Lesson(lesson_id, module_id, lesson_title, material) |
| | 407 | Quiz(quiz_id, lesson_id, total_points, passing_score) |
| | 408 | QuizAttempt(attempt_id, user_id, quiz_id, score, attempt_date) |
| | 409 | |
| | 410 | Enrollment(enrollment_id, user_id, course_id, enroll_date, completion_status, progress_percentage) |
| | 411 | Certificate(certificate_id, enrollment_id, issue_date, certificate_code, certificate_status) |
| | 412 | }}} |
| | 413 | |
| | 414 | The final schema removes partial and transitive dependencies, avoids unnecessary redundancy, and preserves the functional dependencies from the initial universal relation. |