🗺️

خريطة العلاقات الشاملة (ERD)

قاعدة البيانات تضم 312 جدولًا بدون أي مفتاح أجنبي مُعلن (Declared Foreign Key) على الإطلاق؛ جميع العلاقات «ضمنية» تُفهم من تسمية الأعمدة (patientid, doctorid, ancsheetid, ...) ومن جمل JOIN داخل الكنترولرات في core/controllers. هذا القسم يرسم الخريطة الكلية: الكيانات المحورية الأربعة (المريضة، الزيارة، المستخدم، الفرع)، والعلاقات الرئيسية بينها وبين الموديولات الإكلينيكية، وأنماط التصميم الثلاثة المتكررة (نمط الشيت الأب وأبنائه، نمط جداول الترميز الصغيرة، نمط EAV للتحاليل الحرة)، ثم قائمة الجداول المكررة والمهجورة المكتشفة في الـ dump.

312جدول
0مفتاح أجنبي مُعلن
73جدولًا يرتبط بـ patients
59جدولًا يرتبط بـ awusers
~190جدول ترميز/مساعد صغير

الكيانات المحورية (Hub Entities)

العلاقات الرئيسية

من (الجدول الابن)إلى (الجدول الأب)عمود الربطالنوع
visits, old_visits, endvisitreports, lastvisitpatientspatientid → patients.id1:N
الشيتات الأم: ancsheet, gynasheet, infertilitysheet, ivfsheet, mointoringsheet, followupcard, mainantenental, maingynapatientspatientid → patients.id1:N (عمليًا 1:1 في gynasheet/infertilitysheet)
التاريخ المرضي: phobstetric, phmenstrual, phfamily, phcontraception, phpastmedical, phpastsurgical, phpastgynecological, phpastart, phpasticsi, previous_marriage, hus_previous_marriagepatientspatientid → patients.id1:N
الأشعة والمناظير: ultrasound, ultrasoundgyna, ultrasoundobst, gynaus, ustv, sonar, gtimage, hsg, hysteroscopy, laparoscopy, mrict, pathology, semen, hormonpatientspatientid → patients.id1:N
visitsdetections / visit_periods / branches / awusersdetectionid → detections.id، visit_period → visit_periods.id، branch_id → branches.id، user_id / enddoctorid → awusers.user_idN:1
visits_updates, patients_updatesvisits, patientsvisitid → visits.id، patientid → patients.id (+ userid_edit)1:N (سجل تدقيق)
ancsheetdrugs, ancsheetinvest, ancnewvisit, investigations, registeration, op_4d_listancsheetancsheetid → ancsheet.id1:N
17 جدولًا منها: newvisit, tvs, dtvs, sis, folliculom, hormonalprofile, hormonalprofile2, semen2, semeninfertility, hsginfertility, hysteroscopyinfertility, laparoscopyinfertility, icsi, operations, wifep, awifep, wifeepcinfertilitysheetinfertilitysheetid → infertilitysheet.id1:N
newvisitggynasheetgynasheetid → gynasheet.id1:N
gynasheetdrugs, gynasheetinvest, infertilitysheetdrugs, infertilitysheetinvestgynasheet / infertilitysheet (عبر المريضة)patientid فقط — لا يوجد عمود sheetid (شيت واحد لكل مريضة)1:N غير مباشر
mointoringsheetdrugs, mointoringsheetinvestigation, mointoringsheetvisitsmointoringsheetmointoringsheetid → mointoringsheet.id1:N
mointoringsheet9 جداول ترميز: mointoringsheetprocedure/protocol/ejac/pesa/tese/sryo/hmg/agonist/hcgprocedure/protocol/... → {lookup}.id (مؤكدة بـ LEFT JOIN في الكنترولر)N:1
eprep, ovstivfsheetivfsheetid → ivfsheet.id1:N
followupcarddrugsfollowupcardcardid → followupcard.id1:N
followupvisit, followupinvest, followupexam, followupdiagnosisfollowupfollowid → followup.id1:N
13 جدول *drugs + pharmacystore + receiptdrugs + importdetailsdrugsdrugid / drug_id / drugs_id → drugs.idN:1
6 جداول *invest / *investigationinvestsinvestcatsinvestid → invests.id، invests.investcatid → investcats.idN:1
*drugsrecepittmprecepittmppatients/awusersrecepittmpid → recepittmp.id؛ recepittmp.patient_id/doctor_idN:1
otherinvestigationsvaluesotherinvestigationsrows + otherinvestigationsinvestrowid → rows.id، investid → otherinvestigations.idN:M (نمط EAV)
operativedetails, operativedetailsdrugs, operationidsoperations / awusersoperationid → operations.id؛ doctorid/assistantid/anasthetstsid → awusers.user_id1:N + N:M (فريق العملية)
gynausficilsgynausgynausid → gynaus.id (مؤكدة بـ JOIN)1:N
presenthistoryanswerspresenthistoryquestionscatid/answerid في جداول الشكوى (مؤكدة بـ JOIN)N:1
awusersawrole / branchesrole_id → awrole.id، branch_id → branches.idN:1
awrolemenu, awrolecontrollprop, awrolebtnawroleawmenu / awcontrollproprole_id + menu_id / ...N:M (صلاحيات)
bsession, bsessionmembers, bcomments, bmemberopenion, brequestsbsessionawuserssessionid + memberidN:M (بورد الأطباء)
totalbalance, totalbalancepaidspatients / awuserspatientid, userid1:N (مالية)
device_trackingpatients / awusers / أي جدولpatient_id, user_id, target_id + target_table (مرجع متعدد الأشكال Polymorphic)N:1

أنماط التصميم المتكررة

الجداول المكررة والمهجورة المكتشفة

المجموعةالجداولالملاحظة
جداول تجارب مهجورةtable2, table3, tablename, testtbl1, testtbl2, patients_tmpمخلفات تطوير بلا أي استخدام في الكود — آمنة الحذف بعد التحقق
استنساخ رباعي لنفس القائمةssemen, sseemen, sseemmen, sseemmeen4 جداول ترميز متطابقة البنية، أنشئ واحد لكل عمود من أعمدة السائل المنوي الأربعة في ivfsheet (ssemen/sseemen/sseemmen/sseemmeen) بدل جدول واحد بعمود نوع
أزواج شبه مكررةantype/antypes، place/place2، importdetails/importtdetails، hormonalprofile/hormonalprofile2، semen/semen2، excelinfo/excelinfopatientsأجيال متعاقبة من نفس الوظيفة بقيت جنبًا إلى جنب (الإصدار 2 هو المستخدم غالبًا)
عائلة copy*copycavity, copycx, copydil, copyintrod, copylostium, copyrostium, copyplace + نسخ copym* (mcavity, mcx, mlostium, mrostium)10 جداول ترميز لتقرير المنظار الرحمي بدأت كنسخ (copy) وأصبحت أصلية، مع نسخة m* ثانية لكل منها تقريبًا
بيانات تاريخيةold_visitsأرشيف زيارات بنية قديمة (قبل إضافة الفروع والفترات) — للقراءة فقط
موديولات ANC متوازيةancsheet+ancnewvisit مقابل mainantenental+antenalvisit مقابل followup+followupvisitثلاثة أجيال لمتابعة الحمل تعمل بالتوازي في الكود، لكل منها جداول أدوية/تحاليل خاصة
جداول معطلة/غير مفعلةpatientfiles, patients_updates (جزئيًا), help, messagesموجودة بالبنية لكن الكود الفعّال لا يكتب فيها أو يتجاوزها (استنتاج من مراجعة الكنترولرات)