در Firebase Data Connect ، میتوانید بارگذاری و بهروزرسانی دادههای انبوه را به روشهای مختلفی بسته به گردشهای کاری و محیطهای خود انجام دهید:
در نمونهسازی محلی ، وقتی طرحهای جایگزین را امتحان میکنید، جهشهای کاشت داده میتوانند ایجاد شوند و در یک محیط توسعه محلی با استفاده از افزونه VS Code، شبیهساز Data Connect و یک نمونه پایگاه داده محلی فراخوانی شوند.
در توسعهی محیط عملیاتی ، با یک طرحوارهی پایدار، وقتی جریانهای CI/CD بزرگتری را انجام میدهید و دادههای محیط عملیاتی را مدیریت میکنید، دو گزینه دارید:
رویکرد ترجیحی استفاده از Firebase Admin SDK است، مجموعهای از کتابخانهها که در محیطهای دارای دسترسی ویژه اجرا میشوند.
همچنین میتوانید از ابزارهای SQL به همراه نمونه Cloud SQL خود برای انجام بارگذاریها و بهروزرسانیهای انبوه استفاده کنید، البته تا زمانی که دادهها را تغییر دهید و نه طرحواره پایگاه داده خود را. تغییر مستقیم طرحواره پایگاه داده با ابزارهای SQL میتواند طرحواره و کانکتورهای Data Connect شما را مختل کند.
نمونهسازی محلی: دادههای اولیه در نمونههای محلی
در راهنمای شروع به کار ، شما یک برنامه راهاندازی کردید تا با استفاده از یک جهش درج موردی، یک رکورد واحد را به یک جدول واحد اضافه کند.
برای اینکه برنامه نقد فیلم قابل استفاده باشد، به دادههایی برای فیلمها، نقدها و کاربران نیاز دارد تا بتواند پرسوجوها و جهشهایی را که از پیوندها و سایر عملیات روی چندین جدول با دادههای واقعی استفاده میکنند، نمونهسازی کند. میتوانید طرحواره خود را گسترش داده و پایگاه داده خود را راهاندازی کنید.
محیط نمونهسازی شما برای انجام عملیات کاشت داده به کد نیاز دارد. این راهنما چند نمونه ارائه میدهد که موارد زیر را نشان میدهد:
- استفاده از
_insertManyو_upsertManyروی جداول جداگانه - استفاده از
_insertManyدر جداول مرتبط
طرحواره برنامه نقد فیلم را بهروزرسانی کنید
شما میتوانید از جهشهای _insertMany و _upsertMany برای بهروزرسانی جداول پایگاه داده به صورت تکی یا بهروزرسانی چندین جدول مرتبط با روابط join استفاده کنید. یک طرحواره (schema) توسعهیافته برای برنامه نقد فیلم که به توضیح این موارد استفاده و مثالها کمک میکند، در زیر نشان داده شده است. این طرحواره 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 در افزونه VS Code برای ایجاد جهشهای _insert ، دادههای hard-code و اجرای آن جهشها در VS Code استفاده کنید.
در نهایت، منطقیتر است که با استفاده از عملیات _insertMany رکوردهای زیادی را به یک جدول اضافه کنیم. در مثال برنامه نقد فیلم، این عملیات یک مجموعه اولیه از دادهها را در Movie و Actor وارد میکند.
برای اجرای جهشهای زیر، با استفاده از افزونهی VS Code Firebase، در نمای ویرایشگر فایل مناسب، بسته به اینکه آیا در حال نمونهسازی اولیه با سرویس تولید خود یا یک پایگاه داده محلی هستید، روی دکمههای Run (Production) یا Run (Local) 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 قرار دهید
برای آزمایش پرسوجوها و جهشها با استفاده از joinها و سایر عملیات پیچیده، میتوانید چندین رکورد به جدول 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 کسب کنید.
بارگذاریهای عمده و بهروزرسانی دادههای تولید را انجام دهید
API مربوط به مدیریت دادههای انبوه، به جای اینکه از شما بخواهد mutation {...} را با executeGraphQL API که قبلاً برای اضافه کردن چند ردیف اینجا و آنجا به صورت محلی توضیح داده شد، بسازید، جهشهای GraphQL را از طرف شما ایجاد میکند.
یکی از مزایای اصلی API مدیریتی، امکان مدیریت و استفاده مجدد از آرایههای داده برای جریانهای 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 برای PostgreSQL مراجعه کنید.
بعدش چی؟
- درباره ادغام Admin SDK در پروژههای Data Connect خود بیاموزید.