استخدام 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. تعالج واجهة برمجة التطبيقات Authentication عملية مصادقة المستخدمين لكلتا قاعدتَي البيانات، لذا لا تحتاج إلى تغيير عملية تنفيذ واجهة برمجة التطبيقات Authentication عند بدء استخدام 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. انتقِل إلى القسم Realtime Database في وحدة تحكّم 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" أو "إدارة الهوية وإمكانية الوصول".