أفضل طريقة لتحسين الأداء وتوسيع نطاق بياناتك في Firebase Realtime Database هي تقسيم بياناتك على عدّة مثيلات من Realtime Database، ويُعرف ذلك أيضًا باسم تجزئة قاعدة البيانات. تمنحك التجزئة المرونة اللازمة للتوسّع إلى ما بعد الـ حدود القصوى التي تنطبق على مثيلات قاعدة البيانات الفردية، بالإضافة إلى موازنة التحميل وتحسين الأداء.
متى يجب تجزئة بياناتك؟
قد تحتاج إلى تجزئة بياناتك على عدّة قواعد بيانات إذا كنت تستخدم Realtime Database وتندرج ضمن أيّ من السيناريوهات التالية:
- أردت التوسّع إلى ما بعد الحدّ الأقصى المسموح به وهو 200,000 اتصال متزامن أو 1,000 عملية كتابة في الثانية أو أيّ من الحدود القصوى الأخرى لمثيل قاعدة بيانات واحد.
- كانت لديك عدّة مجموعات بيانات منفصلة وأردت تحسين الأداء (على سبيل المثال، تطبيق محادثة يقدّم الخدمة لمجموعات منفصلة ومستقلة من المستخدمين).
- أردت موازنة التحميل على عدّة قواعد بيانات لتحسين وقت التشغيل وتقليل خطر التحميل الزائد على مثيل قاعدة بيانات واحد.
كيفية تجزئة بياناتك
لتجزئة بياناتك، اتّبِع الخطوات التالية (الموضّحة بتفصيل أكبر أدناه):
- اربط بياناتك بعدّة قواعد بيانات وفقًا لاحتياجات تطبيقك المحدّدة.
- أنشئ عدّة مثيلات من قاعدة البيانات.
- اضبط تطبيقك بحيث يتصل بمثيل Realtime Database اللازم لكل مجموعة بيانات.
ربط بياناتك
عند ربط بياناتك بعدّة قواعد بيانات، حاوِل استيفاء الشروط التالية:
- لا يتم تشغيل كل طلب بحث إلا على مثيل قاعدة بيانات واحد. Realtime Database لا يتيح إجراء طلبات بحث على عدّة مثيلات من قاعدة البيانات.
- لا تتم مشاركة البيانات أو تكرارها على عدّة مثيلات من قاعدة البيانات (أو تتم مشاركتها أو تكرارها بأقل قدر ممكن).
- لا يتصل كل مثيل من التطبيق إلا بقاعدة بيانات واحدة في أيّ لحظة معيّنة.
أثناء ربط بياناتك، ننصحك بتطبيق الاستراتيجيات التالية:
إنشاء "تجزئة رئيسية"
خزِّن خريطة لكيفية تخزين بياناتك على عدّة مثيلات من قاعدة البيانات. بهذه الطريقة، يمكنك البحث برمجيًا عن مثيل قاعدة البيانات الذي يتطابق مع العميل المتصل. ضَع في اعتبارك أنّ ذلك قد يؤدي إلى زيادة النفقات العامة مقارنةً بالاتصال مباشرةً بمثيل قاعدة البيانات المحدّد الذي تحتاجه، عندما تحتاج إليه.
تجميع البيانات حسب الفئات أو حسب العميل
خزِّن البيانات في مثيلات منفصلة من قاعدة البيانات، مجمّعة حسب المستخدم أو نوع البيانات. على سبيل المثال، إذا أنشأت تطبيق محادثة يقدّم الخدمة لعدّة مؤسسات، يمكنك إنشاء مثيل قاعدة بيانات لكل مؤسسة وتخزين كل بيانات المحادثة في مثيلات فريدة من قاعدة البيانات.
في هذه الحالة، لا تشارك المؤسسة "أ" والمؤسسة "ب" البيانات، ولا تتضمّن قواعد بياناتك أي بيانات مكرّرة، ولا تُجري طلبات بحث إلا على مثيل قاعدة بيانات واحد. بالإضافة إلى ذلك، لا يتصل المستخدمون في كل مؤسسة إلا بقاعدة بيانات مؤسستهم عند استخدام تطبيق المحادثة.
يمكنك بعد ذلك إنشاء عدّة مثيلات من قاعدة البيانات مسبقًا واستخدام رقم تعريف المؤسسة لربط فريق بمثيل قاعدة البيانات الخاص به. على سبيل المثال، ترتبط المؤسسة "أ" بـ قاعدة بيانات الوقت الفعلي A.
تعتمد طريقة ربط البيانات بتطبيقك على حالة الاستخدام المحدّدة، ولكن يمكن أن تساعدك الشروط والاستراتيجيات الموضّحة أعلاه في تحديد ما يناسب بياناتك.
إنشاء عدّة مثيلات من Realtime Database
إذا كنت تستخدم خطة Blaze، يمكنك إنشاء ما يصل إلى 1,000 مثيل من قاعدة البيانات في مشروع Firebase نفسه.

في وحدة تحكّم Firebase، انتقِل إلى قواعد البيانات ومساحة التخزين > قاعدة بيانات الوقت الفعلي > علامة التبويب البيانات.
اختَر إنشاء قاعدة بيانات جديدة من القائمة المنسدلة.
خصِّص مرجع قاعدة البيانات و Security Rules، ثم انقر على حسنًا.
كرِّر العملية لإنشاء العدد الذي تحتاجه من مثيلات قاعدة البيانات. لكل مثيل من قاعدة البيانات مجموعة Firebase Realtime Database Security Rules الخاصة به، لذا يمكنك ضبط إذن الوصول إلى بياناتك بدقة.
يمكنك إنشاء مثيلات قاعدة البيانات وإدارتها في الـ Firebase أو باستخدام الـ Realtime Database Management REST API.
إدارة مثيلات محدّدة والتفاعل معها باستخدام واجهة سطر الأوامر
يمكنك إدارة مثيلات محدّدة من Realtime Database والتفاعل معها باستخدام واجهة سطر الأوامر في Firebase.
تتفاعل أوامر واجهة سطر الأوامر تلقائيًا مع مثيل قاعدة البيانات الافتراضي. ومع ذلك، يمكنك التفاعل مع مثيل قاعدة بيانات غير افتراضي
باستخدام العلامة
--instance DATABASE_NAME
على سبيل المثال، استخدِم الأمر التالي لتشغيل أداة تحديد المشاكل لمثيل قاعدة بيانات باسم my-example-shard.firebaseio.com:
firebase database:profile --instance "my-example-shard"
تتيح الأوامر التالية استخدام العلامة --instance:
firebase database:getfirebase database:profilefirebase database:pushfirebase database:removefirebase database:setfirebase database:update
تعديل Realtime Database Security Rules ونشرها لكل مثيل
تأكَّد من أنّ Realtime Database Security Rules تسمح بالوصول المناسب إلى كل مثيل من قاعدة البيانات في مشروعك. لكل قاعدة بيانات مجموعة القواعد الخاصة بها، والتي يمكنك تعديلها ونشرها من وحدة تحكّم Firebaseأو باستخدام واجهة سطر الأوامر في Firebase لنشر الأهداف.
لتعديل القواعد ونشرها من وحدة تحكّم Firebase، اتّبِع الخطوات التالية:
في وحدة تحكّم Firebase، انتقِل إلى قواعد البيانات ومساحة التخزين > قاعدة بيانات الوقت الفعلي > علامة التبويب القواعد.
اختَر قاعدة البيانات التي تريد تعديلها، ثم عدِّل القواعد.
لتعديل القواعد ونشرها من واجهة سطر الأوامر Firebase، اتّبِع الخطوات التالية:
عدِّل القواعد في ملفات القواعد لمثيلات قاعدة البيانات (على سبيل المثال،
foo.rules.json).أنشئ أهداف نشر وطبِّقها لربط قواعد البيانات التي تستخدم ملف القواعد نفسه. على سبيل المثال:
firebase target:apply database main my-db-1 my-db-2
firebase target:apply database other my-other-db-3
عدِّل ملف الإعدادات
firebase.jsonباستخدام أهداف النشر:{ "database": [ {"target": "main", "rules": "foo.rules.json"}, {"target": "other", "rules": "bar.rules.json"} ] }نفِّذ أمر النشر:
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
// Get the default database instance for an appvar ref: DatabaseReference! ref = Database.database().reference()
Objective-C
// Get the default database instance for an app@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] 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.