ما هي قواعد بيانات NOSQL ؟

قبل البدء في الحديث عن قواعد بيانات الـ NOSQL سأقوم بالتحدث بشكل مبسط عن قواعد البيانات SQL من حيث المزايا والعيوب والسبب الذي جعل شركات الإنترنت الكبرى تبحث عن وسائل بديلة.

قواعد البيانات SQL

تعتمد قواعد البيانات SQL على الجداول والعلاقات بشكل رئيسي، حيث يتم تصميمها لتتبع مخطط (Schema) واحد لا يمكن التلاعب به او تجاهله، أي انه لا يمكننا ادراج اي بيانات في الجدول لعمود لم يتم انشاءه.

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

أهم مزايا قواعد بيانات الـ SQL

يمكننا تلخيص أهم مزايا قواعد بيانات الـ SQL على النحو التالي:

  • تتبع تصميم ثابت
  • تقوم بتخزين البيانات في جداول
  • تستخدم لغة الـ SQL للاستعلام عن البيانات
  • تدعم الـJoin بين الجداول لاستعلام عن البيانات
  • تشجع على مبدأ الـ Normalization للتقيل من تكرار البيانات

الفرق بين Vertical و Horizontal Scaling

حتى الان تبدو قواعد الـSQL ممتازة جداً وتلبي جميع الاحتياجات، لكن هنالك مشكلة بسيطة واجهت شركات الانترنت الكبرى مثل جوجل وامازون وفيسبوك الا وهي متطلبات تطبيقات الانترنت الحديثة من حيث عدد المستخدمين و كمية البيانات الضخمة و توفير هذه البيانات للمستخدمين بسرعة عالية بالإضافة إلى دعم الحوسبة السحابية.

حتى نقوم بحل هذه المشكلة في قواعد بيانات الـ SQL فانه يمكننا ان نقوم بالـ Vertical Scaling او Scale-up للخوادم وهي تعني اضافة المزيد من الذاكرة والمعاجلات والاقراص الصلبة، لكن سنصل في نهاية الأمر لمرحلة لا يمكننا فيها اضافة المزيد من الموارد، إضافة لكون هذه الطريقة مكلفة جداً.

للتغلب على هذه القيود سنحتاج إلى ان نقوم بالـ Horizontal Scaling او Scale-out وهي تعني اضافة المزيد من الخوادم وايصالها ببعضها البعض عوضاً عن إضافة المزيد من الموارد لخادم واحد فقط. هذه العملية لا تتعامل معها قواعد بيانات الـ SQL بطريقة ممتازة وكفائة عالية جداً حيث أنه لا يمكن ان تضمن صحة البيانات المتواجدة على الخوادم المختلفة في نفس الوقت اضافةً إلى كون الاستعلام عن جداول على خوادم مختلفة (عمل Join فيما بينهم) لا يخدم الاداء المطلوب بشكل ممتاز (Performance issue).

vertical vs horizontal scaling
رسم توضيحي للـ Vertical and Horizontal Scaling

 قواعد البيانات NOSQL

تم تطوير قواعد البيانات NOSQL للتغلب على بعض القصور الموجود في قواعد بيانات SQL أثناء عملية التوسع (Scaling) والتعامل مع البيانات الضخمة.

حيث ان قواعد البيانات NOSQL تفضل الإستغناء عن مبدأ الـ Consistincy (ببساطة هو جعل البيانات متشابهة تماماً في جميع نسخ قواعد البيانات المنتشرة على خوادم مختلفة) مقابل الحصول على أداء عالي وجعل البيانات متاحة في جميع الأوقات (Performance and Availability).

أهم مزايا قواعد بيانات الـ NOSQL

يمكننا تلخيص أهم مزايا قواعد بيانات الـ NOSQL على النحو التالي:

  • تقوم بتخزين البيانات في ملفات (Documents) عوضاً عن الجداول
  • لا تتبع تصميم ثابت
  • لا تستخدم لغة الـ SQL للاستعلام عن البيانات
  • تدعم الـJoin للربط بين الملفات (Documents) ولكن لا تشجع على استخدامها
  • لاتشجع على مبدأ الـ Normalization ولا مانع في تكرار البيانات
  • تدعم التوسع واتاحة البيانات في جميع الاوقات بشكل ممتاز (Performance and Availability)

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

أشهر أنواع قواعد بيانات الـ NOSQL

أكثر قواعد بيانات الـ NOSQL المتوفرة مفتوحة المصدر كما أن هنالك أنواع عديدة منها تختلف عن بعضها البعض في طريقة التعامل ومعالجة البيانات. أشهر هذه الأنواع هي:

Document Stores

يتم تخزين البيانات في هذا النوع على شكل ملفات، غالباً ما تكون JSON او XML. وبما أن قواعد البيانات NOSQL لا تعتمد على تصميم ثابت، فإن كل ملف يمكن ان يحتوي على تصميم مختلف وغير منظم (Unstructured Schema). حتى نستوعب كيفية تنظيم وترتيب البيانات والملفات في هذا النوع، دعونا نأخذ مثال بسيط لجداول تم تصميمها لقواعد بيانات SQL.

تصميم مبسط لمدونة باستخدام قاعدة بيانات SQL

في المثال السابق، نجد بأن كل مستخدم في النظام بأمكانه نشر موضوع وأن كل موضوع ينتمي لتصنيف محدد، بالإضافة إلى ان كل موضوع يحتوي على عدد من التعليقات. لتمثيل الجداول السابقة وتخزينها في قواعد بيانات NOSQL من نوع Document Stores فإننا سنقوم بالتالي (بافتراض اننا سنسخدم مستندات JSON)

 

مثال لمدونة باستخدام ملف JSON لقاعدة بيانات NOSQL
مثال لمدونة باستخدام ملف JSON لقاعدة بيانات NOSQL

ستلاحظ في المثال السابق التالي أنني قمت ببناء الملف واعتمدت على الـ Post في بنائه. أيضاً، كلاً من الـ User و الـComments يعتبرا مستندان فرعيان متضمنان (Embeded Sub-document) داخل المستند Post وليسا مستندان منفصلان.

قد تتسائل عن السبب الذي جعلني أقوم ببناء المستند اعتماداً على الـ Post وليس الـ User! في الحقيقة يمكننا بناء المستند اعتماداً على الـ User وجعل المواضيع (Post) مستند فرعي داخل مستند الـ User. بنائنا للمستند يعتمد بشكل رئيسي على متطلبات النظام. ففي المثال الاول، افترضت ان النظام (المدونة) تعتمد بشكل رئيسي على عرض المواضيع أولاً للزوار وليس عرض المستخدمين للزوار!

من قواعد البيانات الشهيره والتي تعتمد على الـDocuments في التعامل مع البيانات هي MongoDB و CouchDB (كلاهما مفتوح المصدر).

Key-Value Store

يتم تخزين البيانات اعتمادا على مفتاح (Key) وقيمة لهذا المفتاح (Value) تماماً مثل الـ Hash Table. حيث انه لا يمكن للمفاتيح ان تتشابه او تتكرر بالإضافة إلى ان قاعدة البيانات لا تهتم بنوع البيانات (Value) التي تقوم بتخزينها، فقد تكون نص او ملف JSON او صورة.

مثال للـ Key-Value Store
مثال للـ Key-Value Store

تكمن قوة الـ Key-value store في سرعة القراءة، حيث غالباً ما يتم استخدامها في عملية التخزين المؤقت للبيانات (Caching) حيث أن بعض قواعد البيانات تقوم بتخزين البيانات في الذاكرة العشوائية (RAM) لسرعة الوصول إليها.

من قواعد البيانات الشهيره والتي تعتمد على الـKey-Value Store في التعامل مع البيانات Redis (مفتوحة المصدر).

Graph Databases

يتم تخزين البيانات على شكل Node و Relationship حيث يمكن ان تمثل Social Graph (العلاقة بينك وبين المستخدمين الاخرين على وسائل التواصل الاجتماعي) او شبكة مواصلات (خرائط جوجل مثلاً) وغيرها.

مثال توضيحي عن الـ Social Graph

في المثال السابق تمثل الدائرة Node ويمثل الخط المتصل بينهم Relationship. فعلى سبيل المثال: محمد صديق قاسم وقاسم صديق عبدالعزيز وكل من قاسم وعبدالعزيز ومحمد قد قامو بزيارة مطعم البيتزا أي انه يمكننا الاستنتاج بأن كلا من محمد وعبدالعزيز قاما بمقابلة بعضهما البعض وبالتالي يمكننا الاقتراح على محمد إضافة عبدالعزيز كصديق والعكس ايضاً.

من قواعد البيانات الشهيره والتي تعتمد على الـGraph في التعامل مع البيانات هي Neo4j (مفتوحة المصدر) و  FlockDB (مفتوحة المصد وتم تطويرها من قبل تويتر).

Column Stores

في قواعد البيانات SQL يتم تخزين البيانات على شكل صفوف (Rows) وهو الأمر الذي تتجنبه قواعد بيانات الـColumn Store، حيث تقوم بتخزين البيانات على شكل أعمدة (Coumn).

مثال على الـ Column Stores
مثال على الـ Column Stores

في المثال السابق، إذا رغبنا في احضار اسماء الطلاب المتخصصين في الـInformation Technology فقط باستخدام قواعد البيانات SQL فإن قاعدة البيانات ستقوم بالبحث في جميع الاعمدة والصفوف، بدءً من العامود ID وانتهاءً بعمود City وهذا الامر سيستغرق وقت اذا كان لدنيا ملايين البيانات.

أما في حالة الـ Column Store فإن قاعدة البيانات ستبحث في عامود Speciality و Name فقط، من الاعلى إلى الاسفل. تخيل كم من الوقت سنوفر إذا كان لدينا مئات الاعمدة وملايين الصفوف!

من قواعد البيانات الشهيره والتي تعتمد على Column Store في التعامل مع البيانات هي Cassandra و  HBase (كلاهما مفتوح المصدر).

شركات كبرى تستخدم قواعد بيانات NOSQL

هنا بعض من شركات الانترنت الكبرى والتي قامت بالاعتماد على قواعد بيانات NOSQL.

ملاحظة: استخدامهم لها لا يعني بالضرورة استغنائهم عن قواعد بيانات الـ SQL بل قد يتم استخدام الـ NOSQL لأداء بعض المهام للاستفادة من مزاياها.

  • Linkedin
  • Ebay
  • Google
  • Amazon
  • Facebook
  • Craigslist
  • Cisco
  • Expedia
  • SAP
  • EA
  • Nokia
  • Adobe
  • parse
  • Foursquare

والعديد غيرها…

الخلاصة

يجب ان تضع في عين الاعتبار أن لكل من قواعد البيانات SQL و NOSQL مميزات وعيوب وخصائص تميزهما، ولا توجد قاعدة بيانات أفضل من الأخرى بل لكل منها استخدام مختلف عن الاخر بكل ويكمل كل منهما الاخر.

أغلب الشركات الكبرى تعتمد على اكثر من قاعدة بيانات بل وقد تدمج اكثر من نوع من قواعد البيانات لخدمة نظام او تطبيق واحد. فلا تتسرع في اختيار قاعدة البيانات بل قم بدراسة متطلبات المشروع جيداً فلا تعلم قد تحتاج لتخزين البيانات على SQLITE في نهاية الأمر!

ماذا بعد؟

بإذن الله ساقوم بكتابة تدوينة أشرح بها إستخدام قاعدة البيانات MongoDB، حيث تعتبر من أشهر قواعد البيانات مفتوحة المصدر من نوع Document.

حديثي في سناب شات عن هذه المقالة

12 تعليق

أضف تعليقا ←

  1. omnyyah قال:

    مقالة مفيدة
    استفدت كثير
    شكرا لك

  2. Code قال:

    ممتاز وبانتظار البقية

  3. Fareeda قال:

    ماشاء الله معلومات مهمة و شرح سلس .
    بارك الله في علمك .

  4. Sumayah Bawazeer قال:

    تسلسل المعلومات وأسلوب الطرح جدا مشوق بارك الله فيك. ننتظر موضوع ال mongoDB حيث أني من شهر بدأت اشتغل عليه لغرض تنقيب البيانات??

  5. حتى الآن لم استوعب nosql
    عندي مشاريع sql حاليا فيها بطئ كبير حتى مع الفهرسة
    لذلك ابحث عن بديل
    لكن هل هناك طريقة للتحويل من sql الى nosql بشكل امن ؟

    1. قاسم باغر قال:

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

  6. ليلى خالد قال:

    يعطيك العافية شرح ممتاز استفدت جدا من هالشرح D=

  7. soufianeAb قال:

    يعطيك العافية
    مقال في قمة الروعة
    منتظرين بفارغ الصبر شرح mongoDB

  8. حنين قال:

    لو سمحت شو ممكن اعمل تطبيق عملي باستخدام no sql ويكون يصلح لمشروع التخرج

    1. قاسم باغر قال:

      السلام عليكم،
      معذرة على التاخر في الرد. لم يصلني اي تنبيه على وجود ردود في المدونة…
      التطبيقات التي من الممكن استخدام الـNOSQL بها، يفضل ان لا تعتدم على الكثير من الQuery.
      مثلا، تطبيق لاضافة المقالات والتعليقات بحيث يكون الغرض منه عرض واضافة المقالات بشكل سريع، دون الحاجه للاستعلام عن المستخدمين ومواضيعهم او المستخدمين النشطين و…. الخ.
      صعب اني احدد التطبيق لانهه من الممكن تطوير تطبيق باستخدام MySQL وانفس التطبيق باستخدام NOSQL، الفرق هو في المزايا التي ترغبي بها وبعدها يمكن تحديد ايهما افضل.

  9. وائل ماجد قال:

    جميل صدييقي قاسم

  10. Ahmed Hamdan قال:

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

أضف تعليقاً