3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

typeorm 熱心で怠惰な関係

Posted at

typeormのtips的な備忘録です。

熱心で怠惰な関係?

typeormでrelationを使用する際に使用する設定です。

このページをgoogle翻訳するとタイトルのように訳されるのですが、それでもわからん。
ということで発行されるクエリを確認しつつどう動くのか確認して行きます。

Eager relations

テーブルやコードに関しては公式ドキュメント通りを用意

SQL確認

発行されたSQLを確認するとcategoryをleftjoinしている。
付け足すだけでリレーション先も呼び出せるのは楽だが、コストが高いため関連が強いのであれば使用して良いかもしれない。
積極的にとってくるという意味でeager熱心ということらしい。

SELECT "Question"."id" AS "Question_id", "Question"."title" AS "Question_title", "Question"."text" AS "Question_text", "Question__categories"."id" AS "Question__categories_id", "Question__categories"."name" AS "Question__categories_name" FROM "question" "Question" LEFT JOIN "question_categories_category" "Question_Question__categories" ON "Question_Question__categories"."questionId"="Question"."id" LEFT JOIN "category" "Question__categories" ON "Question__categories"."id"="Question_Question__categories"."categoryId"

Lazy relations

こちらもコードは公式を使用して確認

SQL確認

クエリだと結合(特に外部結合)は発生してないように見えるのでこのクエリが投げられているならコストは低いと思われる。
ただし、categoryが取得できているのでクエリでなく、どこかの処理で処理は行なっているはず。
メモリなどを確認して、トレースしていけば判明するかもしれない。
消極的にとってくる(あればとってくる)という意味で lazy怠惰ということらしい。

SELECT "Question"."id" AS "Question_id", "Question"."title" AS "Question_title", "Question"."text" AS "Question_text" FROM "question" "Question"

取得結果

console.log([questions]);
console.log([categories]);
--- 結果 ---
[ Question { id: 1, title: 'aaa', text: 'bbb' } ]
[
  [
    Category { name: 'animals', id: 1 },
    Category { name: 'zoo', id: 2 }
  ]
]
3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?