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

في Firebase SQL Connect، يمكنك تنفيذ عمليات تحميل وتعديل مجمّعة للبيانات بطرق مختلفة حسب مهام سير العمل والبيئات:

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

  • في مرحلة تطوير الإصدار العلني، وعند استخدام مخطط ثابت، يتوفّر لك خياران عند تنفيذ عمليات أكبر في مسار الدمج المتواصل/التسليم المتواصل وإدارة بيانات الإصدار العلني:

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

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

إنشاء نماذج أولية محلية: بيانات أولية في النسخ المحلية

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

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

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

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

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

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

# 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

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

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

لتنفيذ عمليات التعديل التالية باستخدام إضافة SQL 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"
    }
  ])
}

لبدء تعبئة الجداول ذات الصلة بشكل ذري، يمكنك إجراء عملية إدراج ارتباطية متداخلة باستخدام حمولات حرفية. يؤدي ذلك إلى إنشاء السجلّ الرئيسي وسجلّاته الفرعية المرتبطة به في عملية واحدة بدون الحاجة إلى ربط المفتاح الخارجي يدويًا.

# Nested insert for Movie and Review
# 1 movie and 2 reviews shown
mutation {
  movie_insert(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",
    reviews_on_movie: [
      {
        id: "123e4567-e89b-12d3-a456-426614174002",
        rating: 5,
        reviewText: "Amazing concept!",
        user: { id: "user-uuid-123" }
      },
      {
        id: "123e4567-e89b-12d3-a456-426614174003",
        rating: 4,
        reviewText: "A bit confusing, but great.",
        user: { id: "user-uuid-456" }
      }
    ]
  })
}

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

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

لإجراء ذلك، إذا لم يضِف رمز النموذج الأوّلي سجلات إلى جداولك، استخدِم عملية التغيير _upsertMany التي يوفّرها SQL 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 SQL Connect من بيئة ذات امتيازات، بما في ذلك بيئتك المحلية. عليك إعداد Admin SDK لـ Node.js.

يمكنك الاطّلاع على مزيد من المعلومات حول استخدام مدير SDK في SQL Connect حالات استخدام أخرى.

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

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

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

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

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",
    // Nested reviews can be inserted atomically along with the movie
    reviews_on_movie: [
      {
        rating: 5,
        reviewText: "Amazing concept!",
        user: { id: "user-123" } // Link to existing user
      }
    ]
  },
  {
    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",
    reviews_on_movie: [
      {
        rating: 5,
        reviewText: "A masterpiece of sci-fi action.",
        user: { id: "user-456" }
      }
    ]
  }
];

// 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 دليل PostgreSQL لاستيراد البيانات.

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