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

في وحدة تحكّم Firebase، انتقِل إلى قواعد البيانات ومساحة التخزين > قاعدة بيانات الوقت الفعلي > علامة التبويب البيانات.
اختَر إنشاء قاعدة بيانات جديدة من القائمة المنسدلة.
خصِّص مرجع قاعدة البيانات وSecurity Rules، ثم انقر على حسنًا.
كرِّر العملية لإنشاء العدد الذي تريده من نُسخ قاعدة البيانات. لكل مثيل قاعدة بيانات مجموعة خاصة من Firebase Realtime Database Security Rules، ما يتيح لك ضبط إمكانية الوصول إلى بياناتك بدقة.
يمكنك إنشاء مثيلات قاعدة البيانات وإدارتها في وحدة تحكّم "Firebase" أو باستخدام واجهة برمجة التطبيقات REST لإدارة Realtime Database.
إدارة مثيلات معيّنة والتفاعل معها باستخدام واجهة سطر الأوامر
يمكنك إدارة مثيلات Realtime Database معيّنة والتفاعل معها باستخدام واجهة سطر الأوامر (CLI) في 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.