إنّ أفضل طريقة لتحسين الأداء وتوسيع نطاق بياناتك في Firebase Realtime Database هي تقسيم بياناتك على مثيلات متعددة من Realtime Database، ما يُعرف أيضًا باسم تقسيم قاعدة البيانات. تمنحك ميزة التجزئة المرونة في التوسّع إلى ما بعد الحدود التي تنطبق على مثيلات قاعدة بيانات فردية، بالإضافة إلى موازنة الحمل وتحسين الأداء.
حالات تقسيم البيانات
قد تحتاج إلى تقسيم بياناتك على قواعد بيانات متعددة إذا كنت تستخدم Realtime Database وتتوافق مع أيّ من السيناريوهات التالية:
- إذا كنت تريد زيادة عدد عمليات الربط المتزامنة إلى أكثر من 200,000 عملية، أو زيادة عدد عمليات الكتابة إلى 1,000 عملية في الثانية، أو زيادة أي من الحدود الأخرى لمثيل قاعدة بيانات واحد
- إذا كانت لديك مجموعات بيانات متعددة ومتفرقة وتريد تحسين الأداء (على سبيل المثال، تطبيق محادثات يعرض مجموعات منفصلة ومستقلّة من المستخدمين)
- إذا كنت تريد موازنة الحمل على مستوى قواعد بيانات متعددة لتحسين وقت التشغيل و تقليل خطر زيادة الحمل على مثيل قاعدة بيانات واحد
كيفية تقسيم بياناتك
لتقسيم بياناتك، اتّبِع الخطوات التالية (الموضّحة بالتفصيل أدناه):
- يمكنك ربط بياناتك بقواعد بيانات متعددة وفقًا لاحتياجات تطبيقك المحدّدة.
- أنشئ عدّة نُسخ من قاعدة البيانات.
- اضبط تطبيقك ليتصل بمثيل Realtime Database اللازم لكل مجموعة بيانات.
ربط بياناتك
عند ربط بياناتك بقواعد بيانات متعددة، حاوِل استيفاء الشروط التالية:
- لا يتم تنفيذ كل طلب بحث إلا على مثيل قاعدة بيانات واحد. لا تتيح Realtime Database طلبات البحث في جميع نُسخ قاعدة البيانات.
- عدم مشاركة البيانات أو تكرارها في جميع نُسخ قاعدة البيانات (أو مشاركة البيانات أو تكرارها بحدٍّ أدنى)
- لا يتصل كل مثيل من التطبيق إلا بقاعدة بيانات واحدة في أي وقت.
أثناء ربط بياناتك، ننصحك باتّباع الاستراتيجيات التالية:
إنشاء "شريحة رئيسية"
تخزين خريطة لكيفية تخزين بياناتك على مستوى نُسخ قاعدة البيانات بهذه الطريقة، يمكنك البحث آليًا عن مثيل قاعدة بيانات الذي يتوافق مع العميل المتصل. تجدر الإشارة إلى أنّ هذا الإجراء قد يؤدي إلى استخدام موارد إضافية أكثر من الاتصال مباشرةً بمثيل قاعدة البيانات المعنيّ عند الحاجة إليه.
تجميع البيانات حسب الفئات أو حسب العميل
تخزين البيانات في نُسخ قاعدة بيانات معزولة، مجمّعة حسب المستخدم أو نوع البيانات على سبيل المثال، إذا أنشأت تطبيق محادثات يخدم مؤسسات متعددة، يمكنك إنشاء مثيل قاعدة بيانات لكل مؤسسة وتخزين كل بيانات المحادثات في مثيلات قاعدة بيانات فريدة.
في هذه الحالة، لا تشارك المؤسّسة "أ" المؤسّسة "ب" البيانات، ولا يتوفّر أي بيانات مكرّرة في قواعد بياناتك، ولا تُجري سوى طلبات بحث في مثيل قاعدة بيانات واحد. بالإضافة إلى ذلك، لا يتم اتصال المستخدمين في كل مؤسسة بقاعدة بيانات مؤسستهم إلا عند استخدام تطبيق المحادثة.
يمكنك بعد ذلك إنشاء عدة نُسخ من قاعدة البيانات مسبقًا واستخدام رقم تعريف المؤسسة لربط فريق بنُسخة قاعدة البيانات. على سبيل المثال، يتم ربط المؤسسة "أ" بقاعدة بيانات "الوقت الفعلي" "أ".
تعتمد طريقة ربط البيانات بتطبيقك على حالة الاستخدام المحدّدة، ولكن يمكن أن تساعدك الشروط والاستراتيجيات الموضّحة أعلاه في تحديد ما يناسب بياناتك.
إنشاء عدّة نُسخ من Realtime Database
إذا كنت تستخدم خطة أسعار Blaze، يمكنك إنشاء ما يصل إلى 1,000 مثيل قاعدة بيانات في مشروع Firebase نفسه.
وحدة تحكُّم Firebase مع قائمة السياقات في قسم قواعد البيانات" />
- في وحدة تحكّم Firebase، انتقِل إلى علامة التبويب البيانات في القسم تطوير > قاعدة البيانات.
- اختَر إنشاء قاعدة بيانات جديدة من القائمة في قسم Realtime Database.
- خصِّص مرجع قاعدة البيانات و قواعد الأمان، ثم انقر على حسنًا .
كرِّر العملية لإنشاء عدد النُسخ من قاعدة البيانات الذي تريده. تحتوي كل مثيل قاعدة بيانات على مجموعة خاصة به من Firebase Realtime Database Security Rules، حتى تتمكّن من تحسين إمكانية الوصول إلى بياناتك.
يمكنك إنشاء نُسخ بيانات قاعدة بيانات وإدارتها في وحدة تحكُّم Firebase أو باستخدام Realtime Database Management REST API.
تعديل Realtime Database Security Rules ونشره لكلّ مثيل
تأكَّد من أنّ Realtime Database Security Rules يسمح بالوصول المناسب إلى كل مثيل قاعدة بيانات في مشروعك. تحتوي كل قاعدة بيانات على مجموعة من القواعد الخاصة بها، ويمكنك تعديلها ونشرها من وحدة تحكّم Firebase أو باستخدام Firebase CLI لنشر الاستهدافات.
لتعديل القواعد ونشرها من وحدة تحكّم Firebase، اتّبِع الخطوات التالية:
- انتقِل إلى علامة التبويب القواعد في قسم تطوير > قاعدة البيانات.
- اختَر قاعدة البيانات التي تريد تعديلها، ثم عدِّل القواعد.
لتعديل القواعد ونشرها من Firebase CLI، اتّبِع الخطوات التالية:
- عدِّل القواعد في ملفات القواعد لمثيلات قاعدة البيانات (على سبيل المثال،
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 CLI إلى إلغاء أي تعديلات أجريتها فيconsole Firebase، كما يؤدي تعديل القواعد مباشرةً فيconsoleFirebase إلى إلغاء أي تغييرات حديثة أجريتها من خلال واجهة برمجة التطبيقات Firebase CLI.
ربط تطبيقك بمثيلات قاعدة بيانات متعددة
استخدِم مرجع قاعدة البيانات للوصول إلى البيانات المخزّنة في نُسخ قاعدة البيانات الثانوية. يمكنك الحصول على مرجع لنسخة قاعدة بيانات معيّنة من خلال عنوان 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()// الحصول على مثيل قاعدة بيانات ثانوي باستخدام عنوان URL var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Objective-C
// 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 = [[FIRDatabase databaseWithURL:@"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.