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

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

وقت تقسيم بياناتك

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

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

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

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

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

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

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

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

عند تخطيط بياناتك، ننصحك بتطبيق الاستراتيجيات التالية:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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