事の経緯
最近Nuxt.jsを使用するにあたり、ORMに何を利用するか?ということを検討していた。
そもそもこれまでsequelizeを使用しており、ある程度の成約はあれどそこまで苦慮することはなかったためそのままでも良いかなと思っていたが、nuxt3の導入記事などでprismaというものを採用している記事が多く、気になって調べてみた。
ORMって何?
wikipediaの説明そのままだが、Object-relational mappingの略であり、SQLを書かかずにクエリを生成してくれる点となる。
これの何が嬉しいかというと採用しているDBへの意識を最小限に抑えることができる点に大きくメリットがあると考える。
多くのレジェンドシステムが眠る企業では、DB2やSQL Serverなどを利用しているだろう。
その中でライセンスに関する課題などの諸事情により、無償のオープンソースデータベースへの転換を考えている場合、移行できない関数やクエリが存在する。
例えば、SQL ServerのTopはPostgresqlのlimitに置き換えが必要な点など。
アプリケーション層にこのようなDBの仕様に左右される実装が存在してしまうと、DBの変更やメジャーバージョンを大きく変更する際に検討事項が多く、手間がかかってしまうことであろう。
ここからは個人的になので反感を買うかもしれないが、SQLをアプリケーションに記載すること自体にあまり美しさを感じないため、ORMでの実装をすべきと考える次第である。
クエリがかけなくてもデータベース操作ができる!というわけではなく、SQLそのものの基礎知識、データベースそのものへの基礎知識はあってこそ利用できるものであるという前提で利用すべきであろう。
sequelizeって?
細かい歴史まで調べているわけではないが10年以上から活躍しているORMとなる。
現在の活躍している中では一番といってもいいくらい古株ではないだろうか?
そのため、関連する記事の数も多く存在するため開発はしやすいと考える。
個人的に不便さを感じていたところは複合キーによるjoinが(少なくとも簡単に)できなかったこと、モデルの生成がsequelize-autoを使用する必要があること(別なモジュールを導入する必要があること)、Associationの実装はsequelize-autoでモデルを作成したあと、ひと手間加えなければできなかったこと(正解にたどり着けていないだけかもしれません)にありました。
prismaって?
歴史が浅いORMではありますが、上記sequelizeで抱えていた不便さを払拭できました。
標準でモデルの自動生成はできる、複合joinができる、外部キーの成約も自動でつくと感動を覚えた記憶があります。
またtypescript向けである点にも共感を持てるため今後の発展にも期待が持てます。
一方これらのメリットは適切なテーブル定義のもとで得られます。
ただ、sequelizeについても同様ですが、サブクエリを必要とする場合はやや力技になりがちです。
どちらを使ったほうがいいの?
圧倒的にprismaなのですが、typescriptについてもそれなりな癖があるため、ES6などで開発する場合にはsequelize(または他)、typescriptで開発する場合はprismaが良いのではないでしょうか。
typescriptの将来性は高いと思いますので、時間に多少のゆとりがあり、新規での開発の場合はtypescriptへの挑戦も含めてprisma導入が好ましいと思います。