Go では、GORM はデータベースと対話するための人気のある ORM です。 GORM で関連付けを操作する場合、構造体間の適切な関係を確立することが重要です。 Town と Place を表す次の構造体について考えてみましょう:
type Place struct { ID int Name string Town Town } type Town struct { ID int Name string }
ここで、各 Town は複数の Place を持つことができますが、各 Place は 1 つの Town にのみ属します。
すべての Place をクエリするとします。およびそれに関連するタウン情報。以下はサンプル データベースと予想される結果です:
Places テーブル
id | name | town_id |
---|---|---|
1 | Place1 | 1 |
2 | Place2 | 1 |
Towns テーブル
id | name |
---|---|
1 | Town1 |
期待される結果:
id | name | Town |
---|---|---|
1 | Place1 | Town1 |
2 | Place2 | Town1 |
初期実装はすべての場所をクエリしようとしますが、関連する町の情報を含めることができません:
db, _ := gorm.Open("sqlite3", "./data.db") defer db.Close() places := []Place{} db.Find(&places) fmt.Println(places)
最適な解決策には、検索操作の前に GORM の Preload メソッドを使用することが含まれます。これにより、関連データがメイン クエリに確実に含まれるようになり、追加のクエリが不要になります:
db.Preload("Town").Find(&places)
このアプローチでは、2 つのクエリのみがトリガーされ、パフォーマンスが大幅に向上します:
クエリログ:
Time | Query |
---|---|
22.24ms | SELECT * FROM "places" |
0.92ms | SELECT * FROM "towns" WHERE "id" in ('1') |
いつGORM で関連付けを操作する場合、外部キーを正しく定義することが重要です。 Preload を利用すると、クエリに関連情報を効率的に含めることができ、スケーラビリティを維持し、パフォーマンスを最適化できます。
以上がGORM のプリロード機能は関連付けを使用してクエリをどのように最適化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。