การเชื่อมโยง
สร้างโมเดลความสัมพันธ์
การเชื่อมโยง เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
การสร้างแบบจำลองความสัมพันธ์
ความสัมพันธ์ของ GORM จับคู่ความสัมพันธ์ระหว่างตารางเข้ากับฟิลด์ของโครงสร้าง ความสัมพันธ์มีสี่ประเภท ได้แก่ มีหนึ่งรายการ มีหลายรายการ เป็นของ และหลายต่อหลาย
- แสดงคีย์ต่างประเทศเป็นฟิลด์ของโครงสร้าง
- โหลดข้อมูลที่เกี่ยวข้องโดยอัตโนมัติ
- สร้างระเบียนที่เกี่ยวข้องไปพร้อมกัน
มีหลายรายการ
ผู้ใช้หนึ่งคนมีบทความหลายรายการ ระเบียนแม่มีสไลซ์ของระเบียนลูก และระเบียนลูกมีคีย์ต่างประเทศที่ย้อนกลับไปยังระเบียนแม่
type User struct {
gorm.Model
Name string
Posts []Post
}
type Post struct {
gorm.Model
Title string
UserID uint
}เป็นของ
จากมุมมองของระเบียนลูก บทความเป็นของผู้ใช้ ให้เพิ่มฟิลด์ User พร้อมคีย์ต่างประเทศ UserID เพื่อแสดงความสัมพันธ์นี้
type Post struct {
gorm.Model
Title string
UserID uint
User User
}มีหนึ่งรายการ
ความสัมพันธ์แบบมีหนึ่งรายการคล้ายกับแบบมีหลายรายการ แต่มีระเบียนที่เกี่ยวข้องเพียงรายการเดียว เช่น ผู้ใช้หนึ่งคนมีโปรไฟล์หนึ่งรายการ ระเบียนลูกจะเก็บคีย์ต่างประเทศไว้
type User struct {
gorm.Model
Profile Profile
}
type Profile struct {
gorm.Model
UserID uint
Bio string
}หลายต่อหลาย
ผู้ใช้และบทบาทมีความสัมพันธ์แบบหลายต่อหลายผ่านตารางเชื่อมโยง แท็ก many2many ใช้ระบุชื่อตารางเชื่อมโยง โดยเขียนเป็น gorm:"many2many:user_roles;" ในเครื่องหมายแบ็กทิกหลังฟิลด์ Roles
type User struct {
gorm.Model
// Roles field tag: gorm:"many2many:user_roles;"
Roles []Role
}
type Role struct {
gorm.Model
Name string
}Preload
โดยค่าเริ่มต้น ข้อมูลที่เกี่ยวข้องจะไม่ถูกโหลด Preload จะบอกให้ GORM ดึงความสัมพันธ์ด้วยคำค้นข้อมูลแยกต่างหาก ทำให้ไม่ต้องค้นหาด้วยตนเองอีกครั้ง
var user User
db.Preload("Posts").First(&user, 1)
fmt.Println(len(user.Posts))Preload แบบซ้อนกัน
คุณสามารถโหลดข้อมูลล่วงหน้าหลายระดับด้วยเส้นทางที่คั่นด้วยจุด โดยโหลดบทความของผู้ใช้และความคิดเห็นของแต่ละบทความในสายการเรียกเดียว
db.Preload("Posts.Comments").First(&user, 1)การจำลองความสัมพันธ์ที่เรียกใช้งานได้
GORM จำเป็นต้องใช้ฐานข้อมูล ดังนั้นตัวอย่างที่เรียกใช้งานได้นี้จึงจำลองความสัมพันธ์แบบมีหลายรายการและการโหลดข้อมูลล่วงหน้าโดยใช้สไลซ์ในหน่วยความจำ
package main
import "fmt"
type Post struct {
ID int
UserID int
Title string
}
type User struct {
ID int
Name string
Posts []Post
}
func preload(u *User, all []Post) {
for _, p := range all {
if p.UserID == u.ID {
u.Posts = append(u.Posts, p)
}
}
}
func main() {
u := User{ID: 1, Name: "Ada"}
all := []Post{{1, 1, "Hello"}, {2, 1, "World"}, {3, 2, "Other"}}
preload(&u, all)
fmt.Printf("%s has %d posts\n", u.Name, len(u.Posts))
}การสร้างข้อมูลพร้อมความสัมพันธ์
หากกำหนดฟิลด์สไลซ์ก่อนเรียก Create GORM จะแทรกระเบียนแม่และระเบียนลูกไปพร้อมกัน พร้อมเชื่อมคีย์ต่างประเทศให้อัตโนมัติ
user := User{Name: "Ada", Posts: []Post{{Title: "Hi"}}}
db.Create(&user)ปัญหา N บวกหนึ่ง
การวนซ้ำระเบียนแม่และค้นหาระเบียนลูกในแต่ละรอบทำให้เกิดคำค้นข้อมูลหนึ่งรายการต่อระเบียนแม่หนึ่งรายการ ซึ่งเรียกว่า ปัญหา N+1 Preload แก้ปัญหานี้ด้วยการรวมการดึงข้อมูลที่เกี่ยวข้องให้เป็นคำค้นข้อมูลเพิ่มเติมเพียงรายการเดียว
โหมดความสัมพันธ์
ส่วนเชื่อมต่อ Association สามารถเพิ่ม แทนที่ ลบ หรือล้างระเบียนที่เกี่ยวข้องได้โดยไม่ต้องจัดการคีย์ต่างประเทศด้วยตนเอง เช่น db.Model(&user).Association("Posts").Append(&post)
ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความรู้เกี่ยวกับความสัมพันธ์
สรุปทบทวน
คุณได้เรียนรู้เกี่ยวกับความสัมพันธ์ดังนี้:
- ความสัมพันธ์แบบมีหนึ่งรายการ มีหลายรายการ เป็นของ และหลายต่อหลาย
- คีย์ต่างประเทศคือฟิลด์ของโครงสร้าง เช่น UserID
- Preload โหลดความสัมพันธ์และหลีกเลี่ยงปัญหา N+1
- การสร้างระเบียนแม่พร้อมระเบียนลูกจะเชื่อมคีย์ต่างประเทศให้
- โหมดความสัมพันธ์สามารถเพิ่ม แทนที่ หรือล้างความสัมพันธ์ได้
คำถามที่พบบ่อย
บทเรียน “การเชื่อมโยง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การเชื่อมโยง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การเชื่อมโยง”
สร้างโมเดลความสัมพันธ์ คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การเชื่อมโยง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม
ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ