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

السلام عليكم ورحمة الله

كان هذا المشروع خطة شهر مايو، وقُمت بإنجازه والحمد لله، فأحببت أن أشارككم تفاصيل التجربة من تحليل وتخطيط وبرمجة وتجربة.

تكلمنا سابقاً عن مشروع TurboBird، وهو برنامج لإدارة قواعد بيانات فيربيرد وهو مفتوح المصدر وقد بدأته بنهاية عام 2009. وأصبحت استخدمه كأداة مُساعدة في تطوير البرامج التجارية التي أقوم بعملها. وأثناء التطوير في البرامج التجارية أقوم بتصحيح المشاكل الموجودة في برنامج توربو بيرد وأحياناً أقوم بعمل إضافات فيه، وهذا حال كثير من الأدوات مفتوحة المصدر، إذ يقوم الداعم لها بإستخدامها في أعماله التجارية وتطويرها.

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

  1. أن الحل سوف يكون عام وممكن استخدامه مع أي مشروع آخر يستخدم قاعدة البيانات فيربيرد
  2. أن تعم الفائدة لبقية المبرمجين الذين يستخدمون قاعدة البيانات فيربيرد
  3. أن تكون ميزة تنافسية لصالح برنامج توربوبيرد من مما يُزيد من استخدامه

وفي الآونة اﻷخيرة أصبحت أجد أن هناك من يتكلم عن برنامج توربو بيرد، مثل هذا الخبر

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

بعدها قُمت مباشرة بتصميم فورم بسيط به قاعدة البيانات اﻷصلية وإختيار قاعدة البيانات لمقارنتها بها. بعد ذلك قُمت بعمل إجراء لقراءة أسماء وحدات قاعدة البيانات في كلتا القاعدتين ثم مقارنتها وإنتاج قائمة بالمفقود. بعد ذلك قُمت بعمل إجراء لإنتاج Script ليقوم بإنشاء هذه الوحدات الناقصة في قاعدة البيانات الثانية. بعد ذلك أقوم بعمل إختبارات مكثفة للتأكد من أن هذه اﻹجراء تمت بصورة جيدة.

وفي المرحلة الثانية قُمت بكتابة إجراء لمقارنة الحقول الناقصة في الجداول الموجودة في كلتا القاعدين، ثم إنتاج Script لإنشائها في قاعدة البيانات الثانية.

بعد ذلك قُمت بإضافة إجراء لمقارنة الوحدات الموجودة في كلتا القاعدتين لمعرفة إذا كان هُناك فرق، مثل الحقول المتغيرة، الفهارس، والإجراءات، والـ Triggers، والـ Domains. وعند وجود فرق أقوم بتطبيق الفرق، أو حذف تلك الوحدة أو الخاصية ثم إنشائها بالطريقة الموجودة في قاعدة البيانات اﻷولى.

بعد ذلك كُنت أقوم بعمل إختبارات ومعالجة المشاكل، وإستمر ذلك لعدة أيام تكون فيها كل دورات البرمجة الرشيقة والتي تتم بصورة متقاربة ودورية: تصميم، كتابة كود، عمل إختبارات، ثم إعادة تصميم وكتابة كود ثم إعادة اﻹختبارات.

وفي المرحلة اﻷخيرة حذف الخصائص التي تم حذفها من قاعدة البينات الأصلية. واستثنيت من ذلك المستخدمين، حيث أن المستخدمين لم أعتبرهم جزء من هيكل البيانات، وإنما جزء من الإعدادات الخاصة بالزبائن. كذلك لم أقم بحذف الـ Roles، وذلك لأنه لم يتضح بشكل قاطع، هل هو خاصية من هيكل البيانات وجزء من البرامج أم أنه كسابقه جزء من إعدادات البرنامج.

الجزء اﻷخير والذي لم أقم بعمله لضيق الوقت وهو الصلاحيات التي تغيرت بين القاعدتين. وكانت المقولة التي استندت عليها في وضع الخطة للبرنامج هي “مالايُدرك كله لا يُترك جُله“. فكان الجزء الذي تم بفضل الله يكفي لهذه المرحلة ويُأتمم جزء كبير من عملية إصدار نُسخ جديدة للبرامج التجارية.

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

وهذا مثال لأحد اﻹجراءات في عملية المقارنة مكتوبة بلغة أوجكت باسكال:


procedure TfmComparison.ScriptRemovedFields;
var
  i: Integer;
  Line, ATableName, AFieldName: string;
begin
  if RemovedFieldsList.Count > 0 then
  begin
    fQueryWindow.meQuery.Lines.Add('');
    fQueryWindow.meQuery.Lines.Add('-- Removed Fields');
  end;

  for i:= 0 to RemovedFieldsList.Count - 1 do
  begin
    Line:= RemovedFieldsList[i];
    ATableName:= copy(Line, 1, Pos(',', Line) - 1);
    System.Delete(Line, 1, Pos(',', Line));
    AFieldName:= Line;
    fQueryWindow.meQuery.Lines.Add('alter table ' + ATableName + ' drop '
       + AFieldName + ';');
  end;
end;

7 thoughts on “دراسة حالة: إضافة مقارنة هيكل قاعدة بيانات في برنامج توربو بيرد

  1. هذا الموضوع يثير شهيتي للكتابة عن البرمجيات الشخصية و أهميتها في حياة المبرمج، و قد لاحظت أن بعض تلك البرمجيات يتحول إلي ملهمٍ لأفكارٍ أكبرو أكبر و من ثم تتحول قيمته الكلية إلي ما هو أكبر من مجموع أجزائه.
    في بعض الأحيان يكون استخدام البرنامج المصنوع يدوياً أفضل من البرنامج الموجود بالفعل؛ و ذلك لتركيز الأول علي أشياء و مهام محددة بينما يكون الثاني عاماً، و ربما “مزدحماً” أكثر من اللازم.
    بالمناسبة: ألاحظ في الأكواد التي توردها قلة التعليقات و هو أمرٌ هامٌ للغاية خصوصاً في المشاريع الكبيرة ذات الخوارزمات المعقدة، و بصفتي الرئيس الشرفي لنادي (المعلقون بحماس) فأرغب في ضمك للنادي ^_^

  2. بالنسبة لقلة التعليقات فكلامك صحيح، أحياناً أستعوض عن كثرة التعليقات بكتابة إسم واضح وواصف للإجراء والمتغيرات. لكن أقوم بكتابة التعليقات عندما تسنح لي الفرصة عندما أقوم بإعادة صياغة الكود Refactoring

  3. أولا لفت نظري الصورة الفنية التي وضعتها في بداية المقال، بالاضافة إلى انك وضعتا إطارا لها على الاقل 5pix
    أما عن الموضوع فسوف لن اثبط عزيمتك في المتابعة 😛 و لكن الأمر ليس سهلا كما تظن.

  4. أنا أيضا افعل ذلك، و لكن اعلق فقط عندما اذكر الحاجة لفعل شيء غريب، مثلا عدم تحرير Object و تركه، أو انقاص قيمة من الـ Buffer size فأذكر السبب لذلك حتى لا يستغرب القاريء و يظن أنا علة.

  5. أنا علي عكسكما تماماً في هذه النقطة: إذ أنني ربما أعلق سطراً بسطر، بل ربما يكون التعليق شرحاً كبيراً ! و الحق أنني أجد هذا شيئاً في غاية اللزومية حينما يكون الخوارزم معقداً أو يكون البرنامج كبيراً؛ حتي لا أنسي و أضطر لقراءة الكود بكل ما يعنيه هذا من مخاطر نسيان أحد الحيل أو نسيان فائدة شيءٍ كان يمكن فعله بشكلٍ آخر، و هكذا.
    بالمناسبة: أسماء الدوال functions و المتغيرات variables عندي قد تكون أيضاً طويلة (ربما تكون بالغة الطول في الدوال) للوصول للتوثيق الأفضل.

  6. […] تطوير برنامج توربو بيرد: وهو برنامج مفتوح المصدر لإدارة قواعد بيانات فيربيرد التي استخدمها في كل البرامج التي أقوم بتطويرها بإستقلال عن طلب الزبائن. واستخدم هذا البرنامج في تطوير اﻷنظمة اﻷخرى، ثم أقوم بتطوير برنامج توربو بيرد ليلبي إحتياجات تلك اﻷنظمة، مثل مقارنة قواعد البيانات التي تكلمت عنها في تدوينه سابقة. […]

أضف تعليقاً

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s