السلام عليكم
أقوم حالياً بتصميم برنامج لإدارة نتائج الامتحانات في معهد أو جامعة. أحاول القيام به وفق تصميم جيد قابل للتوسيع والتعديل وذلك كتمرين لي على "البرامج الحقيقية" فلا يوجد تمرين أفضل من الواقع
لقد قمت بدراسة التصميم لمدة كافية وتوصلت إلى عدد من الحلول ولكن أريد ملاحظات ونصائح الخبراء في تحليل وتصميم النظم.
البرنامج ببساطة مسؤول عن إدخال النتائج وحسابها وإعلانها
الجامعة/المعهد يحوي عدة اختصاصات
لا يوجد هيكلية معروفة للمواد، بل هي شجرية. فمثلاً مادة "مبادئ صناعات" تحتوي على قسمين درجة أعمال وامتحانات وكل منهما ينقسم إلى عملي ونظري، والعملي ينقسم إلى حدادة ولحام وسباكة ....
يقوم الموظف بإدخال الطلاب الجدد في بداية كل عام ونتائج الطلاب في نهاية كل دورة/فصل امتحاني، حيث تحتوي السنة على فصل أول/فصل ثاني/دورة صيفية
يقوم البرنامج بحساب علامات الطالب وتحديد وضعه بعد كل دورة (ناجح راسب منقول متخرج ...)
من نظرة أولية وجدت أن البرنامج يحتوي بشكل أساسي على ثلاث جداول: جدول الطلاب، جدول المواد، جدول العلامات. كما هو مبين في الشكل:
وهذا التصميم فعال وصحيح إلى حد كبير، ويمكنك من إجراء جميع الحسابات واستخراج جميع البيانات والتقارير بسهولة
لكن !
نحن في العالم الحقيقي، حيث يمكن للمواد أن تتغير وللطلاب أن تأتي وتذهب !
يمكن معالجة مشكلة انتقال طالب من وإلى الجامعة/المعهد بسهولة نسبياً ... ودون الحاجة إلى تعديل تصميم قاعدة البيانات
لكن المشكلة في تعديل المواد! فماذا لو تعدل الحد الأدنى للنجاح مثلاً؟ لا يمكنني تعديله على قاعدة البيانات لأن ذلك سيؤدي إلى أخطاء في حساب النتائج السابقة.
فكرت في إدراج أي تعديل في المواد كمادة جديدة، لكن ذلك سيصعب المسألة كثيراً ... (بالحقيقة لا يعود هناك فائدة من الـ id في جدول العلامات! كيف ستعرف أن الطالب ناحج بالمادة الفلانية أم لا؟)
فكرت بفصل الخصائص القابلة للتغيير بالمواد إلى جدول منفصل أسميه "خصائص المادة". وما هي الخصائص القابلة للتغيير ؟ حسناً كلها !
إذاً هل فكرت بتعديل التصميم قليلاً ليصبح:
وبذلك يمكنني تعديل جميع خصائص المادة مع المحافظة على id واحد لها يمكنني من تمييزها وإجراء الحسابات عليه.
لكنه سيزيد من تعقيد قاعدة البيانات بطبيعة الحال
هذه هي الأفكار التي تجول في دماغي :D
هل واجهت مشاكل مماثلة عند تصميم برامج في "العالم الحقيقي" ؟ وكيف قمت بحلها ؟
هل هناك طريقة أفضل لتصميم قاعدة البيانات هذه بحيث تعالج تغيرات "العالم الحقيقي" بشكل فعال مع المحافظة على بساطة التصميم؟
