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

يمكنك استخدام كل من "قاعدة بيانات Firebase Realtime" وCloud Firestore في تطبيقك، والاستفادة من مزايا كل حل قاعدة بيانات لتلبية احتياجاتك. على سبيل المثال، قد ترغب في الاستفادة من دعم قاعدة بيانات Realtime Database، كما هو موضح في Build Presence in Cloud Firestore.

تعرّف على المزيد من المعلومات حول الاختلافات بين قواعد البيانات.

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

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

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

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

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

  4. اجعل Cloud Firestore قاعدة البيانات الأساسية للبيانات التي يتم نقلها. بعد نقل بعض البيانات، يمكنك استخدام Cloud Firestore كقاعدة بيانات أساسية وتقليل استخدام "قاعدة البيانات في الوقت الفعلي" للبيانات التي تم نقلها. ضع في اعتبارك إصدارات تطبيقك التي لا تزال مرتبطة بقاعدة بيانات الوقت الفعلي لتلك البيانات وكيف تخطط لمواصلة دعمها.

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

تعيين البيانات

يتم هيكلة البيانات في قاعدة بيانات الوقت الفعلي كشجرة واحدة، بينما تدعم Cloud Firestore المزيد من التسلسلات الهرمية للبيانات الواضحة من خلال المستندات والمجموعات والمجموعات الفرعية. إذا نقلت بعض بياناتك من قاعدة بيانات الوقت الفعلي إلى Cloud Firestore، فقد ترغب في التفكير في بنية مختلفة لبياناتك.

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

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

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

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

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

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

// /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 من الحاجة إلى تكرار البيانات لأنماط الوصول الشائعة. على سبيل المثال، ضع في اعتبارك شاشة في تطبيق دليل المدينة تعرض جميع مدن العاصمة مرتبة حسب عدد السكان. في قاعدة بيانات الوقت الفعلي، تتمثل الطريقة الأكثر فعالية للقيام بذلك في الاحتفاظ بقائمة منفصلة للمدن التي تكرر البيانات من قائمة cities على النحو التالي:

{
   cities: {
    // ...
   },

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

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

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

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

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

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

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

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

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

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

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

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

  1. يمكنك تصدير بياناتك من قاعدة بيانات الوقت الفعلي أو استخدام نسخة احتياطية حديثة.
    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 عندما يكتب العميل إلى "قاعدة بيانات الوقت الفعلي". تأكَّد من أن Cloud Firestore تعطي الأولوية للبيانات الجديدة الواردة من Cloud Functions على أي عمليات كتابة تجريها من عملية نقل البيانات السابقة.

أنشئ دالة لكتابة بيانات جديدة أو متغيرة إلى Cloud Firestore في كل مرة يكتب فيها العميل البيانات إلى قاعدة بيانات الوقت الفعلي. تعرَّف على مزيد من المعلومات حول عوامل تشغيل قاعدة البيانات في الوقت الفعلي لـ Cloud Functions.

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

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

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

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