In Go, GORM ialah ORM yang popular untuk berinteraksi dengan pangkalan data. Apabila bekerja dengan persatuan dalam GORM, adalah penting untuk mewujudkan hubungan yang betul antara struct. Pertimbangkan struktur berikut yang mewakili Bandar dan Tempat:
type Place struct { ID int Name string Town Town } type Town struct { ID int Name string }
Di sini, setiap Bandar boleh mempunyai berbilang Tempat, manakala setiap Tempat hanya milik satu Bandar.
Andaikan anda ingin menanyakan semua Tempat dan maklumat Bandar mereka yang berkaitan. Di bawah ialah pangkalan data sampel dan hasil yang dijangkakan:
Jadual Tempat
id | name | town_id |
---|---|---|
1 | Place1 | 1 |
2 | Place2 | 1 |
Jadual Towns
id | name |
---|---|
1 | Town1 |
Dijangka Keputusan:
id | name | Town |
---|---|---|
1 | Place1 | Town1 |
2 | Place2 | Town1 |
Pelaksanaan awal cuba menanyakan semua Tempat tetapi gagal memasukkan maklumat Bandar yang berkaitan:
db, _ := gorm.Open("sqlite3", "./data.db") defer db.Close() places := []Place{} db.Find(&places) fmt.Println(places)
Penyelesaian optimum melibatkan penggunaan kaedah Pramuat GORM sebelum operasi Cari. Ini memastikan bahawa data berkaitan dimasukkan dalam pertanyaan utama, menghapuskan keperluan untuk pertanyaan tambahan:
db.Preload("Town").Find(&places)
Dengan pendekatan ini, hanya dua pertanyaan akan dicetuskan, meningkatkan prestasi dengan ketara:
Pertanyaan Log:
Time | Query |
---|---|
22.24ms | SELECT * FROM "places" |
0.92ms | SELECT * FROM "towns" WHERE "id" in ('1') |
Apabila bekerja dengan persatuan dalam GORM, adalah penting untuk menentukan kunci asing dengan betul. Menggunakan Pramuat membolehkan anda memasukkan maklumat yang berkaitan dengan cekap dalam pertanyaan anda, mengekalkan kebolehskalaan dan mengoptimumkan prestasi.
Atas ialah kandungan terperinci Bagaimanakah Fungsi Pramuat GORM Boleh Mengoptimumkan Pertanyaan dengan Persatuan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!