فكر برمجي
398 subscribers
233 photos
2 videos
67 files
158 links
#فكر_برمجي
Think_Programmatically
قناة تقنية متخصصة في البرمجة وتطوير المهارات. نوفر شروحات مبسطة، موارد مفيدة، وأفكار ملهمة لتحويل شغفك بالتقنية إلى إبداع.
Download Telegram
إن أفنيت عمرك في جمع السلاح.. فمتى تُقاتل؟

في تخصصات البرمجة، الشبكات، والذكاء الاصطناعي، "#السلاح" هو الأدوات (Tools)، اللغات (Languages)، والشهادات (Certifications). أما "#القتال" فهو التنفيذ الفعلي، بناء المشاريع، وحل المشكلات الحقيقية.


اليوم يقع الكثير منا في فخ "#الاستعداد_الأبدي". تجده يدرس Java، ثم ينتقل لـ Python، ثم يأخذ دورة في Docker، ويتبعها بشهادة في Cybersecurity.. هو يجمع الأسلحة باستمرار، لكنه لم يبنِ تطبيقاً واحداً للنهاية، ولم يواجه "بج" (Bug) حقيقي في بيئة عمل حية.

لماذا يجب أن تبدأ "#القتال" الآن؟

السلاح يصدأ:
في تقنية المعلومات، الأداة التي تتعلمها اليوم ولا تستخدمها، ستصبح قديمة (Deprecated) بعد عامين.

الخبرة في الميدان:
لن تتعلم كيفية إصلاح سيرفر بنكي تحت الضغط من خلال قراءة كتاب فقط؛ يجب أن تكون في قلب المعركة.

قيمة السلاح في استخدامه:
لغة البرمجة لا قيمة لها إن لم تتحول إلى نظام يحل مشكلة لشركة أو يسهل حياة مستخدم.

لذا اختر سلاحاً واحداً تراه مناسباً (سواء كان لغة برمجة معينة أو تخصصاً في البرمجة)، وانزل به إلى أرض المعركة. ابنِ مشروعك الأول، ارتكب الأخطاء، تعطل سيرفرك، ثم أصلحه.

#سؤالي_للزملاء:-
كم مرة أجلت البدء في مشروعك الخاص لأنك شعرت أنك "لست مستعداً بعد"؟ شاركونا تجاربكم.

#network #programming
4
🚀🔥 انطلق نحو المستقبل مع أقوى دورة تطبيقية في Python! 🔥🚀

هل تريد دخول عالم البرمجة بقوة؟
هل تطمح للعمل في تطوير الويب، الأمن السيبراني، أو الذكاء الاصطناعي؟

💡 هذه فرصتك الذهبية!

📌 الدورة التطبيقية في لغة Python
ليست مجرد شرح نظري… بل تجربة عملية مكثفة تأخذك من الصفر إلى الاحتراف 💪

لماذا هذه الدورة؟
لأن Python اليوم هي اللغة الأكثر طلباً في سوق العمل، وتُستخدم في:
✔️ تطوير الأنظمة والتطبيقات
✔️ تحليل البيانات والذكاء الاصطناعي
✔️ الأمن السيبراني واختبار الاختراق

🎯 ماذا ستحصل عليه؟
✔️ تدريب عملي 100%
✔️ مشاريع حقيقية تضيفها إلى Portfolio
✔️ مهارات مطلوبة في الشركات التقنية
✔️ تأهيل مباشر لسوق العمل

📅 تفاصيل الدورة:
🗓️ المدة: شهر كامل
⏱️ الوقت: 4 ساعات يومياً (تدريب مكثف)

📚 محاور الدورة:

🔹 الأسبوع الأول: أساسيات البرمجة

- تعلم Python من الصفر
- هياكل البيانات (Data Structures)
- البرمجة كائنية التوجه (OOP)

🔹 الأسبوع الثاني: Backend & Web Scraping

- سحب البيانات من المواقع
- بناء APIs احترافية
- التعامل مع قواعد البيانات

🔹 الأسبوع الثالث: الأمن السيبراني

- أساسيات الشبكات
- كتابة أدوات فحص واختراق
- أتمتة المهام الأمنية

🔹 الأسبوع الرابع: الذكاء الاصطناعي + مشروع التخرج

- دمج AI في تطبيقاتك
- تحليل البيانات والنصوص
- 🚀 بناء مشروع متكامل يميزك في سوق العمل

🔥 في نهاية الدورة:
ستمتلك المهارات + المشاريع + الثقة لدخول سوق العمل بقوة!

📩 المقاعد محدودة — احجز الآن وابدأ رحلتك نحو الاحتراف!

#Python #برمجة #الأمن_السيبراني #ذكاء_اصطناعي #تطوير_ويب #تعلم_البرمجة
من الفكرة إلى الواقع

1. مرحلة التحليل والتخطيط
1.1 دراسة فكرة المشروع
1.2 تحليل السوق والمنافسين
1.3 تحديد أهداف المشروع
1.4 تحديد نطاق المشروع (Scope)
1.5 تحديد الفئات المستهدفة (المستخدمون، البائعون، الإدارة)
1.6 إعداد خطة المشروع الأولية (Project Plan)

2. مرحلة جمع المتطلبات
2.1 جمع المتطلبات الوظيفية
2.2 جمع المتطلبات غير الوظيفية
2.3 مقابلات مع أصحاب المصلحة
2.4 إعداد وثيقة متطلبات البرمجيات (SRS)
2.5 مراجعة واعتماد المتطلبات

3. مرحلة التصميم (Design)
3.1 التصميم المعماري للنظام (System Architecture)
3.2 تصميم قاعدة البيانات (Database Design)
3.3 تصميم واجهة المستخدم (UI/UX Design)
3.4 تصميم تجربة المستخدم (User Flow & Wireframes)
3.5 اختيار التقنيات وأطر العمل (Technologies & Frameworks)

4. مرحلة التطوير (Implementation)
4.1 إعداد بيئة التطوير
4.2 تطوير الواجهة الأمامية (Frontend)
4.3 تطوير الواجهة الخلفية (Backend)
4.4 ربط قاعدة البيانات مع التطبيق
4.5 تطوير APIs للتواصل بين الواجهة الأمامية والخلفية
4.6 تطوير أنظمة الدفع والحجوزات
4.7 تطوير نظام الإشعارات والشات
4.8 تنفيذ الأمن وحماية البيانات

5. مرحلة الاختبار (Testing)
5.1 اختبار الوحدة (Unit Testing)
5.2 اختبار التكامل (Integration Testing)
5.3 اختبار النظام (System Testing)
5.4 اختبار الأداء (Performance Testing)
5.5 اختبار الأمان (Security Testing)
5.6 اختبار الاستخدام وتجربة المستخدم (User Acceptance Testing – UAT)
5.7 توثيق الأخطاء وإصلاحها (Bug Fixing)

6. مرحلة النشر والإطلاق (Deployment)
6.1 تجهيز البيئة الإنتاجية (Production Environment)
6.2 نشر التطبيق على متاجر الموبايل (Google Play & App Store)
6.3 إعداد الخوادم وقاعدة البيانات في السحابة
6.4 مراقبة أداء التطبيق بعد الإطلاق
6.5 دعم المستخدمين وحل المشاكل الطارئة

7. مرحلة الصيانة والتطوير المستقبلي
8. (Maintenance & Future Enhancements)
7.1 إصلاح الأخطاء والتحديثات الدورية
7.2 إضافة ميزات جديدة حسب طلب المستخدمين
7.3 تحسين الأداء والتوافق مع الأجهزة الجديدة
7.4 مراقبة البيانات وتحليل سلوك المستخدمين

8. إدارة المشروع
8.1 متابعة تقدم المشروع
8.2 إدارة فرق العمل (المطورين، المصممين، المختبرين)
8.3 إدارة المخاطر (Risk Management)
8.4 توثيق المشروع بالكامل
الشهادة الجامعية هي مجرد إثبات على القدرة على التعلم، أما العلم الحقيقي فهو ما يكتسبه المرء خارج أسوار المنهج.

د. عبد الكريم بكار
1
سؤال :
كيف تبدأ بتطبيق مشاريع عملية لبناء تفكيرك البرمجي والتحليلي. ؟
باختصار كيف اطور من تفكيري كمحلل نظم نجرب مثال


هذا المشروع مثال للتدريب (Simple Clinic) عيادة بسيطة من خارطة الطريق المهندس محمد ابو هدهود

مثالي جداً للتدرب على تحليل النظم وتصميم قواعد البيانات (ERD & Relational Schema).

بما أنك تريد أن نمشي خطوة بخطوة، فسنقسم العمل إلى مراحل منهجية كما يفعل مهندسو البرمجيات في الواقع:

إذا كان في عميل ونزلت اليه وجمعت منه معلومات المشروع الذي يريده منك بالضبط من خلال المقابلة مثلاً

أو إذا حصلت على عمل مثلا في شركة او فريق برمجي واعطوك ملف يسمى ملف المتطلبات أنت في هذه الحالة ماذا تعمل ؟

هل تنسخ المتطلبات وتفتح الفيجول وتبدأ تشتغل لا 😏

هل تأخذ المتطلبات وترسلها للذكاء الاصطناعي ينفذه مثلنا طبعاً لا 😅

خطة العمل لتبسيط وتصميم النظام:

تاخذ ملف المتطلبات الذي حصلت عليه ؟ اختصاره طبعا ( SRS ابحثوا عنه ) 👉 نشاط

الخطوة الأولى:
استخراج الكيانات الأساسية (Entities) وخصائصها (Attributes).
(الذي ما يعرف الكيان والخصائص يفتح كورس ١٥ من خارطة الطريق)

الخطوة الثانية:
تحديد العلاقات بين الكيانات (Relationships) وتحديد المفاتيح الأساسية والأجنبية (PK & FK).

الخطوة الثالثة:
تحسين التصميم (Normalization) واكتشاف الحالات الخاصة (Edge Cases).

الخطوة الرابعة:
رسم المخطط العلائقي النهائي (Relational Schema).

نشاط لمن يريد التعلم :
سارسل ملف متطلبات لمشروع عيادة بسيطة
وانت نفذ الخطوات السابقة للتدريب على تحليل وتصميم النظم خطوة خطوة.
أي مشكلة او سؤال او استفسار المجال مفتوح 📚
طبعا في معك أدوات الرسم ERD , Schema كثيرة منها موقع :
https://www.drawio.com/
بالتوفيق
1
الخطوة الأولى:
استخراج الكيانات (Entities) والخصائص (Attributes)

من خلال قراءة المتطلبات التي أرسلتها، يمكننا استخراج الجداول الأساسية (Entities) التالية ومحتوياتها:

1. جدول المرضى (Patients):

معرف فريد
(PatientID - Primary Key)

الاسم (Name)

تاريخ الميلاد (DateOfBirth)

الجنس (Gender)

رقم الهاتف (Phone)

البريد الإلكتروني (Email)

العنوان (Address)

2. جدول الأطباء (Doctors):

معرف فريد
(DoctorID - Primary Key)

الاسم (Name)

التخصص (Specialization)

تاريخ الميلاد (DateOfBirth)

الجنس (Gender)

رقم الهاتف (Phone)

البريد الإلكتروني (Email)

العنوان (Address)

3. جدول المواعيد (Appointments):

معرف فريد
(AppointmentID - Primary Key)

تاريخ ووقت الموعد (DateTime)

حالة الموعد (Status)

(ملاحظة: سيحتوي أيضاً على معرف المريض والطبيب، وسنناقش ذلك في خطوة العلاقات).

4. جدول السجلات الطبية (Medical_Records):

معرف فريد
(RecordID - Primary Key)

وصف الزيارة (VisitDescription)

التشخيص (Diagnosis)

ملاحظات إضافية (AdditionalNotes)

(ملاحظة:
تم ذكر "الأدوية الموصوفة" هنا، لكن المتطلب رقم 5 فصلها في جدول مستقل، وهذا هو التصميم الأصح).

5. جدول الوصفات الطبية (Prescriptions):

معرف فريد
(PrescriptionID - Primary Key)

اسم الدواء (MedicationName)

الجرعة (Dosage)

التكرار (Frequency)

تاريخ البدء (StartDate)

تاريخ الانتهاء (EndDate)

تعليمات خاصة (SpecialInstructions)

6. جدول المدفوعات (Payments):

معرف فريد
(PaymentID - Primary Key)

تاريخ الدفع (PaymentDate)

طريقة الدفع (PaymentMethod)

المبلغ المدفوع (Amount)

ملاحظات إضافية (Notes)

إلى هنا، نحن استخرجنا الهيكل الأساسي للبيانات بنجاح.

قبل أن ننتقل للخطوة الثانية (العلاقات وربط الجداول)،
لدي سؤال تحليلي لك لنتناقش فيه كمهندسي أنظمة:

كيف تقترح أن نتعامل برمجيًا وفي قاعدة البيانات مع
(حالة الموعد - Appointment Status)
المذكورة في المتطلبات؟

هل نضعها كحقل من نوع (ENUM / نص) داخل جدول المواعيد،

أم ننشئ لها جدولاً مستقلاً (Lookup Table) ونربطه بجدول المواعيد؟
وما هو السبب لاختيارك؟
إجابة السؤال:

كيف نتعامل مع "حالة الموعد" (Appointment Status)؟

في تصميم قواعد البيانات، لدينا خياران للتعامل مع الحالات الثابتة مثل حالة الموعد (معلق، مؤكد، مكتمل... الخ):

الخيار الأول (ENUM / Text):

أن نضع الحالة كحقل نصي عادي داخل جدول Appointments.

العيوب:

إذا أردنا مستقبلاً إضافة حالة جديدة (مثل: "قيد الانتظار في العيادة")، أو أردنا تغيير كلمة "ملغى" إلى "تم الإلغاء"، سنضطر لتعديل هيكل قاعدة البيانات أو تحديث آلاف السجلات السابقة، مما يستهلك موارد السيرفر.

الخيار الثاني (جدول مرجعي - Lookup Table) :

وهو الخيار الأفضل والاحترافي. نقوم بإنشاء جدول مستقل نسميه Appointment_Statuses يحتوي على رقم الحالة واسمها، ونربطه بجدول المواعيد.

المميزات:

سهولة إضافة حالات جديدة برمجياً دون المساس بهيكل قاعدة البيانات، وتسهيل عملية الترجمة (إذا كان النظام يدعم لغتين).

سنعتمد الخيار الثاني في تصميمنا ليكون احترافياً وقابلاً للتوسع.
الخطوة الثانية:
تحديد العلاقات (Relationships) والمفاتيح (PK & FK)

الآن سنربط الجداول ببعضها بناءً على المنطق الطبيعي للعيادة.

في هذه الخطوة سنحدد المفتاح الأساسي
(Primary Key - PK)
الذي يميز كل سجل، والمفتاح الأجنبي (Foreign Key - FK) الذي يربط جدولاً بآخر.

1. العلاقة بين (المرضى) و (المواعيد):

المريض الواحد يمكن أن يكون لديه عدة مواعيد، لكن الموعد الواحد يخص مريضاً واحداً.

نوع العلاقة:
واحد إلى متعدد (1:N).

التطبيق:
نضيف PatientID كمفتاح أجنبي (FK) في جدول Appointments.

2. العلاقة بين (الأطباء) و (المواعيد):

الطبيب الواحد يمكن أن يكون لديه عدة مواعيد، لكن الموعد الواحد مخصص لطبيب واحد.

نوع العلاقة:
واحد إلى متعدد (1:N).

التطبيق:
نضيف DoctorID كمفتاح أجنبي (FK) في جدول Appointments.

3. العلاقة بين (حالات المواعيد) و (المواعيد):

الحالة الواحدة (مثل: معلق) يمكن أن ترتبط بعدة مواعيد.

نوع العلاقة:
واحد إلى متعدد (1:N).

التطبيق:
نضيف StatusID كمفتاح أجنبي (FK) في جدول Appointments.

4. العلاقة بين (المواعيد) و (السجلات الطبية):

المتطلبات تقول: "يجب أن يكون هناك سجل طبي لكل موعد حضور".
هذا يعني أن السجل الطبي ناتج عن موعد محدد.

نوع العلاقة:
واحد إلى واحد (1:1).

التطبيق: نضيف AppointmentID كمفتاح أجنبي (FK) في جدول Medical_Records.

5. العلاقة بين (السجلات الطبية) و (الوصفات الطبية):

المتطلبات تقول:
"وصفة طبية واحدة على الأكثر لكل سجل طبي".

نوع العلاقة:
واحد إلى واحد (1:1).

التطبيق:
نضيف RecordID كمفتاح أجنبي (FK) في جدول Prescriptions.

6. العلاقة بين (المواعيد/المرضى) و (المدفوعات):

المتطلبات تقول:
"الدفع لكل موعد". الموعد الواحد قد يتم دفعه دفعة واحدة او أقساط

نوع العلاقة:
واحد إلى واحد (1:1) إذا كان الدفع مرة واحدة

(أو 1:N في حال كان هناك دفع بالتقسيط، لكن سنفترض 1:1 لتبسيط العيادة).

التطبيق:
نضيف AppointmentID كمفتاح أجنبي (FK) في جدول Payments.

تحديث الجداول بعد إضافة المفاتيح
(تمهيداً للخطوة الثالثة):
Patients
(PK: PatientID)

Doctors
(PK: DoctorID)

Appointment_Statuses (PK: StatusID)

Appointments
(PK: AppointmentID | FK: PatientID, DoctorID, StatusID)

Medical_Records
(PK: RecordID | FK: AppointmentID, PatientID, DoctorID)

Prescriptions
(PK: PrescriptionID | FK: RecordID)

Payments
(PK: PaymentID | FK: AppointmentID, PatientID)
للخطوة الثالثة
(تحسين التصميم - Normalization):

في جدولي Medical_Records و Payments،

المتطلبات طلبت صراحةً تخزين (المريض والطبيب).

ولكننا قمنا بربطهما بجدول الموعد AppointmentID (والذي بدوره يحتوي أصلاً على معرف المريض ومعرف الطبيب).

برأيك التحليلي:

هل من الأفضل أن نبقي PatientID و DoctorID
في جدول السجلات الطبية والمدفوعات كما طلبت المتطلبات حرفياً؟

أم نقوم بحذفهما والاكتفاء بـ AppointmentID لمنع تكرار البيانات
(Data Redundancy)

هذا ما سنعرفه حاليا وهنا يكمن مربط الفرس وتفكير المهندس ؟

وهنا تعرف الحق من الباطل
وتعرف بأنك أضعت نفسك في جعل الذكاء الاصطناعي يشتغل كل شي بدلاً عنك وأنت لا تعرف ماذا يدور بالضبط

إذا لم تعرف حقاً ان تقرر هذا القرار في حل هذه المشكلة
فربما ستقوم بعمل كارثة بالمشروع وأنت لا تعلم خاصة في أمور الدفع الإلكتروني او اي مشروع فيه مبالغ مالية وحسابات وستتحمل أنت العواقب كاملة لأنك اختصرت على نفسك بجعل الذكاء الاصطناعي ينفذ بدون متابعة منك ولا مراجعة دقيقة ولا اختبارات.
إجابة سؤال
(تحسين التصميم - Normalization):

الإجابة الصحيحة هندسياً هي:

يجب أن نحذف PatientID و DoctorID من جدولي السجلات الطبية والمدفوعات، ونكتفي بـ AppointmentID فقط.

لماذا؟
هذا المبدأ يسمى بمنع تكرار البيانات
(Data Redundancy)
وحماية قاعدة البيانات من التعارض (Anomalies).

بما أن السجل الطبي والعملية المالية مرتبطان بـ "موعد" محدد، والموعد نفسه يحتوي مسبقاً على (رقم المريض ورقم الطبيب)، فلا حاجة لتكرارهما.

لو أبقيناهما، قد يحدث خطأ كارثي مستقبلاً؛ كأن يتم إدخال AppointmentID يخص "أحمد"،

بينما نضع بالخطأ PatientID يخص "خالد" في نفس السجل المالي!

بالاكتفاء بـ AppointmentID، نضمن أن الدفع والسجل الطبي يذهبان للمريض والطبيب الصحيحين دائماً
(عن طريق عملية JOIN في SQL).
الخطوة الرابعة:
المخطط العلائقي النهائي (Relational Schema)

الآن، وبعد أن استخرجنا الكيانات، وحددنا العلاقات، ونظفنا التصميم من التكرار، إليك التصميم النهائي والاحترافي لقاعدة بيانات العيادة.

مفتاح القراءة :
PK =
مفتاح أساسي،
FK =
مفتاح أجنبي يربط بجدول آخر

1. جدول المرضى (Patients)

PatientID (PK)

Name

DateOfBirth

Gender

Phone

Email

Address

2. جدول الأطباء (Doctors)

DoctorID (PK)

Name

Specialization

DateOfBirth

Gender

Phone

Email

Address

3. جدول حالات المواعيد (Appointment_Statuses)

StatusID (PK)

StatusName
(مثل: معلق، مكتمل، ملغى...)

4. جدول المواعيد (Appointments)

AppointmentID (PK)

PatientID
(FK -> يربط بجدول المرضى)

DoctorID
(FK -> يربط بجدول الأطباء)

StatusID
(FK -> يربط بجدول الحالات)

DateTime

5. جدول السجلات الطبية (Medical_Records)

RecordID (PK)

AppointmentID
(FK -> يربط بجدول المواعيد)

VisitDescription

Diagnosis

AdditionalNotes

6. جدول الوصفات الطبية (Prescriptions)

PrescriptionID (PK)

RecordID
(FK -> يربط بجدول السجلات الطبية)

MedicationName

Dosage

Frequency

StartDate

EndDate

SpecialInstructions

7. جدول المدفوعات (Payments)

PaymentID (PK)

AppointmentID
(FK -> يربط بجدول المواعيد)

PaymentDate

PaymentMethod

AmountPaid

AdditionalNotes

بهذا نكون قد أنهينا تحليل وتصميم قاعدة البيانات بمثال
بشكل متسلسل شبه احترافي ومقارب للوقع تماماً حيث طابق معايير العمل في هندسة البرمجيات وهكذا يجب أن يكون تفكيرنا
من الفكرة الى المتطلبات الى التحليل الى التصميم
ليست مجرد نسخ لصق

فلقد أُصبنا بالتبلد الفكري والعجز بسبب الاعتماد على الذكاء الاصطناعي بتنفيذ هذا العمل

لا أمنعك من استخدام الذكاء الاصطناعي نهائياً فهذا تخلف أيضا ولكن لا تجعله يقتل تفكيرك

يا عزيزي استخدمه بطريقة افضل خليه يشرح لك كيف تحلل ؟ كيف تصمم ؟ كيف تسوي الكيانات والخصائص والعلاقات
كيف تحسن وتطبع الجداول
كيف تحسن الاستعلامات ؟

ارسم له بورقة وصور له وخليه يصحح لك اكتشف اخطائك واتعلم

عمر الاعتراف بالخطأ ما كان عيب

العيب أن تستمر في أخطائك
وانت في الحقيقة في وهم بأنك فاهم

طبيعي جداً أن تعود للاساسيات وتصلح اخطائك ونقاط ضعفك.
ماهي الخطوات التي يمر بها مهندس البرمجيات بعد هذه الخطوة كيف يسوي الان

كيف يرسم المخططات ؟
كيف يختار معمارية النظام ؟
كيف يهيكل المشروع ؟
كيف يختار برمجة وظيفية ام كائنية ؟
كيف يصمم خوارزميات التنفيذ ؟
كيف يختار التقنيات المستخدمة ؟
كيف يصمم الواجهات قبل التنفيذ ؟
كيف يشتغل كفريق في هذا المشروع ؟
كيف يقسم الأدوار والمهام ؟
كيف يحدد الخطة الزمنية لكل مهمة متى تبدأ ومتى تنتهي ؟
أي مهمة تبدأ أولاً ؟
كيف اشتغل انا وفريقي عن بُعد من البيت ؟
كيف ندمج العمل تبعنا ؟
ما أسباب التعارض الذي يحدث بالمشروع عندما نشتغل كفريق ؟
كيف نحل مشكلة الدمج والتكامل خاصة إذا كانت التقنيات مختلفة ؟
ما مشاكل الباك اند مع الفرونت اند والعكس ؟


هل يبدأ مطور الباك اند ام مطور الفرونت اند
أي اطار عمل او لغة نختارها سوى بالفرونت أوالباك ؟

هذا ما سنعرفه في الأيام القادمة
كونوا معنا
#يوميات_مهندس
هذا المخطط (Solution)

يقدم أفكاراً متقدمة واحترافية جداً في هندسة قواعد البيانات!

لقد نقل التصميم من مستوى "أساسي" إلى مستوى "قابل للتوسع المؤسسي"

إليك تحليلي المعماري لهذا المخطط، مبرزاً نقاط القوة ونقطة واحدة تستحق النقاش:

1. الضربة القاضية
(الوراثة - Supertype/Subtype)
الميزة الأقوى والأكثر ذكاءً في هذا المخطط هي إنشاء جدول Persons.


الفكرة:
بدلاً من تكرار الحقول المشتركة مثل الاسم Name ، وتاريخ الميلاد DateOfBirth ، والجنس Gender ، ورقم الهاتف PhoneNumber ، والبريد Email ، والعنوان Address في كل من جدولي المرضى Patients والأطباء Doctors ، قام بجمعها في "جدول أب" Persons.


الربط: ثم قام بإنشاء جدولي المرضى والأطباء وربطهما بالجدول الأب عبر المفتاح الأجنبي PersonID.

لماذا هذا رائع؟
1. يمنع التكرار نهائياً
(DRY Principle):
قاعدة البيانات أصبحت أنظف.

2. قابلية التوسع (Scalability):
إذا أردت غداً إضافة موظفي استقبال أو ممرضين، لن تضطر لإنشاء جداول ببيانات مكررة، بل ستنشئ جدول Nurses وتربطه بـ Persons.

3. يحل حالات نادرة
(Edge Cases):
ماذا لو مرض الطبيب وأصبح مريضاً في نفس العيادة؟ بهذا التصميم، سيكون له سجل واحد فقط في Persons ، ونربطه بجدول المرضى والأطباء معاً!

2. تحليل العلاقات المعكوسة (نقطة للنقاش)
هناك قرار تصميمي مثير للاهتمام في جدول المواعيد Appointments:

وضع المصمم المفاتيح الأجنبية MedicalRecordID و PaymentID داخل جدول المواعيد Appointments.

رأيي كمهندس نظم:
هذا تصميم صالح برمجياً لتمثيل علاقة (1:1 أو 1:0..1)،
ولكنه يعني أن هذه الحقول ستكون فارغة (NULL)
عند حجز الموعد لأول مرة،
ولن تُملأ إلا بعد إتمام الزيارة والدفع.

التصميم البديل
(الذي ناقشناه سابقاً):
وضع AppointmentID داخل جدول السجلات الطبية والمدفوعات هو الطريقة الأكثر شيوعاً؛ لأن السجل الطبي والدفع هما "كيانات تابعة" (Dependent Entities) للموعد، وتُنشأ بسببه.

كلا الحلين يعمل، لكن وضع المفتاح في الكيان التابع يقلل من حقول الـ NULL في قاعدة البيانات.

3. إدارة الحالات (Status)
لاحظ أنه استخدم نوع البيانات tinyint
لحقل AppointmentStatus.

الميزة: هذا يوفر مساحة كبيرة في قاعدة البيانات وتكون الاستعلامات فيه أسرع.

التطبيق البرمجي:
هذا يعني أنه سيعتمد على الباك اند (Backend) لترجمة هذه الأرقام
مثلاً:
1 = Pending،
2 = Confirmed
باستخدام (Enum Classes)، متخلياً عن فكرة جدول الـ
(Lookup Table)
المنفصل في قاعدة البيانات.

وهو أسلوب متبع جداً ومفضل لدى الكثير من المطورين لتسريع النظام.

بشكل عام، المخطط ممتاز للتدريب ويمثل خطوة متقدمة جداً في التفكير المعماري.
أولاً: الكيانات والخصائص
(Entities & Attributes)

1. جدول الأشخاص (Persons)

PersonID (int):
مفتاح أساسي (PK)

Name (nvarchar(100)): الاسم

DateOfBirth (date):
تاريخ الميلاد

Gender (nvarchar(1)): الجنس

PhoneNumber (nvarchar(20)): رقم الهاتف

Email (nvarchar(100)): البريد الإلكتروني

Address (nvarchar(200)): العنوان




2. جدول المرضى (Patients)

PatientID (int): مفتاح أساسي (PK)

PersonID (int): مفتاح أجنبي (FK)



3. جدول الأطباء (Doctors)

DoctorID (int):
مفتاح أساسي (PK)

PersonID (int): مفتاح أجنبي (FK)

Specialization (nvarchar(100)): التخصص




4. جدول المواعيد (Appointments)

AppointmentID (int):
مفتاح أساسي (PK)

PatientID (int):
مفتاح أجنبي (FK)

DoctorID (int):
مفتاح أجنبي (FK)

AppointmentDateTime (datetime):
تاريخ ووقت الموعد

AppointmentStatus (tinyint):
حالة الموعد

MedicalRecordID (int): مفتاح أجنبي (FK)

PaymentID (int):
مفتاح أجنبي (FK)



5. جدول السجلات الطبية (MedicalRecords)

MedicalRecordID (int): مفتاح أساسي (PK)

VisitDescription (nvarchar(200)):
وصف الزيارة

Diagnosis (nvarchar(200)):
التشخيص

AdditionalNotes (nvarchar(200)):
ملاحظات إضافية




6. جدول الوصفات الطبية (Prescriptions)

PrescriptionID (int):
مفتاح أساسي (PK)

MedicalRecordID (int): مفتاح أجنبي (FK)

MedicationName (nvarchar(100)):
اسم الدواء

Dosage (nvarchar(50)): الجرعة

Frequency (nvarchar(50)):
التكرار

StartDate (date):
تاريخ البدء

EndDate (date):
تاريخ الانتهاء

SpecialInstructions (nvarchar(200)):
تعليمات خاصة




7. جدول المدفوعات (Payments)

PaymentID (int):
مفتاح أساسي (PK)

PaymentDate (date):
تاريخ الدفع

PaymentMethod (nvarchar(50)):
طريقة الدفع

AmountPaid (decimal): المبلغ المدفوع

AdditionalNotes (nvarchar(200)):
ملاحظات إضافية




🔗 ثانياً: العلاقات (Relationships)

بناءً على المفاتيح الأجنبية (Foreign Keys)، يتم ربط الجداول كما يلي:

1. علاقة الأشخاص بالمرضى والأطباء
(Supertype / Subtype)

جدول Persons يمثل الكيان العام (Supertype).

جدول Patients و Doctors يمثلان كيانات فرعية (Subtypes).

الربط يتم عبر:

PersonID → Patients

PersonID → Doctors


كل مريض أو طبيب هو في الأصل "شخص".



2. علاقة المواعيد بالمرضى

جدول Appointments يرتبط بجدول Patients عبر:

PatientID (FK)


العلاقة:
Patient (1) → (M) Appointments




3. علاقة المواعيد بالأطباء

جدول Appointments يرتبط بجدول Doctors عبر:

DoctorID (FK)


العلاقة:
Doctor (1) → (M) Appointments



4. علاقة المواعيد بالسجلات الطبية

جدول Appointments يرتبط بجدول MedicalRecords عبر:

MedicalRecordID (FK)


العلاقة:
Appointment (1) → (1) MedicalRecord (غالبًا)



5. علاقة المواعيد بالمدفوعات

جدول Appointments يرتبط بجدول Payments عبر:

PaymentID (FK)


العلاقة:
Appointment (1) → (1) Payment



6. علاقة الوصفات الطبية بالسجلات الطبية

جدول Prescriptions يرتبط بجدول MedicalRecords عبر:

MedicalRecordID (FK)


العلاقة:
MedicalRecord (1) → (M) Prescriptions


التصميم يطبق Normalization
بشكل ممتاز (تقليل التكرار).

استخدام
Supertype/Subtype

(Persons →
Patients/Doctors).

النظام قابل للتوسعة
(مثلاً إضافة Nurse أو Admin بسهولة)