הוספת נתונים ראשוניים וביצוע פעולות על נתונים בכמות גדולה

ב-Firebase Data Connect, פעולות על נתונים בכמות גדולה מתבצעות באמצעות מוטציות. למרות שפרויקטים של Data Connect שומרים נתונים ב-PostgreSQL, אי אפשר לטעון נתונים בכמות גדולה באמצעות משפטי SQL או כלים של SQL: השירות של Data Connect והסכמות שלו צריכים להיות מסונכרנים עם מסד הנתונים, והפעלה ישירה ב-PostgreSQL תפר את הסנכרון הזה.

לכן, Data Connect מספק מוטציות סטנדרטיות של _insertMany, ‏ _upsertMany ו-_deleteMany לצורך הטמעת נתונים וניהול נתונים בכמות גדולה.

כשאתם יוצרים אב טיפוס של אפליקציות ומפעילים תהליכי CI/CD, אפשר להפעיל את המוטציות האלה בסביבת פיתוח מקומית באמצעות התוסף של VS Code, המהדר של Data Connect (אופציונלי) ומכונה מקומית של מסד נתונים.

הוספת נתוני זרע במכונות מקומיות ובמכונות ייצור

במדריך למתחילים, הגדרתם אפליקציה להוספת רשומה אחת לטבלה אחת באמצעות טרנספורמציה חד-פעמית של הוספה.

כדי שאפשר יהיה להשתמש באפליקציה של ביקורות הסרטים, נדרשים נתונים של סרטים, ביקורות ומשתמשים ליצירת אב טיפוס של שאילתות ומוטציות שמשתמשות בחיבור (join) ובפעולות אחרות במספר טבלאות עם נתונים ריאליסטיים. אפשר להרחיב את הסכימה ולהוסיף נתונים למסד הנתונים.

בסביבת האב טיפוס צריך קוד כדי לבצע הטמעת נתונים. במדריך הזה מפורטות כמה דוגמאות שממחישות:

  • שימוש ב-_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

בהתאם לשלב שבו אתם נמצאים בתהליך היצירה של אב-הטיפוס, תוכלו להשתמש באותה טכניקה שהוצגה במדריך למתחילים כדי להוסיף רשומה אחת או שתיים: כלומר, תוכלו להשתמש ב-Code Lenses בתוסף של VS Code כדי ליצור מוטציות של _insert, להטמיע נתונים בקוד ולהפעיל את המוטציות האלה ב-VS Code באמצעות Run.

בסופו של דבר, עדיף להוסיף הרבה רשומות לטבלה באמצעות פעולת _insertMany. בדוגמה של אפליקציית ביקורות הסרטים, הפעולה הזו תוסיף קבוצת נתונים ראשונית ב-Movie וב-Actor.

כדי להריץ את המוטציות הבאות באמצעות התוסף של Firebase ל-VS Code, לוחצים על הלחצנים CodeLens Run (Production) או Run (Local) בתצוגה המתאימה של עורך הקובץ, בהתאם לכך שאתם יוצרים אב טיפוס באמצעות שירות הייצור או מסד נתונים מקומי.

# 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, יכול להיות שיהיה שימושי לאפס את הנתונים למצב אפס כדי להריץ סדרה חדשה של בדיקות על קבוצת נתונים חדשה.

כדי לעשות זאת, אם קוד האב טיפוס לא מוסיף רשומות לטבלאות, צריך להשתמש ב-mutation‏ _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",
    }
   
}

מה השלב הבא?