اذهب إلى المحتوى
  • 0

التعامل مع الربط بين عدد من collections في firebase

Flutter Dev

السؤال

تحيه طيبه 

لدي استفسار لو تكرمتم

ارغب بعمل ربط بين اكثر من collections وقمت بتابع هذا الطريقة ولكني لا اعلم هل الطريقة صحيحه او توجد طريقة افضل لفعل ذلك

مع العلم انني سوف اتعامل او سوف أقوم بربط عدد كبير من collections قد يصل إلى 25 collections هل توجد مشكلة في ذلك؟ او طريقة العمل لدي خطاء؟ حيث انني ارغب بالعمل مع اسرع طريقة تحضر البيانات للمستخدم

  void _getbooksData() async {
    final booksSnapshotFuture = FirebaseFirestore.instance
        .collection('books')
        .where('id', isEqualTo: 522)
        .get();

    final results = await Future.wait([booksSnapshotFuture]);

    final booksSnapshot = results[0];
    final booksDocs = booksSnapshot.docs;
    if (booksDocs.isNotEmpty) {
      final booksData =booksDocs.first.data();

      final categorySnapshotFuture = FirebaseFirestore.instance
          .collection('Category')
          .where('idMainCat',
          isEqualTo: booksData.containsKey('IDCat')
              ? booksData['IDCat']
              : null)
          .get();

      final subCategorySnapshotFuture = FirebaseFirestore.instance
          .collection('SubCategory')
          .where('idSubCat',
          isEqualTo: booksData.containsKey('Id_Sub')
              ? booksData['Id_Sub']
              : null)
          .get();

      final results = await Future.wait([
        categorySnapshotFuture,
        subCategorySnapshotFuture,

      ]);

      final categorySnapshot = results[0];
      final categoryDocs = categorySnapshot.docs;
      final categoryData = categoryDocs.isNotEmpty ? categoryDocs.first.data() : null;

      final subCategorySnapshot = results[1];
      final subCategoryDocs = subCategorySnapshot.docs;
      final subCategoryData = subCategoryDocs.isNotEmpty ? subCategoryDocs.first.data() : null;


      final combinedData = FullListWomanModel.fromJson(
          Map.from(booksData ?? {})
            ..addAll(categoryData ?? {})
            ..addAll(subCategoryData ?? {})
      );

      setState(() {
        _ListDataDisplay.add(combinedData);
      });
    }
  }

 

 

تم التعديل في بواسطة Flutter Dev
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

الطريقة التي تستخدمها لربط عدة collections في Firebase صحيحة وليست بها خطأ، ولكن، قد يصعب إدارة العديد من عمليات الربط لأكثر من 25 مجموعة.

ولتحسين الأداء، تستطيع استخدام دالة الاستعلامات المتعددة (Batched Writes) في Firebase التي تتيح لك إنشاء وتحديث وحذف العديد من المستندات في مجموعة واحدة في نفس الوقت.

وبإمكانك الاطلاع على التفاصيل الكاملة عن Batched Writes في Firebase من هنا: https://firebase.google.com/docs/firestore/manage-data/transactions#batched-writes 

أيضًا عليك بالنظر في إمكانية استخدام الرسائل الفورية (Firebase Cloud Messaging) في Firebase لتحسين الأداء وتقليل العمليات اللازمة للحصول على بيانات جديدة وإرسالها إلى التطبيق الخاص بك.

بالإضافة إلى النظر في تحسين هيكل البيانات الخاص بك في Firebase لتقليل عدد المستندات التي تحتاج إلى الوصول إليها في كل مرة.

مثلاً، دمج بعض المعلومات في مستند واحد بدلاً من إنشاء مستندات منفصلة لكل بيانات.

وإليك بعض الأفكار التي يمكن استخدامها لتحسين الكود الخاص بك:

  • استخدام الدوال المتعددة للحصول على بيانات متعددة بدلاً من استخدام await Future.wait، وذلك قد يحسن من الأداء ويجعل الكود أكثر وضوحًا وقابلية للصيانة، مثال: استخدام الدالة getBooksSnapshot بدلاً من await booksSnapshotFuture.
  • تستطيع استخدام Stream للحصول على بيانات متعددة من Firebase بطريقة فعالة من حيث الأداء، من خلال إنشاء Stream واحد للحصول على جميع البيانات المطلوبة من Firebase.
  • يمكن هيكلة قاعدة البيانات الخاصة بك بشكل أفضل لتجنب الحاجة إلى الوصول إلى عدة مجموعات للحصول على بيانات متعددة، عن طريق إنشاء مجموعات فرعية أو إضافة بيانات إضافية إلى المستندات الحالية لتجنب الحاجة إلى الوصول إلى مجموعات متعددة للحصول على بيانات متعددة.

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1
بتاريخ On 27‏/4‏/2023 at 22:45 قال Flutter Dev:

اهلا أخي الكريم

شاكر لك ردك عزيزي

بالنسبة إلى موضوع Batched Writes

هل تقصد أن اجعل الكود بشكل التالي هل الطريقة هذا تعتبر افضل من الطريقة الأولى في اول مشاركة ؟ 
 

 void _getbooksData() async {
    final batch = FirebaseFirestore.instance.batch();

    final booksSnapshotFuture = FirebaseFirestore.instance
        .collection('books')
        .where('id', isEqualTo: 522)
        .get();

    final results = await Future.wait([booksSnapshotFuture]);

    final booksSnapshot = results[0];
    final booksDocs = booksSnapshot.docs;
    if (booksDocs.isNotEmpty) {
      final booksData = booksDocs.first.data();

      final categorySnapshotFuture = FirebaseFirestore.instance
          .collection('Category')
          .where('idMainCat',
          isEqualTo: booksData.containsKey('IDCat') ? booksData['IDCat'] : null)
          .get();

      final subCategorySnapshotFuture = FirebaseFirestore.instance
          .collection('SubCategory')
          .where('idSubCat',
          isEqualTo: booksData.containsKey('Id_Sub') ? booksData['Id_Sub'] : null)
          .get();

      final results = await Future.wait([
        categorySnapshotFuture,
        subCategorySnapshotFuture,
      ]);

      final categorySnapshot = results[0];
      final categoryDocs = categorySnapshot.docs;
      final categoryData =categoryDocs.isNotEmpty ? categoryDocs.first.data() : null;

      final subCategorySnapshot = results[1];
      final subCategoryDocs = subCategorySnapshot.docs;
      final subCategoryData =subCategoryDocs.isNotEmpty ? subCategoryDocs.first.data() : null;

      final combinedData = FullListWomanModel.fromJson(Map.from(
          booksData ?? {})
        ..addAll(categoryData ?? {})
        ..addAll(subCategoryData ?? {}));

      await batch.commit();

      setState(() {
        _ListDataDisplay.add(combinedData);
      });
    }
  }


 

الكودين المذكورين يحتويان على نفس النهج العام للحصول على بيانات من Firestore، ولكن الثاني يستخدم Batched Writes، بينما الأول لا يستخدمها.

الفرق الرئيسي بين الكودين هو في استخدام Batched Writes لتحسين أداء قاعدة البيانات وتقليل عدد العمليات التي تتم على قاعدة البيانات.

في الكود الثاني ، يتم تعريف دفعة batch، وبعد ذلك يتم تنفيذ عمليات القراءة والكتابة وإضافتها إلى الدفعة باستخدام دالة set(). وفي النهاية، يتم تنفيذ الدفعة باستخدام دالة commit().

أما في الكود الأول ، فإنه لا يستخدم Batched Writes، بل يقوم بتنفيذ عمليات القراءة والكتابة بشكل فردي، ويستخدم دالة Future.wait() لإنشاء مستقبلات لكل عملية قراءة، ثم يتم الانتظار حتى يتم الانتهاء من كل المستقبلات قبل معالجة النتائج.

يمكن استخدام Batched Writes في الحالات التي يتم فيها تنفيذ عدة عمليات كتابة على قاعدة البيانات في نفس الوقت، مما يساعد على تحسين أداء العمليات وتخفيض عدد الطلبات التي تتم إلى الخادم. ومع ذلك، يجب الحرص على استخدام Batched Writes بشكل معتدل وفقًا لحجم وتعقيد العمليات المتنفذة، حتى لا يؤدي ذلك إلى تباطؤ الأداء أو زيادة الوقت اللازم للعمليات الأخرى التي تعتمد على القاعدة.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 22 دقائق مضت قال Mustafa Suleiman:

الطريقة التي تستخدمها لربط عدة collections في Firebase صحيحة وليست بها خطأ، ولكن، قد يصعب إدارة العديد من عمليات الربط لأكثر من 25 مجموعة.

ولتحسين الأداء، تستطيع استخدام دالة الاستعلامات المتعددة (Batched Writes) في Firebase التي تتيح لك إنشاء وتحديث وحذف العديد من المستندات في مجموعة واحدة في نفس الوقت.

وبإمكانك الاطلاع على التفاصيل الكاملة عن Batched Writes في Firebase من هنا: https://firebase.google.com/docs/firestore/manage-data/transactions#batched-writes 

أيضًا عليك بالنظر في إمكانية استخدام الرسائل الفورية (Firebase Cloud Messaging) في Firebase لتحسين الأداء وتقليل العمليات اللازمة للحصول على بيانات جديدة وإرسالها إلى التطبيق الخاص بك.

بالإضافة إلى النظر في تحسين هيكل البيانات الخاص بك في Firebase لتقليل عدد المستندات التي تحتاج إلى الوصول إليها في كل مرة.

مثلاً، دمج بعض المعلومات في مستند واحد بدلاً من إنشاء مستندات منفصلة لكل بيانات.

وإليك بعض الأفكار التي يمكن استخدامها لتحسين الكود الخاص بك:

  • استخدام الدوال المتعددة للحصول على بيانات متعددة بدلاً من استخدام await Future.wait، وذلك قد يحسن من الأداء ويجعل الكود أكثر وضوحًا وقابلية للصيانة، مثال: استخدام الدالة getBooksSnapshot بدلاً من await booksSnapshotFuture.
  • تستطيع استخدام Stream للحصول على بيانات متعددة من Firebase بطريقة فعالة من حيث الأداء، من خلال إنشاء Stream واحد للحصول على جميع البيانات المطلوبة من Firebase.
  • يمكن هيكلة قاعدة البيانات الخاصة بك بشكل أفضل لتجنب الحاجة إلى الوصول إلى عدة مجموعات للحصول على بيانات متعددة، عن طريق إنشاء مجموعات فرعية أو إضافة بيانات إضافية إلى المستندات الحالية لتجنب الحاجة إلى الوصول إلى مجموعات متعددة للحصول على بيانات متعددة.

 

اهلا أخي الكريم

شاكر لك ردك عزيزي

بالنسبة إلى موضوع Batched Writes

هل تقصد أن اجعل الكود بشكل التالي هل الطريقة هذا تعتبر افضل من الطريقة الأولى في اول مشاركة ؟ 
 

 void _getbooksData() async {
    final batch = FirebaseFirestore.instance.batch();

    final booksSnapshotFuture = FirebaseFirestore.instance
        .collection('books')
        .where('id', isEqualTo: 522)
        .get();

    final results = await Future.wait([booksSnapshotFuture]);

    final booksSnapshot = results[0];
    final booksDocs = booksSnapshot.docs;
    if (booksDocs.isNotEmpty) {
      final booksData = booksDocs.first.data();

      final categorySnapshotFuture = FirebaseFirestore.instance
          .collection('Category')
          .where('idMainCat',
          isEqualTo: booksData.containsKey('IDCat') ? booksData['IDCat'] : null)
          .get();

      final subCategorySnapshotFuture = FirebaseFirestore.instance
          .collection('SubCategory')
          .where('idSubCat',
          isEqualTo: booksData.containsKey('Id_Sub') ? booksData['Id_Sub'] : null)
          .get();

      final results = await Future.wait([
        categorySnapshotFuture,
        subCategorySnapshotFuture,
      ]);

      final categorySnapshot = results[0];
      final categoryDocs = categorySnapshot.docs;
      final categoryData =categoryDocs.isNotEmpty ? categoryDocs.first.data() : null;

      final subCategorySnapshot = results[1];
      final subCategoryDocs = subCategorySnapshot.docs;
      final subCategoryData =subCategoryDocs.isNotEmpty ? subCategoryDocs.first.data() : null;

      final combinedData = FullListWomanModel.fromJson(Map.from(
          booksData ?? {})
        ..addAll(categoryData ?? {})
        ..addAll(subCategoryData ?? {}));

      await batch.commit();

      setState(() {
        _ListDataDisplay.add(combinedData);
      });
    }
  }


 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 1 دقيقة مضت قال عبدالباسط ابراهيم:

الكودين المذكورين يحتويان على نفس النهج العام للحصول على بيانات من Firestore، ولكن الثاني يستخدم Batched Writes، بينما الأول لا يستخدمها.

الفرق الرئيسي بين الكودين هو في استخدام Batched Writes لتحسين أداء قاعدة البيانات وتقليل عدد العمليات التي تتم على قاعدة البيانات.

في الكود الثاني ، يتم تعريف دفعة batch، وبعد ذلك يتم تنفيذ عمليات القراءة والكتابة وإضافتها إلى الدفعة باستخدام دالة set(). وفي النهاية، يتم تنفيذ الدفعة باستخدام دالة commit().

أما في الكود الأول ، فإنه لا يستخدم Batched Writes، بل يقوم بتنفيذ عمليات القراءة والكتابة بشكل فردي، ويستخدم دالة Future.wait() لإنشاء مستقبلات لكل عملية قراءة، ثم يتم الانتظار حتى يتم الانتهاء من كل المستقبلات قبل معالجة النتائج.

يمكن استخدام Batched Writes في الحالات التي يتم فيها تنفيذ عدة عمليات كتابة على قاعدة البيانات في نفس الوقت، مما يساعد على تحسين أداء العمليات وتخفيض عدد الطلبات التي تتم إلى الخادم. ومع ذلك، يجب الحرص على استخدام Batched Writes بشكل معتدل وفقًا لحجم وتعقيد العمليات المتنفذة، حتى لا يؤدي ذلك إلى تباطؤ الأداء أو زيادة الوقت اللازم للعمليات الأخرى التي تعتمد على القاعدة.

وصلت  الفكرة كل الشكر لك اخي الكريم 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...