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