Node.jsのORMについて
概要
前置き
ここにある内容はあくまで筆者個人の意見や経験などに基づいたものなので、鵜呑みにはせず、あくまで参考程度にとどめていただけると幸いです🙏
実際に採用する際は、事前に検証や調査などをしてから決定することを推奨します
おそらく、ここで紹介している中では一番歴史の長いORM Node.jsはORMが乱立しがちな印象ですが、Sequelizeについては10年以上生き残り続けており、今でも開発やメンテナンスが継続されています。個人的には悪くないライブラリだと思っています。 独自のDSLを使ってスキーマを記述し、その情報を元にクライアント(Prisma Client)やマイグレーションなどを自動生成します スキーマやクライアント(Prisma Client)によって背後のデータベースを抽象化し、スキーマに基づいてタイプセーフに問い合わせができるなどのメリットがあります。 上記のように、全体的にユーザーに高い生産性を提供するという点が強く意識されている印象です
ネックな点
2024現在、まだメジャーリリースされていない
これについてはTypeORMはEntitySchemaという機能を提供していて、これを使えば一応デコレータやDecorator metadataに依存せずにマッピングを定義することも可能です (ただし、この機能はあまり使用されていない印象はあります) 以下のような特徴があり、比較的幅広いニーズなどを想定して開発されている印象があります
EntitySchemaによりデコレータを使用せずにマッピングを定義可能
また、これによりドメインモデルからマッピング定義を切り離すことができる ただ、ネックな点にもあげましたが、Sequelizeなどと比較した際にまだメジャーリリースされていないことなどもあり、少しリスキーな部分もあるかもしれないです。 マッピングの定義方法
また、TypeORM同様、EntitySchemaを使用することで、マッピング対象のクラスとマッピングの定義を分離することも可能 insertGraphやupsertGraphなどの機能が強力な印象
比較的大規模なOSSで採用実績があるのは大きいものの、2021年でコミットが止まっていそうではあります Prismaとはおそらく以下のような点などで差別化が狙われているのではないかと推測しています 今後、APIに破壊的変更などが入る可能性などもまだあるかと思います
〜2015年くらいまでは、おそらくRailsなどのコミュニティから影響を受けて登場したと思われるORMが主流であった印象 例)
2015年くらいからは、TypeScriptの採用が少しずつ増え始めたことにより、それらをより活用しやすいORMが少しずつ増えていった印象です 例)
2020年ごろから、ORMというよりはどちらかというとより軽量なクエリビルダーのようなライブラリが徐々に増えつつあるようです 例)
上記ライブラリの共通点として、TypeScriptでの活用を念頭に起きつつ、DTOへのマッピングのみをサポートするシンプルな仕組みが採用されています 背景としてはおそらく、以下のあたりがあるのではないかと思います
Node.jsがサーバーサイドで選択される際のユースケースの一つとしてWebサービスのバックエンド以外にも、Next.jsやRemixなどを使用したWebサイトでの採用も結構な割合で存在するのではないかと思っていて、そういった場合、重厚なORマッピングの仕組みがなくとも十分にワークする この場合、タイプセーフにクエリを書ければ十分というケースが多く、こういったライブラリの使用が適している場合が多いのではないかと思います
こういったORMはNode.jsでバックエンドをモノリシックなアーキテクチャに従って開発していくような場合は、依然として需要は残り続けるのではないかと思います 採用基準について
使用率・安定性
Prismaについても安定して一定間隔ごとにリリースが継続されている印象です アプリケーションのアーキテクチャについて
Sequelizeについては、以下のような理由もあり選択肢としては比較的無難な気がしています 現在も継続してメンテナンスや開発、改善が行われている
また、将来的にはPrismaが一番人気なORMになる(=>エコシステムやコミュニティが充実している)可能性も結構ありそうな気はしているので、それを見越した上でPrismaを採用しておくのもありなのかもしれません Drizzle ORMも勢いはありそうではあるものの、2024/05時点ではメジャーリリースされていない点がネックだとは思います 対象ドメインが複雑な場合は、こういったスタイルとは相性が良いでしょう。しかし、Next.jsやRemixなどを使ってWebサイトを作りたい、というケースではやや過剰になる場合もあるかもしれません。 ただし、そもそもNode.jsはこういったスタイルの開発が向いていないような気も個人的にはしていて、こういったきっちりと設計をして開発を進めていきたいようなケースでは、JVMや.NET系の言語などを採用した方がやりやすいような気もしています (JVMや.NET系の言語と比較すると、どうしてもORMやフルスタックフレームワークの成熟度がやや追いついていない印象を受けるため) 採用するデータベースについて
クエリをタイプセーフに記述したいかどうか?
なので、もしSequelizeなどのORMを採用している既存のプロダクトがある場合でも、無理にPrismaなどへORMそのものを移行するというよりは、これらのライブラリを併用した方がコストを抑えられる可能性もあるかもしれません また、CQRSなどの考えに基づいて考えると、ORMの必要性が高いのはどちらといえばコマンドのレイヤーになるのではないかと思います。無理にORMだけで複雑なクエリを構築しようとするよりも、部分的にこういったライブラリを採用し、用途に応じて使い分けた方が結果として実装がシンプルになるケースもあるかもしれません (ORMだけであらゆることを実現しようとする必要はない) ただし、その場合はORMとそれらのライブラリとの間でコネクションプールを共有するなど、少し工夫は必要になるかもしれません パフォーマンス
2024/07時点の情報です
関連ページ