استخدام 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 للبيانات التي تم نقلها. ضَع في اعتبارك إصدارات تطبيقك التي لا تزال مرتبطة بـ 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. انتقِل إلى قسم Realtime Database في وحدة تحكّم Firebase.
    2. من علامة التبويب البيانات، اختَر عقدة المستوى الجذر لقاعدة البيانات، ثم اختَر تصدير JSON من القائمة.
  2. أنشئ قاعدة البيانات الجديدة في Cloud Firestore وأضِف بياناتك.

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

    • اكتب نصًا برمجيًا مخصّصًا ينقل بياناتك نيابةً عنك. لا يمكننا تقديم نموذج لهذا النص البرمجي لأنّ كل قاعدة بيانات لها احتياجات فريدة، ولكن يمكن للخبراء على قناة Slack أو Stack Overflow مراجعة النص البرمجي أو تقديم نصائح لحالتك المحدّدة.Cloud Firestore
    • استخدِم حِزم تطوير البرامج (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).