استخدام Cloud Firestore مع "قاعدة بيانات Firebase في الوقت الفعلي"

يمكنك استخدام كل من Firebase Realtime Database وCloud Firestore في تطبيقك، والاستفادة من مزايا كل حل من حلول قواعد البيانات لتلبية احتياجاتك. على سبيل المثال، قد تحتاج إلى الاستفادة من دعم Realtime Database للحضور، كما هو موضّح في إنشاء حضور في Cloud Firestore.

مزيد من المعلومات عن الاختلافات بين قواعد البيانات

جارٍ نقل البيانات إلى Cloud Firestore

إذا قرّرت نقل بعض بياناتك من Realtime Database إلى Cloud Firestore، يُرجى مراعاة المسار التالي. بما أنّ كل قاعدة بيانات لها احتياجات واعتبارات هيكلية فريدة، لا يتوفّر مسار نقل آلي. بدلاً من ذلك، يمكنك اتباع هذا التقدم العام:

  1. عيِّن بنية البيانات وقواعد الأمان من Realtime Database إلى Cloud Firestore. تعتمد كل من Realtime Database وCloud Firestore على مصادقة Firebase، لذا لا تحتاج إلى تغيير مصادقة المستخدم لتطبيقك. ومع ذلك، تختلف قواعد الأمان ونموذج البيانات ومن المهم مراعاة هذه الاختلافات بعناية قبل البدء في نقل البيانات إلى Cloud Firestore.

  2. نقل البيانات السابقة: أثناء إعداد بنية البيانات الجديدة في Cloud Firestore، يمكنك ربط البيانات الحالية ونقلها من Realtime Database إلى مثيل Cloud Firestore الجديد. ومع ذلك، إذا كنت تستخدم كلتا قاعدتَي البيانات في تطبيقك، فلن تحتاج إلى نقل البيانات السابقة من Realtime Database.

  3. نسخ البيانات الجديدة إلى Firestore في الوقت الفعلي استخدِم Cloud Functions لكتابة بيانات جديدة في قاعدة بيانات Cloud Firestore الجديدة عند إضافتها إلى Realtime Database.

  4. اجعل Cloud Firestore قاعدة البيانات الأساسية للبيانات المنقولة. بعد نقل بعض بياناتك، استخدِم Cloud Firestore كقاعدة بيانات أساسية وقلِّل استخدامك لـ Realtime Database للبيانات التي تم نقلها. يُرجى مراعاة إصدارات تطبيقك التي لا تزال مرتبطة بـ Realtime Database للحصول على هذه البيانات وكيفية مواصلة إتاحتها.

تأكَّد من احتساب تكاليف الفوترة لكل من Realtime Database وCloud Firestore.

تعيين بياناتك

يتم تنظيم البيانات في Realtime Database على شكل شجرة واحدة، بينما تتيح Cloud Firestore استخدام تسلسلات هرمية أكثر وضوحًا للبيانات من خلال المستندات والمجموعات والمجموعات الفرعية. إذا نقلت بعض بياناتك من Realtime Database إلى Cloud Firestore، قد تحتاج إلى استخدام بنية مختلفة لبياناتك.

الاختلافات الرئيسية التي يجب مراعاتها

إذا نقلت البيانات من شجرة Realtime Database الحالية إلى مستندات ومجموعات Cloud Firestore، تذكَّر الاختلافات الرئيسية التالية بين قواعد البيانات التي قد تؤثر في كيفية تنظيم البيانات في Cloud Firestore:

  • توفّر طلبات البحث السطحية مرونة أكبر في هياكل البيانات الهرمية.
  • توفّر طلبات البحث المعقّدة دقة أكبر وتقلّل من الحاجة إلى تكرار البيانات.
  • توفّر مؤشرات طلب البحث تقسيمًا أكثر فعالية للنتائج على عدة صفحات.
  • لم تعُد المعاملات تتطلّب جذرًا مشتركًا لجميع بياناتك، وأصبحت أكثر كفاءة.
  • تختلف تكاليف الفوترة بين "Realtime Database" و"Cloud Firestore". في كثير من الحالات، قد يكون Cloud Firestore أكثر تكلفة من Realtime Database، خاصةً إذا كنت تعتمد على العديد من العمليات الصغيرة. ننصحك بتقليل عدد العمليات في قاعدة البيانات وتجنُّب عمليات الكتابة غير الضرورية. مزيد من المعلومات حول الاختلافات في الفوترة بين Realtime Database وCloud Firestore

أفضل الممارسات في العمل

يعكس المثال التالي بعض الاعتبارات التي قد تضعها في الاعتبار أثناء نقل بياناتك بين قواعد البيانات. يمكنك الاستفادة من عمليات القراءة السطحية وإمكانات الاستعلام المحسّنة للحصول على هياكل بيانات أكثر طبيعية من تلك التي ربما استخدمتها مع Realtime Database.

لنفترض أنّ لديك تطبيق دليل سياحي يساعد المستخدمين في العثور على معالم بارزة في مدن حول العالم. بما أنّ Realtime Database لا تتضمّن عمليات قراءة سطحية، قد تضطر إلى تنظيم البيانات في عقدتَين من المستوى الأعلى، على النحو التالي:

// /cities/$CITY_KEY
{
  name: "New York",
  population: 8000000,
  capital: False
}

// /city-landmark/$CITY_KEY/$LANDMARK_KEY
{
  name: "Empire State Building",
  category: "Architecture"
}

تتضمّن Cloud Firestore عمليات قراءة سطحية، لذا فإنّ طلب المستندات في مجموعة لا يسحب البيانات من المجموعات الفرعية. وبالتالي، يمكنك تخزين معلومات المعالم في مجموعة فرعية:

// /cities/$CITY_ID
{
  name: "New York",
  population: 8000000,
  capital: False,
  landmarks: [... subcollection ...]
}

الحد الأقصى لحجم المستندات هو 1 ميغابايت، وهذا سبب آخر لتخزين المعالم كمجموعة فرعية، مع الحفاظ على حجم مستند كل مدينة صغيرًا، بدلاً من تضخيم المستندات بالقوائم المتداخلة.

تحدّ إمكانات طلب البحث المتقدّمة في "Cloud Firestore" من الحاجة إلى تكرار البيانات لأنماط الوصول الشائعة. على سبيل المثال، ضع في اعتبارك شاشة في تطبيق دليل المدينة تعرض جميع العواصم مرتبة حسب عدد السكان. في Realtime Database، الطريقة الأكثر فعالية لإجراء ذلك هي الاحتفاظ بقائمة منفصلة للعواصم تكرّر البيانات من قائمة cities، على النحو التالي:

{
   cities: {
    // ...
   },

   capital-cities: {
     // ...
   }
}

في Cloud Firestore، يمكنك التعبير عن قائمة بالعواصم حسب عدد السكان في طلب بحث واحد:

db.collection('cities')
    .where('capital', '==', true)
    .orderBy('population')

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

تأمين بياناتك

سواء كنت تستخدم Cloud Firestore Security Rules لعملاء Android أو Apple أو الويب، أو إدارة الهوية وإمكانية الوصول (IAM) للخوادم، تأكَّد من تأمين بياناتك في Cloud Firestore وRealtime Database. تتم معالجة مصادقة المستخدم من خلال خدمة "المصادقة" لكلتا قاعدتَي البيانات، لذلك لا تحتاج إلى تغيير طريقة تنفيذ خدمة "المصادقة" عند بدء استخدام Cloud Firestore.

الاختلافات الرئيسية التي يجب مراعاتها

  • تستخدم حِزم تطوير البرامج (SDK) للأجهزة الجوّالة والويب Cloud Firestore Security Rules، بينما تستخدم حِزم تطوير البرامج (SDK) للخوادم "إدارة الهوية وإمكانية الوصول" (IAM) لتأمين البيانات.
  • لا يتم تطبيق Cloud Firestore Security Rules بشكل متسلسل ما لم تستخدم حرف بدل. ولا تكتسب المستندات والمجموعات القواعد بأي شكل آخر.
  • لم يعُد عليك التحقّق من صحة البيانات بشكل منفصل (كما فعلت في Realtime Database).
  • يتحقّق Cloud Firestore من القواعد قبل تنفيذ طلب بحث للتأكّد من أنّ المستخدم لديه إذن الوصول المناسب إلى جميع البيانات التي يعرضها طلب البحث.

نقل البيانات السابقة إلى Cloud Firestore

بعد ربط بياناتك وبُنى الأمان بنماذج البيانات والأمان في Cloud Firestore، يمكنك البدء في إضافة بياناتك. إذا كنت تخطّط للاستعلام عن البيانات السابقة بعد نقل تطبيقك من Realtime Database إلى Cloud Firestore، أضِف عملية تصدير لبياناتك القديمة إلى قاعدة بيانات Cloud Firestore الجديدة. إذا كنت تخطّط لاستخدام كل من Realtime Database وCloud Firestore في تطبيقك، يمكنك تخطّي هذه الخطوة.

لتجنُّب استبدال البيانات الجديدة ببيانات قديمة، ننصحك بإضافة بياناتك السابقة أولاً. إذا أضفت بيانات جديدة إلى كلتا قاعدتَي البيانات في الوقت نفسه، كما هو موضّح في الخطوة التالية، احرص على منح الأولوية للبيانات الجديدة التي تمت إضافتها إلى Cloud Firestore من قِبل Cloud Functions.

لنقل البيانات السابقة إلى Cloud Firestore، اتّبِع الخطوات التالية:

  1. يمكنك تصدير بياناتك من "Realtime Database" أو استخدام نسخة احتياطية حديثة.
    1. في وحدة تحكُّم Firebase، انتقِل إلى قواعد البيانات ومساحة التخزين > قاعدة بيانات الوقت الفعلي.
    2. في علامة التبويب البيانات، اختَر العقدة على مستوى الجذر لقاعدة البيانات واختَر تصدير JSON من القائمة.
  2. أنشئ قاعدة بياناتك الجديدة في Cloud Firestore وأضِف بياناتك.

    ننصحك باتّباع الاستراتيجيات التالية عند نقل بعض بياناتك إلى Cloud Firestore:

    • كتابة نص برمجي مخصّص ينقل بياناتك نيابةً عنك على الرغم من أنّه لا يمكننا تقديم نموذج لهذا النص البرمجي لأنّ كل قاعدة بيانات لها احتياجات فريدة، يمكن لخبراء Cloud Firestore على قناة Slack أو على Stack Overflow مراجعة النص البرمجي أو تقديم المشورة لحالتك المحدّدة.
    • استخدِم حِزم تطوير البرامج (SDK) للخادم (Node.js أو Java أو Python أو Go) لكتابة البيانات مباشرةً إلى Cloud Firestore. للحصول على تعليمات حول إعداد حِزم تطوير البرامج (SDK) للخادم، يُرجى الاطّلاع على البدء.
    • لتسريع عمليات نقل البيانات الكبيرة، استخدِم عمليات الكتابة المجمّعة وأرسِل ما يصل إلى 500 عملية في طلب شبكة واحد.
    • للبقاء ضمن حدود معدّل "Cloud Firestore"، يجب حصر العمليات بـ 500 عملية كتابة في الثانية لكل مجموعة.

إضافة بيانات جديدة إلى Cloud Firestore

للحفاظ على التكافؤ بين قواعد البيانات الخاصة بك، أضف بيانات جديدة إلى كلتا قاعدتي البيانات في الوقت الفعلي. استخدِم Cloud Functions لتشغيل عملية كتابة في Cloud Firestore كلما كتب عميل في Realtime Database. تأكَّد من أنّ Cloud Firestore يعطي الأولوية للبيانات الجديدة الواردة من Cloud Functions على أي عمليات كتابة تجريها من نقل البيانات السابقة.

أنشئ دالة لكتابة بيانات جديدة أو متغيّرة في Cloud Firestore في كل مرة يكتب فيها العميل بيانات في Realtime Database. مزيد من المعلومات حول عوامل تشغيل Realtime Database في Cloud Functions

جعل Cloud Firestore قاعدة البيانات الأساسية للبيانات المنقولة

إذا قررت استخدام Cloud Firestore كقاعدة بيانات أساسية لبعض بياناتك، تأكَّد من مراعاة أي وظائف لنسخ البيانات أعددتها والتحقّق من صحة Cloud Firestore Security Rules.

  1. إذا كنت تستخدم Cloud Functions للحفاظ على التكافؤ بين قواعد بياناتك، تأكَّد من عدم تكرار عمليات الكتابة في كلتا قاعدتَي البيانات في حلقة. يمكنك تبديل الدالة للكتابة في قاعدة بيانات واحدة، أو إزالة الدالة بالكامل والبدء في إلغاء وظيفة الكتابة للبيانات التي تم نقلها في التطبيقات التي لا تزال مرتبطة بـ Realtime Database. وتعتمد كيفية التعامل مع هذا الأمر في تطبيقك على احتياجاتك المحدّدة والمستخدمين.

  2. تأكَّد من أنّ بياناتك محمية بشكل صحيح. التحقّق من صحة إعدادات Cloud Firestore Security Rules أو "إدارة الهوية وإمكانية الوصول"