وظيفة قاعدة البيانات العلائقية

database_server

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

كُنت أنوي اليوم التكلم على طريقة عمل Database replication لكن إحتجت لأن أكتب مقدمة يُمكن أن تُعتبر مقالة منفصلة في حد ذاتها، وهي وظيفة قاعدة البيانات العلائقية ومكانها من أي نظام، لذلك فضلت أن أتكلم عنها في تدوينة منفصلة.

في الحقيقة قاعدة البيانات بالنسبة لي هي أداة لتخزين البيانات المترابطة وإسترجاعها بصورة منظمة ومعتمدة،  ودائماً استخدم هذا التعريف:

A highly optimized and reliable storage and retrieval media for relational data.

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

هذا التعريف الذي أستخدمه جعلني أقلل من اﻹعتمادية في استخدام قاعدة البيانات لشيء آخر، مثلاً الـ Business logic فمُحال أن أقوم بكتابته في قاعدة البيانات عن طريق ما يُسمى بإجراءات قاعدة البيانات stored procedures وذلك لعدة أسباب:

    أن كود إجراءات قاعدة البيانات هيكلي structured وليس كائني Object oriented، ومعروف أن البرمجة الهيكلية تُمثل حقبة الثمانينيات.أن اللغة المستخدمة في برمجة إجراءات قاعدة البيانات تختلف من قاعدة بيانات إلى أخرى، مما يجعل البرنامج أقل محمولية (إن صح التعبير) portability بين محركات قواعد البياناتأصبحت اﻵن تتوفر طبقة جديدة في البرامج الكبيرة يُمكن أن تكون منفصلة في التثبيت وهي الطبقة الوسيطة middle layer متمثلة في عدد من التقنيات مثل Soap و RESTfull أو حتى إذا كانت طبقة وصول لقاعدة البيانات ضمن الملف التنفيذي في برنامج client/server. هذه الطبقة يُمكن كتابتها بلغة برمجة راقية تستخدم البرمجة الكائنية.كود اﻹجراءات stored procedures هي تقع ضمن لغات الـ scripting language لذلك لا أعتبرها programming language باﻹضافة إلى أنها غير compiled لذلك فهي تصنع نوع من الهشاشة في البرامج، فيستطيع أي شخص لديه صلاحية على قاعدة البيانات تغييرها فيقوم بتغيير جزء من كود البرامج، وهذا لايحدث عند اﻹعتماد على لغة compiled ينتج عنها برامج تنفيذية مشفرة وفي شكل كبسولة يصعب تغييرها.أن اللغات العالية المستوى والكائنية ذات إمكانات برمجية عالية تفوق كل لغات الـ SQL بعقود كثيرة، وتُعتبر تحفة فنية تتنافس في مابينها.

يمكنكم قراءة عدة مقالات تتكلم عن عيوب اﻹعتماد على الـ stored procedures:

http://gadgetopia.com/post/7082

http://akfpartners.com/techblog/2010/05/19/why-we-hate-stored-procedures/

http://c2.com/cgi/wiki?StoredProceduresAreEvil

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

في الماضي كُنت أقوم فقط بكتابة إجراءات قواعد بيانات بسيطة مثل إضافة في جدول أو تعديل أو إسترجاع بيانات ولم يكن هناك سبب لأن تكون stored procedures إنما هو التقليد اﻷعمى. وعندما أصبحت أعمل بشكل مستقل لم أكتب stored procedure واحد في أي من البرامج التي أكتبها، وكمثال لذلك نظام تسجيل المحاسبي، حيث لا يوجد به إجراء في قاعدة البيانات، إنما كافة اﻹجراءات مكتوبة بلغة باسكال التي أتقنها بطريقة كائنية ضمن classes مخصصة للوصول لقواعد البيانات أو classes مخصصة لتنفيذ مهمة معينة. وقد سهلت هذه الطريقة تحديث البرنامج، فكلما كان هُناك تعديل في الـ business logic أو إضافة ميزة جديدة أو تصليح عيب، فكل ماعلى المستخدم هو تحميل نسخة تنفيذية جديدة هي عبارة عن كبسولة محمية، ولا يحتاج هذا التحديث لأي تغيير في قاعدة البيانات، حيث أن قاعدة البيانات أصبحت ملكاً للمستخدم النهائي لا يستطيع البرنامج تغيير هيكلها إلا بإستئذانه.

بهذه الطريقة يستطيع المبرمج كتابة طبقة الوصول للبيانات بلغة البرمجة التي يُتقنها بغض النظر عن قاعدة البيانات التي سوف يستخدمها.

المهم في إختيار قاعدة البيانات حسب رأيي أن تكون متوفرة (أي مجانية، ولها نُسخ جديدة) ومشهود لها بالكفاءة، ومتعددة المنصات cross-platform وكمثال لمحركات قواعد البيانات التي تتوفر فيها تلك الشروط هي:

22 thoughts on “وظيفة قاعدة البيانات العلائقية

  1. أحتفظ بتعليقك _قاعدة البيانات أصبحت ملكاً للمستخدم النهائي لا يستطيع البرنامج تغيير هيكلها إلا بإستئذانه__۔
    فعلا ,من النادر أن يسمح للمبرمج ان يغير DB schema ۔
    StoredProcedures لها سلبياتها و اِيجابياتها ,مثلا trigger & view يسهلا كثيرا عمل المبرمج۔
    حذاري MySQL اصبحت ملكيه ORACLE يمكن تنصيبها لكن غير ممكن توزيعها اِلا ب $$$..

  2. MySQL مازالت مجانية ومتوفرة، ولم أجد أي معلومة تفيد غير ذلك.
    لكن مستقبلاً ممكن أن يحدث هذا، لكن هذا ليس في الصالح، إذا حدث أن تم إغلاقها أو الحد من حريتها فذلك فرصة كبيرة لقواعد البيانات المنافسة أن تحل محلها مثل FireBird, PostgreSQL

  3. لا تنسى SQLite فهي ايضا علائقية بالرغم انها لاتحوي اجراءات و لكن تحوي Triggers مبسطة وهذا كافي بالنسبة لي.

    أهم ما يميز القواعد البيانات هي Trigger و انا استخدمها بكثرة في عملي، وبدونها اعتبر قاعدة البيانات غير مستقرة، أما الاجراءات فهي لا تستعمل إلا عند فشل التعليمات العادية مثل SELECT بتأدية الوظيفة المطلوبة، و لكن حتى هذه تم حلها في فايربير و أظن في PostGre بامكانية تنفيذ و ارسال اجراء دون تخزينه في قاعدة البيانات EXECUTE BLOCK في FirebirdSQL مثلا، لذلك استطعنا تخفيض عدد الاجراءات كثيرا في عملنا.

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

    >في الماضي كُنت أقوم فقط بكتابة إجراءات قواعد بيانات بسيطة مثل إضافة في جدول أو تعديل أو إسترجاع بيانات ولم يكن هناك سبب >لأن تكون stored procedures

    لي تجربة سابقة برنامج اجنبي يستخدم فايربيرد كان يضع لكل جدول أربع اجراءات، صدمت بالفعل و لكني لم اهتم للموضوع إلى ان اصدمت باحدهم حاول نقل منتدى PunBB إلى الفايريبيرد فقام بوضع هذه الجداول و رفضت هذه التعديلات لتقيد مافعل، و عندما قمت بنقل الـ PunBB تم الرفض فورا لظن المبرمج الرئيسي انني افعل مثله.

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

  5. اخي ابو اِيَاس لا اعلم من اين خرجت بالخلاصة۔ هل فهمت النقطة ٥:
    Conclusion: Redistribution Is Key : 5
    The conclusion of this story is twofold. First of all, as long as you don’t redistribute the MySQL software, you don’t need to worry about licenses, even if you make money by providing database-related services or products that need MySQL to be available. Second, even if you redistribute MySQL under the GPL, you can still make money with it, as long as you offer the source code of your project, which your customer might not even want to have.
    MySQL is GPL وبالتالي $$$=$$$.

    هدَا النص من الموقع الرسمي:
    If you include the MySQL server with an application that is not licensed under the GPL or GPL-compatible license, you need a commercial license for the MySQL server.

    If you develop and distribute a commercial application and as part of utilizing your application, the end-user must download a copy of MySQL; for each derivative work, you (or, in some cases, your end-user) need a commercial license for the MySQL server and/or MySQL client libraries.
    http://www.mysql.com/about/legal/licensing//commercial-license.html

  6. كنت أفهم أن المقصود من Redistrbution المقصود بها فقط النُسخة الذي قام المبرمج بتعديلها وتوزيعها معدلة للزبائن.
    الكلام عن الترخيص في الموقع الرسمي أكثر وضوحاً.
    هذا يعني أن MySQL يجب أن تسقط من حساباتي في المستقبل.
    إذاً الحل هو استخدام PostreSQL أو FireBird وأنا أعرف أن FireBird ليس فيها أي نُسخة تجارية، يُمكن إستخدامها بدون قيود -حسب علمي- لكن هل لديك معلومة عن PostgreSQL؟

  7. النسخ القديمة من MySQL تخضع للتراخيص القديمة، اما الجديدة حتما تجارية، و التراخيض ليست على المنتج بالكامل بل احيانا حسب نوع القاعدة التي تفتحها داخل ال MySQL.
    الـ Postgree مثل SQLite و الفايربيرد حرة في استخدامها حتى في التجاري منها و المغلق، خاصة الفايربيرد.

  8. لدي مشكلة واحدة في عدم استخدام البوستغري هي ا نها تقوم بنقل كامل الخرج إلى الطرفية Client قبل البدء باستخدامه في الطرفية، على عكس الفايربيرد و الـ SQLite
    ابحث عن Postgre Incremental Result
    أيضا ميزة تعدد الـ Transactions ضمن اتصال واحد موجودة فقط في الفايربيرد.

  9. <<لدي مشكلة واحدة في عدم استخدام البوستغري هي ا نها تقوم بنقل كامل الخرج إلى الطرفية Client قبل البدء باستخدامه في الطرفية، على عكس الفايربيرد و الـ SQLite
    لم أفهم هذه النقطة، هل تقصد بها خاصية الـ Partial fetching مثلاً إذا قامت الطرفية بطلب 1000 سجل فربما يأتي فقط 10 وعندما نصل للسجل رقم 10 يتم جلب 10 أخرى.

    الميزة المهمة التي أبحث عنها هذه اﻷيام هي أن تعمل قاعدة البيانات بطريقة Master -Slave replication

  10. يمكن Partial لاني لم اجد الموضوع، على كل حال قاموا باضافة هذه الميزة على ما اعتقد
    الآن انت ابحث عن Master -Slave replication لاني ضعت بصراحة من كثرة القراءة، و خبرنا، مع اني اعتقد ان البوستغيري أقو من الـ MySQL بهذه الأمور.

  11. أنا أقصد Partial مثل الفيربيرد، ولم أقصد البوستقريس، لأني لم أجرب اﻷخيرة كثيراً.
    بالنسبة للـ Master slave في أول قراءتي لها ظهر أول عيب، وهو أن البوستقريس تشترط أن يكون الجهاز الأساسي والتابع بنفس المعمارية 32 أو 64، ونفس الننسخة من محرك قاعدة البيانات. هذه لم تكن مشكلة في MySQL. هذا يعني أني أحتاج لتهيئة جهاز به نسخة مشابهة لنسخة اللابتوب حتى أستطيع عمل هذه التجربة
    http://wiki.postgresql.org/wiki/Binary_Replication_Tutorial

  12. انا فاهم ان استخدام ال SP في بيئة عميل ـــ خادم ﻻيمكن التنازل عنه لأنه يوفر امكانية كبسلة البارامس من اجل الاستعﻻم على مجموعة صغيرة من التسجيﻻت التي ﻻ توفرها تعليمة select التي تحضر كل التسجيﻻت دفعة واحدة الى العميل مما يؤثر على اداء الشبكة
    الرجاء احاطتي بوجهة نظرك في هده النقطة
    مشكور مسبقا

  13. بالنسبة لأي محرك قاعدة بيانات فهو يقوم بتنفيذ تعليمات SQL في المخدم سواءً كانت عن طريق Stored Procedures أم عن طريق إستعلام مباشر Query بدون إستخدام Stored Procedure.
    إقرأ هذه التدوينة وستجد فيها أن السرعة نفسها في الحالتين:
    http://www.codeproject.com/Articles/414272/Stored-Procedures-DO-NOT-increase-performance

أضف تعليقاً

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

WordPress.com Logo

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

صورة تويتر

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

Facebook photo

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

Google+ photo

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

Connecting to %s