ホームページ >バックエンド開発 >Golang >GORM のプリロード機能は関連付けを使用してクエリをどのように最適化できますか?

GORM のプリロード機能は関連付けを使用してクエリをどのように最適化できますか?

DDD
DDDオリジナル
2024-12-10 02:47:09113ブラウズ

How Can GORM's Preload Function Optimize Queries with Associations?

GORM Golang ORM Associations

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。