البيانات الأولية وتنفيذ عمليات البيانات المجمّعة

في Firebase Data Connect، يمكنك إجراء عمليات تحميل وتعديل مجمّعة للبيانات بـ طرق مختلفة حسب سير العمل والبيئات:

  • في النماذج الأولية المحلية، عند تجربة مخططات بديلة، يمكن إنشاء عمليات تغيير لتعبئة البيانات واستدعاؤها في بيئة تطوير محلية باستخدام إضافة Data Connect لـ VS Code ومحاكي Data Connect ومثيل قاعدة بيانات محلية.

  • في تطوير بيئة الإنتاج، باستخدام مخطط ثابت، عند إجراء عمليات CI/CD أكبر وإدارة بيانات الإنتاج، يتوفّر لك خياران:

    • النهج المفضّل هو استخدام Firebase Admin SDK، وهي مجموعة من المكتبات التي يتم تشغيلها في بيئات مميزة.

    • يمكنك أيضًا استخدام أدوات SQL مع مثيل Cloud SQL لإجراء عمليات تحميل وتعديل مجمّعة، طالما أنّك تعدِّل البيانات وليس مخطط قاعدة البيانات. يمكن أن يؤدي تعديل مخطط قاعدة البيانات مباشرةً باستخدام أدوات SQL إلى إتلاف مخطط Data Connect والموصِّلات.

النماذج الأولية المحلية: تعبئة البيانات الأولية في الآلات الافتراضية المحلية

في دليل البدء، يمكنك إعداد تطبيق لـ إضافة سجلّ واحد إلى جدول واحد باستخدام عملية تغيير مخصّصة للإدراج.

لكي يكون تطبيق مراجعة الأفلام قابلاً للاستخدام، يحتاج إلى بيانات للأفلام والمراجعات والمستخدمين من أجل إنشاء نماذج أولية للاستعلامات وعمليات التغيير التي تستخدِم عمليات الربط والعمليات الأخرى على جداول متعددة تتضمّن بيانات واقعية. يمكنك توسيع المخطط وتعبئة قاعدة البيانات.

تحتاج بيئة النماذج الأولية إلى رمز لإجراء عملية تعبئة البيانات. يقدّم هذا الدليل بعض النماذج التي توضّح ما يلي:

  • استخدام _insertMany و_upsertMany في جداول فردية
  • استخدام _insertMany في جداول ذات صلة

تعديل مخطط تطبيق مراجعة الأفلام

يمكنك استخدام عمليات التغيير _insertMany و_upsertMany لتعديل جداول قاعدة البيانات الفردية واحدًا تلو الآخر، أو تعديل جداول متعددة مرتبطة بعلاقات الربط. في ما يلي مخطط موسّع لتطبيق مراجعة الأفلام يساعد في توضيح حالات الاستخدام والأمثلة هذه. يوسّع هذا المخطط schema.gql خارج النوع الأولي Movie ليشمل النوعَين Actor وMovieActor، ما يتيح لنا إنشاء نماذج أولية لاستعلامات أكثر تعقيدًا.

# Actors
# Suppose an actor can participate in multiple movies and movies can have multiple actors
# Movie - Actors (or vice versa) is a many to many relationship
type Actor @table {
  id: UUID!
  imageUrl: String! 
  name: String! @col(name: "name", dataType: "varchar(30)")
}

# Join table for many-to-many relationship for movies and actors
# The 'key' param signifies the primary key(s) of this table
# In this case, the keys are [movieId, actorId], the generated fields of the reference types [movie, actor]
type MovieActor @table(key: ["movie", "actor"]) {
  # @ref creates a field in the current table (MovieActor) that holds the primary key of the referenced type
  # In this case, @ref(fields: "movieId", references: "id") is implied
  movie: Movie!
  # movieId: UUID! <- this is created by the implied @ref
  actor: Actor!
  # actorId: UUID! <- this is created by the implied @ref
  role: String! # "main" or "supporting"
}

كتابة عمليات تغيير لتعبئة بيانات الحالة الصفرية

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

تعبئة البيانات في الجدولَين Movie وActor

اعتمادًا على مرحلة إنشاء النموذج الأولي، يمكنك استخدام الطريقة نفسها التي تم تقديمها في دليل البدء لإدراج سجلّ واحد أو سجلَّين: أي يمكنك استخدام CodeLenses في إضافة Data Connect لـ VS Code لإنشاء عمليات تغيير _insert، وتضمين البيانات في التعليمات البرمجية، وتشغيل عمليات التغيير هذه في VS Code.

في النهاية، من المنطقي أكثر إضافة سجلات متعددة إلى جدول باستخدام عملية _insertMany. في مثال تطبيق مراجعة الأفلام، يؤدي هذا إلى إدراج مجموعة أولية من البيانات في Movie وActor.

لتنفيذ عمليات التغيير التالية باستخدام إضافة Data Connect لـ VS Code، في عرض محرر الملف المناسب، انقر على الزرَّين تشغيل (بيئة الإنتاج) أو تشغيل (بيئة محلية) في CodeLens، وذلك حسب ما إذا كنت تنشئ نموذجًا أوليًا باستخدام خدمة الإنتاج أو قاعدة بيانات محلية.

# insertMany for Movie
# 2 records shown
mutation {
  movie_insertMany(data: [
    {
      id: "550e8400-e29b-41d4-a716-446655440000",
      title: "Inception",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Finception.jpg?alt=media&token=07b09781-b302-4623-a5c3-1956d0143168",
      genre: "sci-fi",
    },
    {
      id: "550e8400-e29b-41d4-a716-446655440001",
      title: "The Matrix",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Fthe_matrix.jpg?alt=media&token=4975645d-fef8-409e-84a5-bcc1046e2059",
      genre: "action",
    }
  ])
}
# insertMany for Actor
# 2 records shown
mutation {
  actor_insertMany(data: [
    {
      id: "123e4567-e89b-12d3-a456-426614174000",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/actors%2Fdicaprio.jpeg?alt=media&token=452e030a-efa5-4ef4-bb81-502b23241316",
      name: "Leonardo DiCaprio"
    },
    {
      id: "123e4567-e89b-12d3-a456-426614174001",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/actors%2Fkeanu.jpg?alt=media&token=6056520c-ef3e-4823-aad0-108aab163115",
      name: "Keanu Reeves"
    }
   ])
}

تعبئة البيانات في جدول الربط MovieActor

لاختبار الاستعلامات وعمليات التغيير باستخدام عمليات الربط والعمليات المعقدة الأخرى، يمكنك إضافة سجلات متعددة إلى جدول MovieActor.

عند تعديل جداول متعددة في هذا النوع من العلاقات، يمكنك إضافة توجيه @transaction لضمان اكتمال التعديل بشكلٍ صحيح.

mutation @transaction {
  movie_insertMany(data: [
    {
      id: "550e8400-e29b-41d4-a716-446655440000",
      title: "Inception",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Finception.jpg?alt=media&token=07b09781-b302-4623-a5c3-1956d0143168",
      genre: "sci-fi",
    },
    {
      id: "550e8400-e29b-41d4-a716-446655440001",
      title: "The Matrix",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Fthe_matrix.jpg?alt=media&token=4975645d-fef8-409e-84a5-bcc1046e2059",
      genre: "action",
    }
  ])

  actor_insertMany(data: [
    {
      id: "123e4567-e89b-12d3-a456-426614174000",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/actors%2Fdicaprio.jpeg?alt=media&token=452e030a-efa5-4ef4-bb81-502b23241316",
      name: "Leonardo DiCaprio"
    },
    {
      id: "123e4567-e89b-12d3-a456-426614174001",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/actors%2Fkeanu.jpg?alt=media&token=6056520c-ef3e-4823-aad0-108aab163115",
      name: "Keanu Reeves"
    }
  ])
}

كتابة عملية تغيير لإعادة ضبط بيانات التعبئة

أثناء إنشاء النماذج الأولية وإجراء عمليات CI/CD، قد يكون من المفيد إعادة ضبط البيانات إلى حالة صفرية لتنفيذ سلسلة جديدة من الاختبارات على مجموعة بيانات جديدة.

لإجراء ذلك، إذا كان رمز النموذج الأولي لا يضيف سجلات إلى جداولك، استخدِم عملية التغيير _upsertMany التي يوفّرها Data Connect.

في المثال التالي، يتم استدعاء movie_upsertMany بالقيم الأولية لتعديل سجلات الأفلام إلى حالتها الأصلية.

mutation {
  # Execute an upsertMany operation to update the Movie table
  movie_upsertMany(data: [
    {
      id: "550e8400-e29b-41d4-a716-446655440000",
      title: "Inception",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Finception.jpg?alt=media&token=07b09781-b302-4623-a5c3-1956d0143168",
      genre: "sci-fi",
    },
    {
      id: "550e8400-e29b-41d4-a716-446655440001",
      title: "The Matrix",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Fthe_matrix.jpg?alt=media&token=4975645d-fef8-409e-84a5-bcc1046e2059",
      genre: "action",
    }
   
}

تطوير بيئة الإنتاج: استخدام Admin SDK لتعبئة البيانات وتعديلها

يتوفّر Firebase Admin SDK عندما تريد العمل من بيئات مميزة. تُعدّ هذه حالة استخدام مهمة عندما تريد تحميل آلاف السجلات، نظرًا إلى الطبيعة المهمة لعمليات البيانات المجمّعة على بيانات الإنتاج.

تثبيت Firebase Admin SDK

حتى إذا كنت تعمل بشكل أساسي محليًا، تنصح Firebase بإعداد الـ Admin SDK حتى تتمكّن من استخدام Firebase Data Connect من بيئة مميزة، بما في ذلك بيئتك المحلية. عليك إعداد Admin SDK لـ Node.js.

يمكنك التعرّف أكثر على استخدام Admin SDK في حالات استخدام Data Connect أخرى.

إجراء عمليات تحميل وتعديل مجمّعة لبيانات الإنتاج

تنشئ واجهة برمجة التطبيقات لإدارة البيانات المجمّعة عمليات تغيير GraphQL نيابةً عنك، بدلاً من أن تطلب منك إنشاء السلاسل mutation {...} باستخدام واجهة برمجة التطبيقات executeGraphQL الموضّحة سابقًا لإضافة بضعة صفوف هنا وهناك محليًا.

من المزايا الرئيسية لواجهة برمجة التطبيقات الإدارية إمكانية إدارة وإعادة استخدام مصفوفات البيانات بشكل منفصل لعمليات CI/CD، أو إعداد ملفات بيانات مجمّعة كبيرة لبيانات الإنتاج.

توضّح المقتطفات التالية كيفية إعداد نص للبيانات المجمّعة.

import { initializeApp } from 'firebase-admin/app';
import { getDataConnect } from 'firebase-admin/data-connect';

const app = initializeApp();

const dc = getDataConnect({ location: "us-west2", serviceId: "my-service" });

const data = [
 {
      id: "550e8400-e29b-41d4-a716-446655440000",
      title: "Inception",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Finception.jpg?alt=media&token=07b09781-b302-4623-a5c3-1956d0143168",
      genre: "sci-fi",
  },
  {
      id: "550e8400-e29b-41d4-a716-446655440001",
      title: "The Matrix",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Fthe_matrix.jpg?alt=media&token=4975645d-fef8-409e-84a5-bcc1046e2059",
      genre: "action",
    }
];

// Methods of the bulk operations API
const resp = await dc.insert("movie" /*table name*/, data[0]);
// Or
const resp = await dc.insertMany("movie" /*table name*/, data);

// Or
const resp = await dc.upsert("movie" /*table name*/, data[0]);
// Or
const resp = await dc.upsertMany("movie" /*table name*/, data);

تطوير بيئة الإنتاج: استخدام SQL لتعديل البيانات المجمّعة

عند العمل باستخدام مخطط ثابت في بيئة الإنتاج، وعدم تعديل المخطط، يمكنك العمل في مثيل Cloud SQL لإدارة عمليات تحميل البيانات وتعديلها.

راجِع دليل Cloud SQL for PostgreSQL لاستيراد البيانات.

ما هي الخطوات التالية؟