← NestJS コース
28. リレーション — テーブル間の関連
リレーションは、テーブル同士のつながりを表す仕組みです。たとえば「1人のユーザーが複数の投稿を持つ」関係は、User 側に @OneToMany、Post 側に @ManyToOne を付けて表現します。「多」の側(Post)には相手の主キーを指す外部キー列(userId)ができ、これがどの行とどの行が結びつくかを保持します。1対多・多対1という関連の考え方は ORM が違っても共通です。
実務では関連先を一緒に読み込みたい場面が多く、find({ relations: { posts: true } }) のように relations オプションを指定すると、ユーザーと一緒にその投稿も取得できます。既定では関連は読み込まれないため、必要なときだけ明示的に取りに行く、という制御を意識します。
つまずきポイントは N+1 問題です。ユーザー一覧を取ったあと、各ユーザーの投稿をループの中で1件ずつ取りに行くと、ユーザー数 N に比例してクエリが N+1 回発行され、件数が増えるほど急激に遅くなります。下のコードはこの N+1 と、関連をまとめて取得して解消する違いをプレーン TypeScript のクエリ回数で再現したものです。relations や JOIN でまとめて取るのが基本の対策です。
▶ サンプルコードを実行してみよう(自由に書き換えてOK)
TypeScript
サンプルコードで身につける(5本) →
学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。
公式ドキュメントで詳しく ↗