إنّ أفضل طريقة لتحسين الأداء وتوسيع نطاق بياناتك في 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 واجهة سطر الأوامر لنشر الأهداف.
لتعديل القواعد ونشرها من وحدة تحكّم 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.