التوسُّع باستخدام قواعد البيانات المتعددة

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

متى يتم تجزئة بياناتك

قد تحتاج إلى تقسيم بياناتك على قواعد بيانات متعددة إذا كنت تستخدم Realtime Database وتتوافق مع أيّ من السيناريوهات التالية:

  • إذا كنت تريد زيادة عدد عمليات الربط المتزامنة إلى أكثر من 200,000 عملية، أو زيادة عدد عمليات الكتابة إلى 1,000 عملية في الثانية، أو زيادة أي من الحدود الأخرى لمثيل قاعدة بيانات واحد
  • لديك مجموعات بيانات منفصلة متعددة وتريد تحسين الأداء (على سبيل المثال، تطبيق محادثة يوفّر مجموعات منفصلة ومستقلة من المستخدمين)
  • لنفترض أنك تريد موازنة الحمل عبر قواعد بيانات متعددة لتحسين وقت التشغيل تقليل مخاطر التحميل الزائد لمثيل قاعدة بيانات واحد.

كيفية تقسيم بياناتك

لتقسيم بياناتك، اتبع الخطوات التالية (الموضحة بمزيد من التفصيل أدناه):

  1. يمكنك ربط بياناتك بقواعد بيانات متعددة وفقًا لاحتياجات تطبيقك المحدّدة.
  2. أنشئ عدّة نُسخ من قاعدة البيانات.
  3. اضبط تطبيقك ليتصل بمثيل Realtime Database اللازم. لكل مجموعة بيانات.

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

عند ربط بياناتك بقواعد بيانات متعددة، حاوِل استيفاء الشروط التالية:

  • لا يتم تنفيذ كل طلب بحث إلا على مثيل قاعدة بيانات واحد. لا تتيح ميزة "Realtime Database" استخدام الطلبات على مستوى مثيلات قاعدة البيانات.
  • عدم مشاركة البيانات أو تكرارها عبر مثيلات قاعدة البيانات (أو الحد الأدنى من المشاركة أو التكرار).
  • لا يتصل كل مثيل من التطبيق إلا بقاعدة بيانات واحدة في أي وقت.

أثناء تخطيط بياناتك، ننصحك بتطبيق الاستراتيجيات التالية:

إنشاء "شريحة رئيسية"

تخزين خريطة لكيفية تخزين بياناتك عبر لمثيلات قاعدة البيانات. بهذه الطريقة، يمكنك البحث آليًا عن مثيل قاعدة بيانات الذي يتوافق مع العميل المتصل. يُرجى العِلم أنّ هذا الإجراء قد يؤدي إلى استخدام موارد إضافية أكثر من الاتصال مباشرةً بمثيل قاعدة البيانات المعنيّ عند الحاجة إليه.

تجميع البيانات حسب الفئات أو حسب العميل

تخزين البيانات في نُسخ قاعدة بيانات معزولة، مجمّعة حسب المستخدم أو نوع البيانات على سبيل المثال، إذا أنشأت تطبيق محادثات يخدم مؤسسات متعددة، يمكنك إنشاء مثيل قاعدة بيانات لكل مؤسسة وتخزين كل بيانات المحادثات في مثيلات قاعدة بيانات فريدة.

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

يمكنك بعد ذلك إنشاء عدة نُسخ من قاعدة البيانات مسبقًا واستخدام رقم تعريف المؤسسة لربط فريق بنُسخة قاعدة البيانات. على سبيل المثال: تربط المؤسسة A بقاعدة البيانات في الوقت الفعلي A.

تعتمد طريقة تعيين بيانات تطبيقك على حالة الاستخدام المحددة، ولكن الشروط والاستراتيجيات الموضحة أعلاه يمكن أن تساعدك في تحديد ما يناسب البيانات.

إنشاء عدة مثيلات "Realtime Database"

إذا كنت تستخدم خطة أسعار Blaze، يمكنك إنشاء ما يصل إلى 1,000 مثيل قاعدة بيانات في مشروع Firebase نفسه.

إنشاء قاعدة بيانات في <span class=وحدة تحكُّم Firebase مع قائمة السياقات في قسم قواعد البيانات" />

  1. في وحدة تحكُّم Firebase، انتقِل إلى علامة التبويب البيانات في التطوير > قاعدة البيانات .
  2. اختَر إنشاء قاعدة بيانات جديدة من القائمة في قسم Realtime Database.
  3. خصِّص مرجع قاعدة البيانات و قواعد الأمان، ثم انقر على حسنًا .

كرر العملية لإنشاء أي عدد تريده من مثيلات قاعدة البيانات. تحتوي كل مثيل قاعدة بيانات على مجموعة خاصة به من Firebase Realtime Database Security Rules، حتى تتمكّن من تحسين إمكانية الوصول إلى بياناتك.

يمكنك إنشاء نُسخ قاعدة بيانات وإدارتها في وحدة تحكُّم Firebase أو باستخدام Realtime Database Management REST API.

تعديل Realtime Database Security Rules ونشره لكل مثيل

تأكَّد من أنّ Realtime Database Security Rules يسمح بالوصول المناسب إلى كل مثيل قاعدة بيانات في مشروعك. لكل قاعدة بيانات مجموعة من القواعد الخاصة بها، يمكنك تعديله ونشره من وحدة تحكُّم Firebase، أو باستخدام واجهة سطر الأوامر Firebase لنشر الأهداف.

  • لتعديل القواعد ونشرها من وحدة تحكّم Firebase، اتّبِع الخطوات التالية:

    1. الانتقال إلى قسم علامة التبويب القواعد في التطوير > قاعدة البيانات.
    2. اختَر قاعدة البيانات التي تريد تعديلها، ثم عدِّل القواعد.
  • لتعديل القواعد ونشرها من واجهة سطر الأوامر Firebase، اتّبِع الخطوات التالية:

    1. عدِّل القواعد في ملفات القواعد لمثيلات قاعدة البيانات (على سبيل المثال، foo.rules.json).
    2. أنشئ استهدافات النشر وطبِّقها لربط قواعد البيانات التي تستخدم ملف القواعد نفسه. مثل:
      firebase target:apply database main my-db-1 my-db-2
      firebase target:apply database other my-other-db-3
    3. عدِّل ملف إعدادات firebase.json باستخدام استهدافات النشر:

      {
        "database": [
          {"target": "main", "rules": "foo.rules.json"},
          {"target": "other", "rules": "bar.rules.json"}
        ]
      }
      
    4. شغّل أمر التفعيل:

      firebase deploy

احرص على تعديل القواعد ونشرها باستمرار من المكان نفسه. يؤدي نشر القواعد من واجهة برمجة التطبيقات Firebase CLI إلى إلغاء أي تعديلات أجريتها فيconsole Firebase، كما يؤدي تعديل القواعد مباشرةً فيconsoleFirebase إلى إلغاء أي تغييرات حديثة أجريتها من خلال واجهة برمجة التطبيقات Firebase CLI.

ربط تطبيقك بمثيلات قاعدة بيانات متعددة

استخدِم مرجع قاعدة البيانات للوصول إلى البيانات المخزّنة في نُسخ قاعدة البيانات الثانوية. يمكنك الحصول على مرجع لنسخة قاعدة بيانات معيّنة من خلال عنوان URL أو التطبيق. إذا لم تحدِّد عنوان URL، ستحصل على مرجع لنسخة قاعدة بيانات التطبيق التلقائية.

Web

import { initializeApp } from "firebase/app";
import { getDatabase } from "firebase/database";

const app1 = initializeApp({
  databaseURL: "https://testapp-1234-1.firebaseio.com"
});

const app2 = initializeApp({
  databaseURL: "https://testapp-1234-2.firebaseio.com"
}, 'app2');

// Get the default database instance for an app1
const database1 = getDatabase(app1);

// Get a database instance for app2
const database2 = getDatabase(app2);

Web

const app1 = firebase.initializeApp({
  databaseURL: "https://testapp-1234-1.firebaseio.com"
});

const app2 = firebase.initializeApp({
  databaseURL: "https://testapp-1234-2.firebaseio.com"
}, 'app2');

// Get the default database instance for an app1
var database1 = firebase.database();

// Get a database instance for app2
var database2 = firebase.database(app2);
Swift
ملاحظة: لا يتوفّر منتج Firebase هذا في استهداف تطبيق Clip.
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// الحصول على مثيل قاعدة بيانات ثانوي باستخدام عنوان URL var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Objective-C
ملاحظة: لا يتوفّر منتج Firebase هذا في هدف App Clip.
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// الحصول على مثيل قاعدة بيانات ثانوية حسب عنوان URL @property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] reference];

Kotlin+KTX

// Get the default database instance for an app
val primary = Firebase.database.reference

// Get a secondary database instance by URL
val secondary = Firebase.database("https://testapp-1234.firebaseio.com").reference

Java

// Get the default database instance for an app
DatabaseReference primary = FirebaseDatabase.getInstance()
        .getReference();

// Get a secondary database instance by URL
DatabaseReference secondary = FirebaseDatabase.getInstance("https://testapp-1234.firebaseio.com")
        .getReference();

تحديد مثيل عند استخدام واجهة سطر أوامر Firebase

استخدِم الخيار --instance لتحديد Firebase Realtime Database الذي تريد تطبيق أمر واجهة سطر الأوامر في Firebase عليه. على سبيل المثال، استخدِم الأمر التالي لتشغيل أداة تحليل الأداء لمثيل قاعدة بيانات باسم my-example-shard.firebaseio.com:

firebase database:profile --instance "my-example-shard"

تحسين الاتصالات في كل قاعدة بيانات

إذا احتاج كل عميل إلى الاتصال بقواعد بيانات متعددة أثناء جلسة، فيمكنك تقليل عدد الاتصالات المتزامنة لكل مثيل من مثيل قاعدة البيانات عن طريق بالاتصال بكل مثيل في قاعدة بيانات للمدة اللازمة فقط.

الحصول على مزيد من النصائح

إذا كنت بحاجة إلى مزيد من المساعدة في تقسيم بياناتك على مستوى عدّة نُسخ من قاعدة البيانات، يمكنك التواصل مع خبراء Firebase على قناة Slack أو على Stack Overflow.