Node.jsのORMについて
概要
ここではNode.jsに存在するいくつかのORMについて紹介します 前置き
ここにある内容はあくまで筆者個人の意見や経験などに基づいたものなので、鵜呑みにはせず、あくまで参考程度にとどめていただけると幸いです🙏
おそらく、ここで紹介している中で一番歴史の長いORM ただし、最近のバージョンだと、もしかしたら大分改善されているかもしれないです
ネックな点
2021/01現在、まだメジャーリリースされていない (メジャーリリースまでにまだ破壊的変更が起こる可能性が考えられます)
以下の点など、とてもよく考えて作られていると感じており、個人的には気に入っています
EntitySchemaによりデコレータを使用せず、ドメインモデルからマッピング定義を切り離すことができる
ただ、ネックな点にもあげましたが、Sequelizeなどと比較した際にまだメジャーリリースされていないことなどもあり、少しリスキーな部分もあるかもしれないです。 マッピングの定義方法
また、TypeORM同様、EntitySchemaを使用することで、マッピング対象のクラスとマッピングの定義を分離することも可能 独自のDSLを使ってスキーマを記述し、その情報を元にクライアント(Prisma Client)やマイグレーションなどを自動生成します
スキーマやクライアント(Prisma Client)によって背後のデータベースを抽象化し、スキーマに基づいてタイプセーフに問い合わせができるなどのメリットがあります。
ただし、タイプセーフにクエリを書きたい、というのが目的の場合は、sqlcやpgtypedでも同じことは実現できるはずなので、採用や移行を検討する際はそのあたりも比較するとよさそうに思います。 また、GUIのDBクライアントもついてきます (Prisma Studio)
v1.5時点ではまだ実験的みたいですが、RedwoodはORMを提供しているようです。 insertGraphやupsertGraphなどの機能が強力
使用したことはないのですが、Ghostで採用されているようです 名前の通り、オブジェクトとリレーションのマッピングのみを提供するORM クエリの抽象化などは行わず、プレーンなSQLを記述する 採用するにあたって考えるとよさそうなこと
アプリケーションの規模
マイクロサービスを構成する特定のサービスであったり、LambdaのFunctionを記述する場合など、個々の構成要素が小さく収められるような場合は、Prismaによる生産性などの恩恵を受けやすいのではないかと思います。 こららはTypeScriptの実験的機能なため、安定したライブラリが欲しい場合は避けたほうがよいのかもしれません。 ただ、個人的な好みとしてはData MapperパターンのORMにおいては、極力デコレータに依存せずにマッピングを定義できるのが理想的だとは思っています。 クエリをタイプセーフに記述したいかどうか?
ある程度の複雑度のクエリをタイプセーフに記述したい場合、Prismaが便利かもしれません。 例えば、CQRSなどの考えに基づいて考えた場合に、ORMの必要性が高いのはどちらといえばコマンドのレイヤーになるのではないかと思います。無理にORMで複雑なクエリを構築しようとするよりも、部分的にこういったライブラリを使用した方が実装がシンプルになるケースもあるかもしれません。 ただし、ORMとそれらのライブラリとの間でコネクションプールを共有するなど、少し工夫は必要になるかもしれません。 また、メンテナンス性を考えたときに、タイプセーフにクエリを記述できるというのはたしかに便利ではあるものの、どちらかといえば、個人的にはきちんとインテグレーションテストなどを記述することが重要だと思っています。
所感
十分に枯れていること/メンテナンスが活発に行われていること/Active Recordパターンを採用しており比較的使い慣れているユーザーも多いであろうことなどを踏まえると、個人的にはSequelizeが一番無難に感じています。 ただし、現在の勢いなどを踏まえると、将来的にはPrismaが最も人気になる可能性はあるとは思います。 TypeORMはまだメジャーリリースされていないという意味ではややリスクはあるものの、この場合、TypeORMが使用されるのは永続化に関わるレイヤーに限定されるはずなので、リスクは軽減できるはず。 以下のようなケースではPrismaが向いていそうに見えます。 マイクロサービスを構成する特定のサービスにおける採用など、コードベースを比較的小規模に抑えやすい場合
LambdaなどのFunctionからクエリを記述したいケース
比較的小規模に抑えやすく、複雑なクエリを記述するケースなども少ないと思われるため
関連ページ