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

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

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

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

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

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

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

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

ربط بياناتكم

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

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

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

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

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

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

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

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

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

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

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

إذا كنتم تستخدمون خطة Blaze، يمكنكم إنشاء ما يصل إلى 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.