إنّ أفضل طريقة لتحسين الأداء وتوسيع نطاق بياناتك في Firebase Realtime Database هي تقسيم بياناتك على عدّة مثيلات Realtime Database، وهو ما يُعرف أيضًا بتقسيم قاعدة البيانات. تمنحك ميزة التجزئة المرونة في التوسّع إلى ما بعد الحدود التي تنطبق على مثيلات قاعدة بيانات فردية، بالإضافة إلى موازنة الحمل وتحسين الأداء.
متى يتم تجزئة بياناتك
قد تحتاج إلى تقسيم بياناتك على قواعد بيانات متعددة إذا كنت تستخدم Realtime Database وتتوافق مع أيّ من السيناريوهات التالية:
- إذا كنت تريد زيادة عدد عمليات الربط المتزامنة إلى أكثر من 200,000 عملية أو 1,000 عملية كتابة في الثانية أو أي من الحدود الأخرى لمثيل قاعدة بيانات واحد
- إذا كانت لديك مجموعات بيانات متعددة ومتفرقة وتريد تحسين الأداء (على سبيل المثال، تطبيق محادثات يعرض مجموعات منفصلة ومستقلّة من المستخدمين)
- لنفترض أنك ترغب في موازنة الحمل عبر قواعد بيانات متعددة لتحسين وقت التشغيل وتقليل خطر التحميل الزائد على مثيل قاعدة بيانات واحد.
كيفية تقسيم بياناتك
لتقسيم بياناتك، اتّبِع الخطوات التالية (الموضّحة بالتفصيل أدناه):
- يمكنك ربط بياناتك بقواعد بيانات متعددة وفقًا لاحتياجات تطبيقك المحدّدة.
- أنشئ عدّة نُسخ من قاعدة البيانات.
- اضبط تطبيقك ليتصل بمثيل Realtime Database اللازم لكل مجموعة بيانات.
ربط بياناتك
عند ربط بياناتك بقواعد بيانات متعددة، حاوِل استيفاء الشروط التالية:
- لا يتم تنفيذ كل طلب بحث إلا على مثيل قاعدة بيانات واحد. لا تتيح Realtime Database طلبات البحث في جميع نُسخ قاعدة البيانات.
- عدم مشاركة البيانات أو تكرارها في جميع نُسخ قاعدة البيانات (أو مشاركة البيانات أو تكرارها بشكلٍ بسيط)
- لا يتصل كل مثيل من التطبيق إلا بقاعدة بيانات واحدة في أي وقت.
أثناء ربط بياناتك، ننصحك باتّباع الاستراتيجيات التالية:
أنشئ "شريحة رئيسية".
تخزين خريطة لكيفية تخزين بياناتك على مستوى نُسخ قاعدة البيانات بهذه الطريقة، يمكنك البحث آليًا عن مثيل قاعدة البيانات الذي يتوافق مع العميل المتصل. ضع في اعتبارك أن هذا قد يكون لديه أعباء عامة أكثر من الاتصال المباشر بمثيل قاعدة البيانات المحددة التي تحتاجها، عندما تحتاج إليها.
تجميع البيانات حسب الفئات أو حسب العميل
تخزين البيانات في نُسخ قاعدة بيانات معزولة، مجمّعة حسب المستخدم أو نوع البيانات على سبيل المثال، إذا أنشأت تطبيق محادثات يخدم مؤسسات متعددة، يمكنك إنشاء مثيل قاعدة بيانات لكل مؤسسة وتخزين كل بيانات المحادثات في مثيلات قاعدة بيانات فريدة.
في هذه الحالة، لا تشارك المؤسّسة "أ" المؤسّسة "ب" البيانات، ولا يتوفّر أي بيانات مكرّرة في قواعد بياناتك، ولا تُجري سوى طلبات بحث في مثيل قاعدة بيانات واحد. بالإضافة إلى ذلك، لا يتصل المستخدمون في كل مؤسسة بقاعدة بيانات مؤسستهم إلا عند استخدام تطبيق المحادثة.
يمكنك بعد ذلك إنشاء عدة نُسخ من قاعدة البيانات مسبقًا واستخدام رقم تعريف المؤسسة لربط فريق بنُسخة قاعدة البيانات. على سبيل المثال، تقوم المؤسسة A بتعيين قاعدة البيانات A في الوقت الفعلي.
تعتمد طريقة ربط البيانات بتطبيقك على حالة الاستخدام المحدّدة، ولكن يمكن أن تساعدك الشروط والاستراتيجيات الموضّحة أعلاه في تحديد ما يناسب بياناتك.
إنشاء عدّة نُسخ من 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 يؤدي إلى إلغاء أي تعديلات أجريتها في وحدة تحكّم 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+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.