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

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

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

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

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

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

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

  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 تلغي أي تعديلات أجريتها في وحدة تحكّم 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()
// الحصول على مثيل قاعدة بيانات ثانوية بواسطة عنوان 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 = [[FIRDatabaseDatabaseWithURL:@"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.