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

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

الحالات التي يجب فيها تقسيم بياناتك

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

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

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

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

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

ربط بياناتك

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

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

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

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

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

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

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

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

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

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

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

إذا كنت تستخدم خطة أسعار "الفئة المَرِنة"، يمكنك إنشاء ما يصل إلى 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 CLI لنشر الاستهدافات.

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

    1. انتقِل إلى علامة التبويب القواعد في قسم تطوير > قاعدة البيانات.
    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 إلى تجاهل أي تعديلات أجريتها في وحدة تحكّم Firebase، كما أنّ تعديل القواعد مباشرةً في وحدة تحكّم Firebase يؤدي إلى تجاهل أي تغييرات حديثة نشرتها من خلال واجهة سطر الأوامر Firebase.

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

استخدِم مرجع قاعدة البيانات للوصول إلى البيانات المخزّنة في مثيلات قاعدة البيانات الثانوية. يمكنك الحصول على مرجع لمثيل قاعدة بيانات معيّن من خلال عنوان 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 هذا على هدف "مقتطف التطبيق".
// 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 هذا على هدف "مقتطف التطبيق".
// 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

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

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

تحسين عمليات الربط في كل قاعدة بيانات

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

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

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