ใน Firebase Data Connect การดำเนินการกับข้อมูลจำนวนมากจะดำเนินการโดยใช้การกลายพันธุ์ แม้ว่าโปรเจ็กต์ Data Connect จะจัดเก็บข้อมูลใน PostgreSQL แต่คุณไม่สามารถโหลดข้อมูลจำนวนมากโดยใช้คำสั่ง SQL หรือเครื่องมือ SQL เนื่องจากบริการ Data Connect และสคีมาต้องซิงค์กับฐานข้อมูลอยู่เสมอ และการดำเนินการใน PostgreSQL โดยตรงจะรบกวนการซิงค์นี้
ด้วยเหตุนี้ Data Connect จึงมี _insertMany
,
_upsertMany
และ _deleteMany
มาตรฐานสำหรับการสุ่มตัวอย่างข้อมูลและการจัดการข้อมูลจำนวนมาก
เมื่อคุณสร้างต้นแบบแอปและเรียกใช้ขั้นตอน CI/CD คุณสามารถเรียกใช้การกลายพันธุ์เหล่านี้ได้ในสภาพแวดล้อมการพัฒนาซอฟต์แวร์ในเครื่องโดยใช้ส่วนขยาย VS Code, Data Connectโปรแกรมจำลอง และอินสแตนซ์ฐานข้อมูลในเครื่อง (ไม่บังคับ)
ข้อมูลเริ่มต้นในอินสแตนซ์ในเครื่องและอินสแตนซ์เวอร์ชันที่ใช้งานจริง
ในคู่มือเริ่มต้นใช้งาน คุณได้ตั้งค่าแอปเพื่อเพิ่มระเบียนเดียวลงในตารางเดียวโดยใช้การกลายพันธุ์แบบแทรกเฉพาะกิจ
แอปรีวิวภาพยนตร์จำเป็นต้องมีข้อมูลภาพยนตร์ รีวิว และผู้ใช้สำหรับการสร้างต้นแบบการค้นหาและการกลายพันธุ์ที่ใช้การรวมและการดำเนินการอื่นๆ ในตารางหลายตารางที่มีข้อมูลสมจริงจึงจะใช้งานได้ คุณสามารถขยายสคีมาและสร้างข้อมูลในฐานข้อมูลได้
สภาพแวดล้อมการต่อยอดแนวคิดต้องใช้โค้ดเพื่อทำการฝังข้อมูล คู่มือนี้มีตัวอย่างบางส่วนที่แสดงข้อมูลต่อไปนี้
- การใช้
_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 รายการ ทั้งนี้ขึ้นอยู่กับระยะของการสร้างต้นแบบ กล่าวคือ คุณสามารถใช้เลนส์โค้ดในส่วนขยาย 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 เข้ากับData Connectโปรเจ็กต์