الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

أفكاركم التصميمية في نمذجة العالم الحقيقي !

بدأه Speed_Of_Light في 25 يوليو 2010 · 16 رد · 2,555 مشاهدة · في هندسة البرمجيات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

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

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

البرنامج ببساطة مسؤول عن إدخال النتائج وحسابها وإعلانها

الجامعة/المعهد يحوي عدة اختصاصات

لا يوجد هيكلية معروفة للمواد، بل هي شجرية. فمثلاً مادة "مبادئ صناعات" تحتوي على قسمين درجة أعمال وامتحانات وكل منهما ينقسم إلى عملي ونظري، والعملي ينقسم إلى حدادة ولحام وسباكة ....

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

يقوم البرنامج بحساب علامات الطالب وتحديد وضعه بعد كل دورة (ناجح راسب منقول متخرج ...)

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

post-151966-019847100 1280082804_thumb.j

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

لكن !

نحن في العالم الحقيقي، حيث يمكن للمواد أن تتغير وللطلاب أن تأتي وتذهب !

يمكن معالجة مشكلة انتقال طالب من وإلى الجامعة/المعهد بسهولة نسبياً ... ودون الحاجة إلى تعديل تصميم قاعدة البيانات

لكن المشكلة في تعديل المواد! فماذا لو تعدل الحد الأدنى للنجاح مثلاً؟ لا يمكنني تعديله على قاعدة البيانات لأن ذلك سيؤدي إلى أخطاء في حساب النتائج السابقة.

فكرت في إدراج أي تعديل في المواد كمادة جديدة، لكن ذلك سيصعب المسألة كثيراً ... (بالحقيقة لا يعود هناك فائدة من الـ id في جدول العلامات! كيف ستعرف أن الطالب ناحج بالمادة الفلانية أم لا؟)

فكرت بفصل الخصائص القابلة للتغيير بالمواد إلى جدول منفصل أسميه "خصائص المادة". وما هي الخصائص القابلة للتغيير ؟ حسناً كلها !

إذاً هل فكرت بتعديل التصميم قليلاً ليصبح:

post-151966-052890700 1280083882_thumb.j

وبذلك يمكنني تعديل جميع خصائص المادة مع المحافظة على id واحد لها يمكنني من تمييزها وإجراء الحسابات عليه.

لكنه سيزيد من تعقيد قاعدة البيانات بطبيعة الحال

هذه هي الأفكار التي تجول في دماغي :D

هل واجهت مشاكل مماثلة عند تصميم برامج في "العالم الحقيقي" ؟ وكيف قمت بحلها ؟

هل هناك طريقة أفضل لتصميم قاعدة البيانات هذه بحيث تعالج تغيرات "العالم الحقيقي" بشكل فعال مع المحافظة على بساطة التصميم؟

المرفقات
1.jpg2.jpg

تم تعديل هذه المشاركة بواسطة Speed_Of_Light في 25 يوليو 2010 في 22:05

#2

السلام عليكم

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

او امكانك انشاء جدول فصول واضافة حقل ابن الى جدول العلامات وارى انك قد عملت ذلك لكن بدون ربط :)

اما عن مشكلة التعديل صحيح كلامك ماذا انا لو نجحت السنة بمعدل 50

واتينا الى السنة القادمة واصبح معدل النجاح 60

عند ذلك كل السنة السابقة سيكونون راسبون :D

ببساطة اضفها كمادة جديدة وبدون ربط الجدوال الذي تحدثت عنها اي سجل جديد كاملا

In bad state

#3

فكرت بهذا الحل، لكني تخليت عنه

فإن قمت بإضافتها كمادة جديدة، فعندها يكون لها معرف جديد ! وهذه مصيبة !

بفرض أن الطالب رسب مادة ما ثم تغيرت المادة ثم تقدم الطالب لامتحان المادة "الجديدة" بعد التعديل سيشكل هذا مشكلة عند حساب المواد الراسب بها الطالب (سيكون متقدم لمادتين عوضاً عن مادة!)

تم تعديل هذه المشاركة بواسطة Speed_Of_Light في 26 يوليو 2010 في 03:00

#4

أخي سنان ..

كل ما عليك القيام به هو أن تنشي جدول للسنوات الدراسية وسيكون هو الجدول الرئيسي ... وعلاقته بجدول المواد علاقة many to many بهذا يمكنك الحفاظ على الـ history لكل سنة دون أي مشاكل بحيث أنه في الجدول الوسيط بينهما ستحتفظ حينها بقيمة درجة النجاح أو ما شابه دون التأثير على العمليات الحسابية في السنوات الأخرى. فكل سنة سيكون لها معرف خاص بها ومربوطة بمجموعة مواد مختلفة بدرجات مختلفة فلا حرج حينئذ.

جدول السنوات الدراسية سيكون هو محورك الأساسي لتعديل التصميم بحيث يصبح التصميم يدور ويقف عند هذا الجدول لأنك في الغالب كمستخدم ستطلب النتيجة بالسنة الدراسية ولن تطلبها عامة. فالسنة الدراسية هي أهم ركن وهو الذي سيربط لك الأجزاء ببعضها البعض مع الحفاظ على الـ history كاملاً.

بخصوص جدول المواد عليك أن تقوم بعمل self relation عليه لتدعم الخاصية الشجرية فهذه هي أفضل طريقة لأنها لن تجبرك على عدد معين من المراحل (levels) وأيضاً أسهل وأعلى ديناميكية وأسرع من أن تنشيء جدول لكل level في الشجرة.

جزاك الله خيراً

3

مدونة ابنتي الرضيعة: يوميات رزان

مدونتي التقنية العربية: البرمجة مع عبد المنعم

Technical Blog: Abdul Moniem's Thoughts

LinkedIn: Profile

#5

جزاك الله خيراً أخي أحمد :happy:

أحمد عبد المنعم كتب:
أخي سنان ..

حسام وليس سنان

أحمد عبد المنعم كتب:
كل ما عليك القيام به هو أن تنشي جدول للسنوات الدراسية وسيكون هو الجدول الرئيسي ... وعلاقته بجدول المواد علاقة many to many بهذا يمكنك الحفاظ على الـ history لكل سنة دون أي مشاكل بحيث أنه في الجدول الوسيط بينهما ستحتفظ حينها بقيمة درجة النجاح أو ما شابه دون التأثير على العمليات الحسابية في السنوات الأخرى. فكل سنة سيكون لها معرف خاص بها ومربوطة بمجموعة مواد مختلفة بدرجات مختلفة فلا حرج حينئذ.

جدول السنوات الدراسية سيكون هو محورك الأساسي لتعديل التصميم بحيث يصبح التصميم يدور ويقف عند هذا الجدول لأنك في الغالب كمستخدم ستطلب النتيجة بالسنة الدراسية ولن تطلبها عامة. فالسنة الدراسية هي أهم ركن وهو الذي سيربط لك الأجزاء ببعضها البعض مع الحفاظ على الـ history كاملاً.

بالحقيقة لقد حذفت جداول (السنة/الفصل/الاختصاص/العام الدراسي) من التصميم المعروض هنا لتبسيطه، لكنها موجودة وتصميمها بسيط جداً من الشكل (معرف/قيمة نصية)

لاحظ أخي أحمد أن جدول المواد هو بمثابو الجدول الوسيط الذي تتكلم عنه حيث يرتبط به كل من جدول الطلاب والمواد والسنوات والسنوات الدراسية والفصول والاختصاصات بعلاقات one-to-many

لدي ملاحظة وحيدة على فكرة نقل معلومات المواد (كحد النجاح والعلامة الكاملة ..) إلى جدول المواد: ألن يشكل هذا تكرار زائد بالبيانات Redundancy ؟ وخاصة أن جميع معلومات المادة قابلة للتعديل بين فصل وآخر ... وهذا يقودنا إلى الملاحظة الثانية وهي أنه لن يبقى أي معلومة أخرى في جدول المواد غير المعرف ! هذا هذا سليم ؟

بخصوص الـ self relation فهذا ما قمت به أساساً (انظر حقل parentid في جدول المواد)

إليك التصميم بعد نقل معلومات المواد إلى جدول العلامات وإظهار الجداول الأخرى الثانوية:

post-151966-097237400 1280147171_thumb.j

أو يمكن فصل جدول العلامات لوحده فيصبح الجدول الوسيط عبارة عن "خصائص المواد في فصل معين":

post-151966-015966300 1280147329_thumb.j

ما رأيك ؟

المرفقات
5.jpg6.jpg

تم تعديل هذه المشاركة بواسطة Speed_Of_Light في 26 يوليو 2010 في 15:29

#6

السلام عليكم

اخي حسام تصميمك الاول جيد ولا باس به عند التعديل على المادة يكون اضافة مادة جديدة بفصل دراسي جديد

ولا توجد اي مشكلة

المشكلة هي : انه اذا كان يعتمد درجة الاعمال بالسنة السابقة ان كان يعتمدها عليك بالتفكير بحل اخر اما ان لم تكن معتمد لا توجد اي مشكلة

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

سانزل برنامج المخططات لاوضح ذلك

بالتوفيق

In bad state

#7

يجب أن يكون لديك جدولين الجدول الأول هو جدول المواد والجدول الثاني هو جدول المواد التي تنزل في الفصلية

وسيتم ربط جدول الطلاب مع جدول المواد الفصلية وستعتمد على جدول المواد الفصلية في عمل كل شيء

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#8

أخي الحبيب حسام .. أعتذر لك أولاً عن الخطأ الغير مقصود لأني كنت أكتب رد أخر لأخي سنان في أحد الموضوعات والدنيا دخلت في بعض:D

وأعتذر لك ثانياً عن التأخير في الرد .. سأرد عليك اليوم بإذن الله مساءً .. أعتذر بشدة بسبب انشغالي :)

مدونة ابنتي الرضيعة: يوميات رزان

مدونتي التقنية العربية: البرمجة مع عبد المنعم

Technical Blog: Abdul Moniem's Thoughts

LinkedIn: Profile

#9

السلام عليكم

اخي بصراحة يمكن تعقدت الامور ولكن لا بد من هذا التعقيد

توجب اضافة جدول مؤلف من Subject

اي المادة وهو مؤلف من المعرف والاسم فقط لا غير

وجدول اخر SubjectTerm المواد الفصلية كما ذكر اخي علاء مؤلف من العلامة الكلية وعلامة النجاح والفصل الدراسي والمادة

وجدول Subjectpart طبعا هنا المقصود به اجزاء المادة من عملي ونظري واجزاء العملي واجزاء النظري

وجدول العلامات وهنا العلامة Marks ماهي الا علامة لجزء من الفصل الدراسي ويتم تجميع علامة الطالب بناءا على العلاقة بين جدول العلامات وجدول Subjectpart و SubjectTerm

طبعا هنا العلامة مخزنة للطالب بالتالي بالتاكد سيكون مربوط مع جدول الطلاب

وكما ذكر اخي احمد ان الجدول الاساسي هو جدول الفصول وهنا Term حيث يحتوي على الفصل والسنة الدراسية

وبالتالي اصبحت قاعدة البيانات مرنة

اتمنى التصحيح ان كان هنالك خطا

بالتوفيق وربنا يجزيكم كل خير

post-223709-091466900 1280277580_thumb.j

المرفقات
diagram.jpg
1

In bad state

#10

@ علاء الصالحي:

انظر المخطط الثاني من ردي السابق، أليس هذا ما تقصده ؟

حيث جدول المواد subjects يحوي فقط على معرف المادة (لأن جميع خصائص المادة الأخرى قابلة للتعديل)

وجدول terms-subjectproperties يعبر عن خصائص المواد لفصل معين

ويرتبط مع جدول الطلاب بعلاقة many-to-many بجدول وسيط هو جدول العلامات (حيث أن علاقة الطالب بالمادة هي علامته بهذه المادة)

@ أحمد عبد المنعم:

لا داعي للاعتذار، بارك الله بك، بانتظار ردك

@ X-File:

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

لماذا وضعت حقل termID في جدول الطلاب ؟

أيضاً: لٍمَ قمت بتجزئه خصائص المادة إلى جدولين (ٍSubjectPart / SubjectTerm) ؟ مع أن جميع المواد (أساسية وفرعية) تحمل جميع الخصائص ! أرى أنه تعقيد يمكن تجنبه!

أظن أننا جميعاً متفقون (من ناحية المبدأ) على وجود جدول العلامات كجدول وسيط في علاقة many-to-many بين جدول الطلاب وجدول خصائص المادة، أليس كذلك ؟

#11

السلام عليكم

termID فائدته بجدول الطلاب بسيطة بدل ان اضع لكل طالب العام الدراسي ساقتصر على شيء هو استيراد عمود من جدول الفصول وبذلك يتم التسجيل ضمن الفصل الاول من العام الدراسي

الفصل الاول 2007

الفصل الثاني 2007

الفصل الاول 2008

الفصل الثاني 2008

الفصل الاول 2009

الفصل الثاني 2009

وبذلك اكون قد اخصرت حجم لا باس به

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

والسنة القادمة اصبحت برمجة سطح مكتب اليس من الخطا ان تبقى بنفس الاسم

لذلك وضعتها بجدول مستقل والذي سيتم تغييره SubjectTerm حيث هنا المواد الفصلية

مثلا

1 100 60 (مفتاح مستورد من جدول الفصول وليكن الفصل الاول 2007) (مفتاح مستورد من جدول المواد وليكن كيماء )

2 100 50 (مفتاح مستورد من جدول الفصول وليكن الفصل الاول 2008 ) (مفتاح مستورد من جدول المواد وليكن كيماء )

التغيير الذي جرى معدل النجاح وبذلك يمكن ان يتم فرز الطلاب بالعام ال2008 عن الطلاب بالعام 2007

اما لماذا قمكت بالتجزئة فهي ليست تجزئة نهائيا وانما نقص توضيح وشرح مني

الفائدة بجدول

SubjectTerm هي كما سلف ذكره الحفاظ على الاسم الحقيقي للمادة مع امكانية التغيير والحفاظ على التعديلات

ٍSubjectPart نعم هو تعقيد لكن ان اردته ةمرن لا بد منه

الفائدة منه مثلا :

1 فحص عملي 1 (مفتاح مستورد من جدول المواد الفصلية ولكن 1)

وهنا تكن البنية الشجرية للمواد بربط الجدول مع نفسه

لذلك اتمنى التدقيق اخي حسام وبجد حتى انني تلافيت وجود جدول تلافيا للتعقيد

بانتظار اراء الاخرين

In bad state

#12

صحيح هذا ما قصدته لكن لا أظن أن الموضوع يصل إلى درجة ID فقط

يجب أن يكون هناك بعض الخصائص التي لا تتغير والتي تفرق المادة عن غيرها

مثلاً اسم المادة عدد الساعات التي تخصص للمادة في الأسبوع

المادة تابعة لأي كلية وصف عن المادة

وهكذا أمور

الباقي يوضع في جدول يربطه مع الفصل الذي ستحصل فيه المادة

ثم بعد هذا يرتبط مع الطالب في جدول آخر يحتوي على العلامات ونسبة الحضور والغياب وهكذا

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#13
علاء الصالحي كتب:

يجب أن يكون هناك بعض الخصائص التي لا تتغير والتي تفرق المادة عن غيرها

صدقني لا يوجد ...

في ظل "التخبط الإدراي" للمعهد أو الجامعة كل شيء ممكن

#14

على الأقل المعرف الخاص بها والاسم ربما الوصف

على كل الأحوال إن كان الأمر كذلك فأقترح عليك أن تكتفي بجدول المواد الفصلية

وعند ثبات الأمر تستطيع أن تقوم بعمل batch لعملية الفصل

لأن جدول بعمود واحد ألا وهو عمود المعرف لا يعني سوى وقت إضافي في عمليات الربط join

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#15

أسف للتأخير أخي حسام ..

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

فكرة أن يتم تعديل كل شيء في المادة ليست المشكلة .. ولكن المشكلة هي أن يتم تغيير بيانات مادة من تيرم إلى تيرم أو من سنة إلى سنة .. هذا سيؤثر على كل التقارير الخارجة من النظام وكل حسابات الدرجات لذا فستكون العلاقة بين التيرم وبين المواد علاقة one to many وجدول المواد سيتم الإضافة عليه كل تيرم.

مدونة ابنتي الرضيعة: يوميات رزان

مدونتي التقنية العربية: البرمجة مع عبد المنعم

Technical Blog: Abdul Moniem's Thoughts

LinkedIn: Profile

#16

@ علاء الصالحي:

وجود جدول يحوي عمود وحيد هدفه تمييز المواد بمعرف وذلك لأنه لا يمكن تمييز المادة بخصائصها

@ أحمد عبد المنعم:

لا يمكن إدخال قائمة من المواد كل فصل جديد! سيصبح من المستحيل متابعة المواد !

من أحد مهام النظام معرفة الطلاب الذين يحق لهم القدم في فصل ما

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

ولكن كيف للنظام أن يقوم بتحديد نجاح الطالب في مادة ما إن كان قد تقدم لها لأكثر من مرة إن لم يكن لها معرف يميزها ؟

شكراً لكم جميعاً :)

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

#17

يا حسام لا فائدة تذكر من الموضوع

يمكنك جعل رقم المادة والفصل على أساس أنهم primary key

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…