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

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

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

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

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

كيفية تجزئة بياناتك

لتجزئة بياناتك، اتّبِع الخطوات التالية (الموضّحة بتفصيل أكبر أدناه):

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

ربط بياناتك

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

  • لا يتم تشغيل كل طلب بحث إلا على مثيل قاعدة بيانات واحد. لا يتيح Realtime Database إجراء طلبات بحث على مستوى مثيلات قواعد البيانات.
  • لا تتم مشاركة البيانات أو تكرارها على مستوى مثيلات قواعد البيانات (أو تتم مشاركتها أو تكرارها بأقل قدر ممكن).
  • لا يتصل كل مثيل من التطبيق إلا بقاعدة بيانات واحدة في أيّ لحظة معيّنة.

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

إنشاء "تجزئة رئيسية"

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

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

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

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

يمكنك بعد ذلك إنشاء عدّة مثيلات لقواعد البيانات مسبقًا واستخدام رقم تعريف المؤسسة لربط فريق بمثيل قاعدة بياناته. على سبيل المثال، ترتبط المؤسسة "أ" بـ Realtime Database A.

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

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

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

إنشاء قاعدة بيانات في وحدة تحكّم Firebase باستخدام قائمة السياق في قسم قواعد البيانات

  1. في وحدة تحكّم Firebase، انتقِل إلى قواعد البيانات ومساحة التخزين > قاعدة بيانات الوقت الفعلي > علامة التبويب البيانات.

  2. اختَر إنشاء قاعدة بيانات جديدة من القائمة المنسدلة.

  3. خصِّص مرجع قاعدة البيانات و Security Rules، ثم انقر على حسنًا.

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

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

إدارة مثيلات محدّدة والتفاعل معها باستخدام واجهة سطر الأوامر

يمكنك إدارة مثيلات محدّدة من Realtime Database والتفاعل معها باستخدام Firebase CLI.

تتفاعل أوامر واجهة سطر الأوامر تلقائيًا مع مثيل قاعدة البيانات الافتراضي. ومع ذلك، يمكنك التفاعل مع مثيل قاعدة بيانات غير افتراضي باستخدام العلامة --instance DATABASE_NAME.

على سبيل المثال، استخدِم الأمر التالي لتشغيل أداة تحديد المشاكل لمثيل قاعدة بيانات باسم my-example-shard.firebaseio.com:

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

تتيح الأوامر التالية استخدام العلامة ‎--instance:

  • firebase database:get
  • firebase database:profile
  • firebase database:push
  • firebase database:remove
  • firebase database:set
  • firebase database:update

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

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

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

    1. في وحدة تحكّم Firebase، انتقِل إلى قواعد البيانات ومساحة التخزين > قاعدة بيانات الوقت الفعلي > علامة التبويب القواعد.

    2. اختَر قاعدة البيانات التي تريد تعديلها، ثم عدِّل القواعد.

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

    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 إلى إلغاء أي تعديلات أجريتها في وحدة تحكّم Firebase، ويؤدي تعديل القواعد مباشرةً في وحدة تحكّم Firebase إلى إلغاء أي تغييرات حديثة نشرتها من خلال 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 هذا على هدف App Clip.
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// Get a secondary database instance by 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];
// Get a secondary database instance by URL @property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] reference];

Kotlin

// 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 على قناة Slack أو على Stack Overflow.