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 }
]
]