Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menyoal Entiti Bersekutu dengan Cekap dalam GORM?
Persatuan dalam GORM Golang
Dalam Go, menggunakan GORM ORM, cabaran biasa timbul apabila menanyakan beberapa entiti dengan maklumat yang berkaitan. Mari kita teliti contoh untuk menggambarkan isu ini.
Pertimbangkan struktur yang mewakili bandar dan tempat yang berkaitan dengannya:
type Place struct { ID int Name string Town Town } type Town struct { ID int Name string }
Andaikan pangkalan data dengan sampel data berikut:
places table | towns Table | |||||
---|---|---|---|---|---|---|
id | name | town_id | id | name | ||
1 | Place1 | 1 | 1 | Town1 | ||
2 | Place2 | 1 | 2 | Town2 |
Untuk mendapatkan semula semua tempat bersama dengan bandar yang sepadan, seseorang mungkin mencuba perkara berikut pertanyaan:
db := gorm.Open("sqlite3", "./data.db") defer db.Close() places := []Place{} db.Find(&places)
Walau bagaimanapun, hasilnya akan menghasilkan:
[{1 Place1 {0 }} {2 Mares Place2 {0 }}]
Perhatikan bahawa maklumat bandar yang sepadan tiada. Untuk membetulkannya, kita perlu menentukan kunci asing dalam struct Tempat sebagai TownID:
type Place struct { ID int Name string Description string TownID int Town Town }
Untuk mendapatkan hasil yang diharapkan, seseorang boleh memilih pendekatan berikut:
db.Find(&places) for i, _ := range places { db.Model(places[i]).Related(&places[i].Town) }
Ini sememangnya akan menghasilkan hasil yang diingini, tetapi ia mengalami masalah n 1, kerana ia mencetuskan pertanyaan pangkalan data tambahan untuk setiap tempat.
Selengkapnya penyelesaian yang cekap melibatkan penggunaan Pramuat:
db.Preload("Town").Find(&places)
Pendekatan ringkas ini menghasilkan pertanyaan pangkalan data yang dioptimumkan berikut:
SELECT * FROM "places" [0.92ms] SELECT * FROM "towns" WHERE ("id" in ('1'))
Dengan menggunakan Pramuat, kami memastikan bahawa maklumat bandar yang berkaitan diperolehi dalam satu pertanyaan pangkalan data, dengan itu mengoptimumkan prestasi dan menghapuskan masalah n 1.
Atas ialah kandungan terperinci Bagaimana untuk Menyoal Entiti Bersekutu dengan Cekap dalam GORM?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!