SEHIYYE — Database sxemi (Laravel migrasiyaları əsasında) Tarix: 2026-04-20 Qeyd: - Aşağıdakı məlumatlar `database/migrations` fayllarında yaradılan cədvəllərə əsaslanır. - “PK” = Primary Key (əsas açar), “FK” = Foreign Key (xarici açar), “UNIQUE” = təkrarlanmayan dəyər. - `timestamps()` adətən `created_at` və `updated_at` sahələrini (TIMESTAMP, NULL ola bilər) yaradır. =============================================================================== TABLE: users Təyinat: Sistemdəki bütün istifadəçilər (admin, həkim, pasiyent və s.). Column-lar: - id: BIGINT UNSIGNED, PK, auto-increment - name: VARCHAR(255), NULL deyil - email: VARCHAR(255), NULL deyil, UNIQUE - phone: VARCHAR(32), NULL ola bilər, INDEX - email_verified_at: TIMESTAMP, NULL ola bilər - password: VARCHAR(255), NULL deyil - remember_token: VARCHAR(100), NULL ola bilər - is_active: BOOLEAN (TINYINT(1)), default = true, INDEX - last_login_at: TIMESTAMP, NULL ola bilər - created_at: TIMESTAMP, NULL ola bilər - updated_at: TIMESTAMP, NULL ola bilər Key-lər / indekslər: - PK: (id) - UNIQUE: (email) - INDEX: (phone), (is_active) =============================================================================== TABLE: roles Təyinat: Rol siyahısı (məs: admin, doctor, receptionist və s.). Column-lar: - id: BIGINT UNSIGNED, PK, auto-increment - name: VARCHAR(255), NULL deyil - slug: VARCHAR(255), NULL deyil, UNIQUE - created_at: TIMESTAMP, NULL ola bilər - updated_at: TIMESTAMP, NULL ola bilər Key-lər / indekslər: - PK: (id) - UNIQUE: (slug) =============================================================================== TABLE: role_user Təyinat: İstifadəçilər ilə rollar arasında çox-çoxa əlaqə (pivot cədvəl). Column-lar: - role_id: BIGINT UNSIGNED, FK -> roles.id, ON DELETE CASCADE - user_id: BIGINT UNSIGNED, FK -> users.id, ON DELETE CASCADE - created_at: TIMESTAMP, NULL ola bilər - updated_at: TIMESTAMP, NULL ola bilər Key-lər / indekslər: - PK (kompozit): (role_id, user_id) - INDEX: (user_id, role_id) =============================================================================== TABLE: departments Təyinat: Şöbələr (məs: Kardiologiya, Terapiya və s.). Column-lar: - id: BIGINT UNSIGNED, PK, auto-increment - name: VARCHAR(255), NULL deyil, UNIQUE - description: TEXT, NULL ola bilər - is_active: BOOLEAN (TINYINT(1)), default = true, INDEX - created_at: TIMESTAMP, NULL ola bilər - updated_at: TIMESTAMP, NULL ola bilər Key-lər / indekslər: - PK: (id) - UNIQUE: (name) - INDEX: (is_active) =============================================================================== TABLE: doctors Təyinat: Həkim profili (istifadəçi hesabına bağlı). Column-lar: - id: BIGINT UNSIGNED, PK, auto-increment - user_id: BIGINT UNSIGNED, UNIQUE, FK -> users.id, ON DELETE CASCADE - department_id: BIGINT UNSIGNED, FK -> departments.id, ON DELETE RESTRICT - license_no: VARCHAR(255), NULL deyil, UNIQUE, INDEX - specialization: VARCHAR(255), NULL ola bilər - phone: VARCHAR(32), NULL ola bilər - default_duration_minutes: SMALLINT UNSIGNED, default = 30 - consultation_fee: DECIMAL(10,2), default = 0 - is_active: BOOLEAN (TINYINT(1)), default = true - created_at: TIMESTAMP, NULL ola bilər - updated_at: TIMESTAMP, NULL ola bilər Key-lər / indekslər: - PK: (id) - UNIQUE: (user_id), (license_no) - INDEX: (department_id, is_active), (license_no) =============================================================================== TABLE: doctor_schedules Təyinat: Həkimin həftəlik iş qrafiki (gün/saat aralığı). Column-lar: - id: BIGINT UNSIGNED, PK, auto-increment - doctor_id: BIGINT UNSIGNED, FK -> doctors.id, ON DELETE CASCADE - day_of_week: TINYINT UNSIGNED (0=Sun ... 6=Sat) - start_time: TIME - end_time: TIME - slot_minutes: SMALLINT UNSIGNED, default = 30 - created_at: TIMESTAMP, NULL ola bilər - updated_at: TIMESTAMP, NULL ola bilər Key-lər / indekslər: - PK: (id) - UNIQUE: (doctor_id, day_of_week, start_time, end_time) [adı: doctor_schedule_unique] - INDEX: (doctor_id, day_of_week) =============================================================================== TABLE: doctor_time_offs Təyinat: Həkimin məzuniyyət/işdən kənar vaxtları (tətil, xəstəlik və s.). Column-lar: - id: BIGINT UNSIGNED, PK, auto-increment - doctor_id: BIGINT UNSIGNED, FK -> doctors.id, ON DELETE CASCADE - start_at: DATETIME - end_at: DATETIME - reason: VARCHAR(255), NULL ola bilər - created_at: TIMESTAMP, NULL ola bilər - updated_at: TIMESTAMP, NULL ola bilər Key-lər / indekslər: - PK: (id) - INDEX: (doctor_id, start_at) =============================================================================== TABLE: patients Təyinat: Pasiyent profili (istifadəçi hesabına bağlı). Column-lar: - id: BIGINT UNSIGNED, PK, auto-increment - user_id: BIGINT UNSIGNED, UNIQUE, FK -> users.id, ON DELETE CASCADE - mrn: VARCHAR(255), NULL deyil, UNIQUE, INDEX (Medical Record Number) - date_of_birth: DATE, NULL ola bilər - gender: ENUM('male','female','other','unknown'), default = 'unknown' - blood_type: VARCHAR(3), NULL ola bilər - phone: VARCHAR(32), NULL ola bilər - address: TEXT, NULL ola bilər - emergency_contact_name: VARCHAR(255), NULL ola bilər - emergency_contact_phone: VARCHAR(32), NULL ola bilər - insurance_provider: VARCHAR(255), NULL ola bilər - insurance_policy_no: VARCHAR(255), NULL ola bilər - created_at: TIMESTAMP, NULL ola bilər - updated_at: TIMESTAMP, NULL ola bilər Key-lər / indekslər: - PK: (id) - UNIQUE: (user_id), (mrn) - INDEX: (mrn), (date_of_birth, gender) =============================================================================== TABLE: appointments Təyinat: Qəbul/randevu məlumatları (pasiyent + həkim + şöbə + vaxt). Column-lar: - id: BIGINT UNSIGNED, PK, auto-increment - patient_id: BIGINT UNSIGNED, FK -> patients.id, ON DELETE CASCADE - doctor_id: BIGINT UNSIGNED, FK -> doctors.id, ON DELETE RESTRICT - department_id: BIGINT UNSIGNED, FK -> departments.id, ON DELETE RESTRICT - scheduled_at: DATETIME - ends_at: DATETIME - status: ENUM('scheduled','confirmed','completed','cancelled','no_show'), default = 'scheduled' - reason: VARCHAR(255), NULL ola bilər - notes: TEXT, NULL ola bilər - created_by_user_id: BIGINT UNSIGNED, NULL ola bilər, FK -> users.id, ON DELETE SET NULL - cancelled_by_user_id: BIGINT UNSIGNED, NULL ola bilər, FK -> users.id, ON DELETE SET NULL - cancelled_reason: VARCHAR(255), NULL ola bilər - created_at: TIMESTAMP, NULL ola bilər - updated_at: TIMESTAMP, NULL ola bilər Key-lər / indekslər: - PK: (id) - INDEX: (doctor_id, scheduled_at), (patient_id, scheduled_at), (status, scheduled_at) =============================================================================== TABLE: icd_codes Təyinat: ICD kodları (xəstəlik diaqnoz kodları). Column-lar: - id: BIGINT UNSIGNED, PK, auto-increment - code: VARCHAR(20), NULL deyil, UNIQUE, INDEX - title: VARCHAR(255), NULL deyil - description: TEXT, NULL ola bilər - is_active: BOOLEAN (TINYINT(1)), default = true, INDEX - created_at: TIMESTAMP, NULL ola bilər - updated_at: TIMESTAMP, NULL ola bilər Key-lər / indekslər: - PK: (id) - UNIQUE: (code) - INDEX: (code), (is_active) =============================================================================== TABLE: diagnoses Təyinat: Diaqnozlar (pasiyent/həkim/ICD kodu ilə bağlı). Column-lar: - id: BIGINT UNSIGNED, PK, auto-increment - appointment_id: BIGINT UNSIGNED, NULL ola bilər, FK -> appointments.id, ON DELETE SET NULL - patient_id: BIGINT UNSIGNED, FK -> patients.id, ON DELETE CASCADE - doctor_id: BIGINT UNSIGNED, FK -> doctors.id, ON DELETE RESTRICT - icd_code_id: BIGINT UNSIGNED, FK -> icd_codes.id, ON DELETE RESTRICT - severity: ENUM('mild','moderate','severe','critical'), NULL ola bilər - notes: TEXT, NULL ola bilər - diagnosed_at: DATETIME - created_at: TIMESTAMP, NULL ola bilər - updated_at: TIMESTAMP, NULL ola bilər Key-lər / indekslər: - PK: (id) - INDEX: (patient_id, diagnosed_at), (appointment_id) =============================================================================== TABLE: medical_records Təyinat: Tibbi qeydiyyatlar (visit note, lab nəticəsi, discharge və s.). Column-lar: - id: BIGINT UNSIGNED, PK, auto-increment - patient_id: BIGINT UNSIGNED, FK -> patients.id, ON DELETE CASCADE - appointment_id: BIGINT UNSIGNED, NULL ola bilər, FK -> appointments.id, ON DELETE SET NULL - doctor_id: BIGINT UNSIGNED, NULL ola bilər, FK -> doctors.id, ON DELETE SET NULL - created_by_user_id: BIGINT UNSIGNED, NULL ola bilər, FK -> users.id, ON DELETE SET NULL - record_type: ENUM('visit_note','nursing_note','lab_result','imaging','discharge_summary','other'), default = 'visit_note' - chief_complaint: VARCHAR(255), NULL ola bilər - subjective: LONGTEXT, NULL ola bilər - objective: LONGTEXT, NULL ola bilər - assessment: LONGTEXT, NULL ola bilər - plan: LONGTEXT, NULL ola bilər - recorded_at: DATETIME - created_at: TIMESTAMP, NULL ola bilər - updated_at: TIMESTAMP, NULL ola bilər Key-lər / indekslər: - PK: (id) - INDEX: (patient_id, recorded_at), (appointment_id) =============================================================================== TABLE: prescriptions Təyinat: Resept başlığı (pasiyent + həkim + tarix + status). Column-lar: - id: BIGINT UNSIGNED, PK, auto-increment - patient_id: BIGINT UNSIGNED, FK -> patients.id, ON DELETE CASCADE - doctor_id: BIGINT UNSIGNED, FK -> doctors.id, ON DELETE RESTRICT - appointment_id: BIGINT UNSIGNED, NULL ola bilər, FK -> appointments.id, ON DELETE SET NULL - diagnosis_id: BIGINT UNSIGNED, NULL ola bilər, FK -> diagnoses.id, ON DELETE SET NULL - issued_at: DATETIME - status: ENUM('active','completed','discontinued'), default = 'active' - notes: TEXT, NULL ola bilər - created_at: TIMESTAMP, NULL ola bilər - updated_at: TIMESTAMP, NULL ola bilər Key-lər / indekslər: - PK: (id) - INDEX: (patient_id, issued_at), (diagnosis_id) =============================================================================== TABLE: prescription_items Təyinat: Reseptdəki preparatlar (dərman maddələri). Column-lar: - id: BIGINT UNSIGNED, PK, auto-increment - prescription_id: BIGINT UNSIGNED, FK -> prescriptions.id, ON DELETE CASCADE, INDEX - medication_name: VARCHAR(255), NULL deyil - form: VARCHAR(255), NULL ola bilər - strength: VARCHAR(255), NULL ola bilər - dosage: VARCHAR(255), NULL ola bilər - frequency: VARCHAR(255), NULL ola bilər - route: VARCHAR(255), NULL ola bilər - duration_days: SMALLINT UNSIGNED, NULL ola bilər - quantity: INT UNSIGNED, NULL ola bilər - instructions: TEXT, NULL ola bilər - created_at: TIMESTAMP, NULL ola bilər - updated_at: TIMESTAMP, NULL ola bilər Key-lər / indekslər: - PK: (id) - INDEX: (prescription_id) =============================================================================== TABLE: lab_test_types Təyinat: Laborator analiz növləri (kod, ad, qiymət və s.). Column-lar: - id: BIGINT UNSIGNED, PK, auto-increment - code: VARCHAR(50), NULL deyil, UNIQUE - name: VARCHAR(255), NULL deyil - description: TEXT, NULL ola bilər - default_price: DECIMAL(10,2), default = 0 - is_active: BOOLEAN (TINYINT(1)), default = true, INDEX - created_at: TIMESTAMP, NULL ola bilər - updated_at: TIMESTAMP, NULL ola bilər Key-lər / indekslər: - PK: (id) - UNIQUE: (code) - INDEX: (is_active) =============================================================================== TABLE: lab_tests Təyinat: Pasiyent üçün konkret analiz sifarişi və nəticələri. Column-lar: - id: BIGINT UNSIGNED, PK, auto-increment - patient_id: BIGINT UNSIGNED, FK -> patients.id, ON DELETE CASCADE - appointment_id: BIGINT UNSIGNED, NULL ola bilər, FK -> appointments.id, ON DELETE SET NULL - ordering_doctor_id: BIGINT UNSIGNED, NULL ola bilər, FK -> doctors.id, ON DELETE SET NULL - lab_test_type_id: BIGINT UNSIGNED, FK -> lab_test_types.id, ON DELETE RESTRICT - priority: ENUM('routine','urgent','stat'), default = 'routine' - status: ENUM('ordered','collected','in_progress','completed','cancelled'), default = 'ordered' - specimen: VARCHAR(255), NULL ola bilər - ordered_at: DATETIME - collected_at: DATETIME, NULL ola bilər - resulted_at: DATETIME, NULL ola bilər - result_summary: TEXT, NULL ola bilər - result_json: JSON, NULL ola bilər - performed_by_user_id: BIGINT UNSIGNED, NULL ola bilər, FK -> users.id, ON DELETE SET NULL - created_at: TIMESTAMP, NULL ola bilər - updated_at: TIMESTAMP, NULL ola bilər Key-lər / indekslər: - PK: (id) - INDEX: (patient_id, ordered_at), (status, ordered_at) =============================================================================== TABLE: invoices Təyinat: Hesab-faktura (xidmətlər üçün ümumi məbləğlər). Column-lar: - id: BIGINT UNSIGNED, PK, auto-increment - patient_id: BIGINT UNSIGNED, FK -> patients.id, ON DELETE CASCADE - appointment_id: BIGINT UNSIGNED, NULL ola bilər, FK -> appointments.id, ON DELETE SET NULL - status: ENUM('draft','issued','paid','void','overdue'), default = 'draft', INDEX - subtotal: DECIMAL(10,2), default = 0 - tax: DECIMAL(10,2), default = 0 - discount: DECIMAL(10,2), default = 0 - total: DECIMAL(10,2), default = 0 - currency: CHAR(3), default = 'USD' - issued_at: DATETIME, NULL ola bilər - due_at: DATETIME, NULL ola bilər - created_at: TIMESTAMP, NULL ola bilər - updated_at: TIMESTAMP, NULL ola bilər Key-lər / indekslər: - PK: (id) - INDEX: (patient_id, issued_at), (status) =============================================================================== TABLE: invoice_items Təyinat: Fakturadakı sətirlər (xidmət/dərman/analiz və s. maddələr). Column-lar: - id: BIGINT UNSIGNED, PK, auto-increment - invoice_id: BIGINT UNSIGNED, FK -> invoices.id, ON DELETE CASCADE - item_type: VARCHAR(50), NULL deyil - description: VARCHAR(255), NULL deyil - quantity: INT UNSIGNED, default = 1 - unit_price: DECIMAL(10,2), default = 0 - amount: DECIMAL(10,2), default = 0 - related_type: VARCHAR(255), NULL ola bilər - related_id: BIGINT UNSIGNED, NULL ola bilər - created_at: TIMESTAMP, NULL ola bilər - updated_at: TIMESTAMP, NULL ola bilər Key-lər / indekslər: - PK: (id) - INDEX: (invoice_id, item_type), (related_type, related_id) =============================================================================== TABLE: payments Təyinat: Ödənişlər (faktura və pasiyent ilə bağlı). Column-lar: - id: BIGINT UNSIGNED, PK, auto-increment - invoice_id: BIGINT UNSIGNED, FK -> invoices.id, ON DELETE CASCADE - patient_id: BIGINT UNSIGNED, FK -> patients.id, ON DELETE CASCADE - amount: DECIMAL(10,2), NULL deyil - method: ENUM('cash','card','bank_transfer','insurance','online'), default = 'cash' - status: ENUM('pending','paid','failed','refunded'), default = 'pending' - transaction_reference: VARCHAR(255), NULL ola bilər - metadata: JSON, NULL ola bilər - paid_at: DATETIME, NULL ola bilər - created_at: TIMESTAMP, NULL ola bilər - updated_at: TIMESTAMP, NULL ola bilər Key-lər / indekslər: - PK: (id) - INDEX: (invoice_id, status), (patient_id, created_at) =============================================================================== TABLE: password_reset_tokens Təyinat: Şifrə sıfırlama token-ları (standart Laravel cədvəli). Column-lar: - email: VARCHAR(255), PK - token: VARCHAR(255), NULL deyil - created_at: TIMESTAMP, NULL ola bilər Key-lər / indekslər: - PK: (email) =============================================================================== TABLE: sessions Təyinat: Sessiyalar (standart Laravel cədvəli). Column-lar: - id: VARCHAR(255), PK - user_id: BIGINT UNSIGNED, NULL ola bilər, INDEX (bu migrasiyada FK constraint yaradılmayıb) - ip_address: VARCHAR(45), NULL ola bilər - user_agent: TEXT, NULL ola bilər - payload: LONGTEXT, NULL deyil - last_activity: INT, INDEX Key-lər / indekslər: - PK: (id) - INDEX: (user_id), (last_activity) =============================================================================== TABLE: personal_access_tokens Təyinat: API autentifikasiyası üçün token-lar (Laravel Sanctum). Column-lar: - id: BIGINT UNSIGNED, PK, auto-increment - tokenable_type: VARCHAR(255), NULL deyil - tokenable_id: BIGINT UNSIGNED, NULL deyil - name: TEXT, NULL deyil - token: VARCHAR(64), NULL deyil, UNIQUE - abilities: TEXT, NULL ola bilər - last_used_at: TIMESTAMP, NULL ola bilər - expires_at: TIMESTAMP, NULL ola bilər, INDEX - created_at: TIMESTAMP, NULL ola bilər - updated_at: TIMESTAMP, NULL ola bilər Key-lər / indekslər: - PK: (id) - UNIQUE: (token) - INDEX: (tokenable_type, tokenable_id) [morphs()] - INDEX: (expires_at) =============================================================================== TABLE: cache Təyinat: Cache dəyərləri (standart Laravel cədvəli). Column-lar: - key: VARCHAR(255), PK - value: MEDIUMTEXT, NULL deyil - expiration: INT, INDEX Key-lər / indekslər: - PK: (key) - INDEX: (expiration) =============================================================================== TABLE: cache_locks Təyinat: Cache lock-lar (standart Laravel cədvəli). Column-lar: - key: VARCHAR(255), PK - owner: VARCHAR(255), NULL deyil - expiration: INT, INDEX Key-lər / indekslər: - PK: (key) - INDEX: (expiration) =============================================================================== TABLE: jobs Təyinat: Queue job-lar (standart Laravel cədvəli). Column-lar: - id: BIGINT UNSIGNED, PK, auto-increment - queue: VARCHAR(255), NULL deyil, INDEX - payload: LONGTEXT, NULL deyil - attempts: TINYINT UNSIGNED, NULL deyil - reserved_at: INT UNSIGNED, NULL ola bilər - available_at: INT UNSIGNED, NULL deyil - created_at: INT UNSIGNED, NULL deyil Key-lər / indekslər: - PK: (id) - INDEX: (queue) =============================================================================== TABLE: job_batches Təyinat: Batch job-lar (standart Laravel cədvəli). Column-lar: - id: VARCHAR(255), PK - name: VARCHAR(255), NULL deyil - total_jobs: INT, NULL deyil - pending_jobs: INT, NULL deyil - failed_jobs: INT, NULL deyil - failed_job_ids: LONGTEXT, NULL deyil - options: MEDIUMTEXT, NULL ola bilər - cancelled_at: INT, NULL ola bilər - created_at: INT, NULL deyil - finished_at: INT, NULL ola bilər Key-lər / indekslər: - PK: (id) =============================================================================== TABLE: failed_jobs Təyinat: Uğursuz queue job-lar (standart Laravel cədvəli). Column-lar: - id: BIGINT UNSIGNED, PK, auto-increment - uuid: VARCHAR(255), NULL deyil, UNIQUE - connection: TEXT, NULL deyil - queue: TEXT, NULL deyil - payload: LONGTEXT, NULL deyil - exception: LONGTEXT, NULL deyil - failed_at: TIMESTAMP, default = CURRENT_TIMESTAMP Key-lər / indekslər: - PK: (id) - UNIQUE: (uuid) =============================================================================== Əlaqələrin qısa xülasəsi - users <-> roles: `role_user` pivot cədvəli ilə. - users -> doctors/patients: hər həkim/pasiyent 1 ədəd `users` yazısına bağlıdır (`user_id` UNIQUE). - appointments: patients + doctors + departments ilə bağlıdır. - diagnoses: icd_codes və (istəyə görə) appointments ilə bağlıdır. - prescriptions: (istəyə görə) appointments və diagnoses ilə bağlıdır. - lab_tests: lab_test_types ilə bağlıdır, (istəyə görə) appointments/doctors/users ilə bağlı ola bilər. - invoices/payments: patients və (istəyə görə) appointments ilə bağlıdır.