ใน Firebase Data Connect การดำเนินการกับข้อมูลจำนวนมากจะดำเนินการโดยใช้การกลายพันธุ์ แม้ว่าโปรเจ็กต์ Data Connect จะจัดเก็บข้อมูลใน PostgreSQL แต่คุณไม่สามารถโหลดข้อมูลจำนวนมากโดยใช้คำสั่ง SQL หรือเครื่องมือ SQL เนื่องจากบริการ Data Connect และสคีมาต้องซิงค์กับฐานข้อมูลอยู่เสมอ และการดำเนินการใน PostgreSQL โดยตรงจะรบกวนการซิงค์นี้
ใน Data Connect คุณจะใช้การกลายพันธุ์เพื่อเริ่มต้นข้อมูลและจัดการข้อมูลจำนวนมาก คุณสร้างและเรียกใช้การกลายพันธุ์การจัดการข้อมูลได้หลายวิธีโดยขึ้นอยู่กับเวิร์กโฟลว์และสภาพแวดล้อม ดังนี้
ในการพัฒนาในเครื่อง เมื่อคุณสร้างต้นแบบแอป คุณสามารถสร้างและเรียกใช้การกลายพันธุ์ของข้อมูลในสภาพแวดล้อมการพัฒนาในเครื่องได้โดยใช้ส่วนขยาย VS Code, โปรแกรมจำลอง Data Connect และอินสแตนซ์ฐานข้อมูลในเครื่อง
ในการพัฒนาเวอร์ชันที่ใช้งานจริง เมื่อคุณทำขั้นตอน CI/CD ขนาดใหญ่และจัดการข้อมูลเวอร์ชันที่ใช้งานจริง คุณสามารถใช้ Firebase Admin SDK ซึ่งเป็นชุดไลบรารีที่ทำงานในสภาพแวดล้อมที่มีสิทธิ์
การพัฒนาในเครื่อง: ข้อมูลเริ่มต้นในอินสแตนซ์ในเครื่อง
ในคู่มือเริ่มต้นใช้งาน คุณได้ตั้งค่าแอปเพื่อเพิ่มระเบียนเดียวลงในตารางเดียวโดยใช้การกลายพันธุ์แบบแทรกเฉพาะกิจ
แอปรีวิวภาพยนตร์จำเป็นต้องมีข้อมูลภาพยนตร์ รีวิว และผู้ใช้สำหรับการสร้างต้นแบบการค้นหาและการกลายพันธุ์ที่ใช้การรวมและการดำเนินการอื่นๆ ในตารางหลายตารางที่มีข้อมูลสมจริงจึงจะใช้งานได้ คุณสามารถขยายสคีมาและสร้างข้อมูลในฐานข้อมูลได้
สภาพแวดล้อมการต่อยอดแนวคิดต้องใช้โค้ดเพื่อทำการฝังข้อมูล คู่มือนี้แสดงตัวอย่างต่อไปนี้
- การใช้
_insertMany
และ_upsertMany
ในตารางแต่ละตาราง - การใช้
_insertMany
ในตารางที่เกี่ยวข้อง
อัปเดตสคีมาแอปรีวิวภาพยนตร์
คุณสามารถใช้การดัดแปลง _insertMany
และ _upsertMany
เพื่ออัปเดตตารางฐานข้อมูลแต่ละตารางทีละรายการ หรืออัปเดตหลายตารางที่เกี่ยวข้องตามความสัมพันธ์การรวม สคีมาแบบขยายของแอปรีวิวภาพยนตร์ที่จะช่วยแสดง Use Case และตัวอย่างเหล่านี้แสดงอยู่ด้านล่าง ซึ่งจะขยาย 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
คุณสามารถใช้เทคนิคเดียวกันที่อธิบายไว้ในคู่มือเริ่มต้นใช้งานเพื่อแทรกระเบียน 1 หรือ 2 รายการ ทั้งนี้ขึ้นอยู่กับระยะของการสร้างต้นแบบ กล่าวคือ คุณสามารถใช้ CodeLenses ในส่วนขยาย VS Code เพื่อสร้าง_insert
การกลายพันธุ์
การเขียนโค้ดแบบฮาร์ดโค้ด และเรียกใช้การกลายพันธุ์เหล่านั้นใน VS Code
ท้ายที่สุดแล้ว การเพิ่มระเบียนหลายรายการลงในตารางโดยใช้การดำเนินการ
_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 การรีเซ็ตข้อมูลเป็นสถานะ 0 เพื่อทำการทดสอบชุดใหม่กับชุดข้อมูลใหม่อาจมีประโยชน์
หากต้องการทําเช่นนั้น ให้ใช้ _upsertMany
mutation ที่ 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 สำหรับการจัดการข้อมูลจำนวนมากจะสร้างการกลายพันธุ์ GraphQL ในนามของคุณ แทนที่จะขอให้คุณสร้างสตริง mutation {...}
ด้วย executeGraphQL
API ที่อธิบายไว้ก่อนหน้านี้เพื่อเพิ่มแถว 2-3 แถวในเครื่อง
ประโยชน์หลักของ 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);
ขั้นตอนถัดไปคือ
- ดูข้อมูลเกี่ยวกับการผสานรวม Admin SDK เข้ากับData Connectโปรเจ็กต์