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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

إنشاء مثيلات قاعدة بيانات في الوقت الفعلي متعددة

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

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

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

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

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

تعديل "قواعد أمان قاعدة البيانات في الوقت الفعلي" ونشرها لكل مثيل

تأكد من أن "قواعد أمان قاعدة البيانات في الوقت الفعلي" تسمح بالوصول المناسب لكل مثيل قاعدة بيانات في مشروعك. لكل قاعدة بيانات مجموعة قواعد خاصة بها يمكنك تعديلها ونشرها من وحدة تحكُّم 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 modular API

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);

واجهة برمجة التطبيقات لمساحة الاسم على الويب

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()
// الحصول على مثيل قاعدة بيانات ثانوية عن طريق 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 في الوقت الفعلي التي تريد تطبيق أمر Firebase CLI عليها. على سبيل المثال، استخدِم الأمر التالي لتشغيل المحلّل لمثيل قاعدة بيانات باسم my-example-shard.firebaseio.com:

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

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

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

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

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