DrizzleはSQLクエリビルダーなので、オブジェクトにマッピングされない。flatにクエリ出力される。(SQLと同じだ)
Drizzle Queriesを使用した場合、オブジェクトにマッピングされる。その際はSQL上でjsonを整形した上でキャストされるので高速だが、nestした場合(a → b → c)にサブクエリが3階層となり、aliasが繋がらないSQL生成結果となってしまった。つまりうまくクエリ生成ができなかった。
そのため、Aggregating results という形で集計を試みた。
しかし、こちらはインメモリ処理をするため、実行速度が遅く、150件程度でレスポンスタイムが250ms程度となってしまった。ローカルでこれなので実用に耐えられず、断念。
結局、Prismaで実装したところ、エラーなくレスポンスタイムも60ms程度に済んだ。
その際のPR内容
実装にあたり、以下の問題を抱えました。
Case: Drizzle/Query
出力されたサブクエリでのエイリアスやスコープが参照できないスコープとなってしまい、SQLレベルで実行エラーとなってしまう。
Case: Drizzle/Select
Queriesを使用せずにネストした形でSQLを実行するためにはjson構造をうまく定義する必要があり、クエリレベルでの対応は手修正が必要となる。
PostgreSQLのhelperなどは散見されたが、MySQLでのhelperは確認できず。gist.github.com/rphlmr/de869cf24816d02068c3dd089b45ae82 (too large to embed)
また、Aggregating results を試したが、こちらはマッピングが手動になるためバグリスクがあり、ランタイムでNode.js上で処理するためパフォーマンスが悪く、最終的なレスポンスタイムが200ms以上となったため、不採用。
Case: MikrORM / Kysely
MikroORMはTypeORM同様、Decoratorでの定義が必要であり、少し作業量が多いと見た。
また、Kyselyはより薄いSQL Query Builderであり、Drizzleと変わらないように思える or オブジェクトへのマッピングの対応可否が確認できなかった。Case: Prisma
Prismaでのオブジェクトのマッピングは実装歴があるため試したところ、Drizzle/Queriesと同じようなインタフェースで実行できるようになった。
Drizzleとの違いは実際のQueryで、Json構造で取り扱わずに複数のクエリで実行されていることによる。最終的なレスポンスタイムも約60msと良好である。
そのため、この実装を適用する。