Go で 1 対多および多対多のデー​​タベース関係を構造体に効率的にマッピングするにはどうすればよいですか?

Linda Hamilton
リリース: 2024-11-11 08:55:02
オリジナル
441 人が閲覧しました

 How to Efficiently Map One-to-Many and Many-to-Many Database Relationships to Structs in Go?

1 対多および多対多のデー​​タベース関係を構造体に効率的にマッピングするGo

Background

データベースを操作する場合、1 対多および多対多のリレーションシップが発生するのが一般的です。このようなシナリオでは、これらの関係を Go 構造体に効率的かつスケーラブルにマッピングすることが重要です。

PostgreSQL 配列アグリゲーターと GROUP BY

を使用した推奨アプローチ

効果的なアプローチの 1 つは次のとおりです。 PostgreSQL の配列アグリゲータと GROUP BY 機能を活用します。これには、配列集約を使用してアイテムとその関連データをグループ化するビューの作成が含まれます。その後、配列の内容を Go 構造体にアンマーシャリングして、結果のビューをクエリできます。

<br>sql := `<br>CREATE VIEW item_tags AS<br>SELECT<br> id ,<br> ARRAY_AGG(ROW_TO_JSON(taglist.*)) ASタグ<br>FROM<br> (</p>
<p>) AS タグリスト<br>GROUP BY<br> item.id<br>`<br>db.MustExec(sql)<br>< /pre></p>
<p>Go コードは次のようになります。 be:</p>
<p><pre class="brush:php;toolbar:false"><br>type item struct {<br> ID int<br> Tags []Tag<br>}</p>
<p>rows、err := db.Queryx( "SELECT row_to_json(row) FROM (SELECT * FROM item_tags) row")<br>for rows.Next() {<br> var item item<br> var jsonString string<br> if err := rows.Scan(&jsonString); err != nil {</p>
<p>}<br> if err := json.Unmarshal([]byte(jsonString), &item); err != nil {</p>
<p>}<br> items = append(items, item)<br>}<br>

利点< /h2>

このアプローチは、 PostgreSQL の柔軟性と、Go の配列集約および行レベルのマーシャリングの効率性を兼ね備えています。複雑な関係であっても、シームレスに拡張できます。

代替案

推奨されるアプローチは効率的で多用途ですが、質問で言及されている代替ソリューションにはそれぞれ独自の長所があり、弱点:

  • アプローチ 1 (複数)クエリ): シンプルですが、大規模なデータセットには非効率です。
  • アプローチ 2 (手動ループ): メモリ消費量は少ないですが、複雑でエラーが発生しやすくなります。
  • 失敗したアプローチ 3 (構造体のスキャン): 理論的には理想的ですが、 SQLx ではサポートされていません。
  • 可能なアプローチ 4 (PostgreSQL 配列): 未テストですが、実行できない可能性があります。

最終的に、最適なアプローチは特定の要件によって異なります。アプリケーションと利用可能なテクノロジーについて説明します。

以上がGo で 1 対多および多対多のデー​​タベース関係を構造体に効率的にマッピングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート