Sequelize と Prisma
はじめに
現在、eBay では社内ツールを MongoDB から Postgres に移行しています。これは非常に難しいプロジェクトですが、正面から取り組むことにわくわくしています。調査の結果、私たちのコードベースでは、コードベース自体がすでに Mongoose を使うように設計されていたため、ORM を使うのが最善だと判断しました。しかし今の課題は、どの ORM が私たちのコードベースに最適なのかということです。このブログでは、その問いについて掘り下げます。なお、雇用主との契約上の性質により、このブログではすべてを開示できないことをご承知おきください。
要件
プロジェクトの要件を慎重に分析した結果、どの ORM ソリューションにも満たすべき以下の必須基準を定めました。
- JavaScript パッケージであること。コードの大部分が JavaScript で書かれているため
- Postgres とその主要機能のほとんどをサポートしていること
- 性能が少なくとも Mongoose と同等、またはそれ以上であること
- オープンソースであり、かつ保守されていること
ORM
かなり多くの調査を行った結果、要件に合う上位 3 つの ORM は Sequelize、Prisma、および TypeORM だと判断しました。締め切りの関係で 3 つの異なる ORM を完全にテストする時間がなかったため、最終的には Sequelize と Prisma に絞ることにしました。
テスト環境
テスト環境では、Docker を通して Postgres を実行しました。最大規模で最も複雑なデータセットを取り出し、ドキュメント構造からテーブル構造へ変換して、ローカルの Postgres インスタンスに追加しました。データセットは、カラム、一対一リレーション、一対多リレーション、そしていくつかの JSONB カラムを使って変換しました。
そこから、その特定の ORM を使う JavaScript コードを書き、以下を計測しました。
- エントリの作成にかかる時間
- エントリの更新にかかる時間
- ネストされたエントリ(リレーションおよび/または JSON 内のキーと値)を更新するのにかかる時間
- エントリの削除にかかる時間
- エントリの問い合わせ/取得にかかる時間
各 ORM テスト環境のためにリポジトリを作成しました。これらのリポジトリを共有したいのは山々ですが、技術的には eBay が所有しているため、共有することはできません。
結果
2023 年 5 月 15 日頃、Sequelize の方が私たちのユースケースに適した ORM であり、MongoDB から Postgres への移行で使用する ORM はこれだと判断しました。最終的に Sequelize を選んだ理由は次のとおりです。
- 「真にオープンソース」であり、資金提供を受けたスタートアップによって保守されていなかった。
- Postgres の機能のほとんどをサポートしていた。
- 特に Prisma と比べると、良好な性能を持っていた。
- ドキュメントも良かったが、Prisma のドキュメントほど整ってはいなかった。
Sequelize に落ち着きましたが、私がテストした各 ORM について、長所と短所の一覧も作成しました。Sequelize または Prisma のどちらがあなたのユースケースに適しているかを、より判断しやすくする助けになれば幸いです。
Sequelize の長所と短所
長所:
- sync() 関数があり、テーブルを自動的に作成・管理してくれる
- 複雑な結合(ネストされたデータ)を扱える
- 多くのフィルタリングオプション(正規表現など)をサポートしている
- モデル/スキーマ表現はクラスを使った生の JavaScript で行われ、非常にカスタマイズしやすい。
- Sequelize は選択したデータベースへの接続を処理してくれる。
- Sequelize は複数の読み取り接続をサポートしている
- 生の SQL クエリをサポートしている。
- 2023 年 5 月 15 日時点:
- NPM では、Sequelize の最終更新は「14 日前」で、週 1,505,835 回ダウンロードされている。
- GitHub では、Sequelize の最終更新は「昨日」で、Fork は 4.2k、Stars は 27.9k である。
- Sequelize は MIT ライセンスで、10 年以上オープンソースとして公開されている。そのため、少なくとも当面はオープンソースのままである可能性が高い。
短所:
- モデル/スキーマ表現が非常に複雑で肥大化しやすい。たとえば、私たちの大規模データセットの Mongoose による表現は約 262 行(空白を含む)だった。同じデータセットを Sequelize で表現すると 564 行(空白を含む)になる。
- Sequelize の構文は、特定のケースで非常にわかりにくく、複雑になる。
- データベースの移行(編集)は非常に面倒である。sequelize-cli を使って JavaScript の移行テンプレートスクリプトを生成できる。だが、これはほぼすべての ORM に共通することのように見える。関係データベースでの移行は、ほとんどの場合簡単ではない。
- ドキュメントはそれほど良くない。以前よりは改善されているが、まだ改善の余地がある。ただし、ChatGPT のようなツールがあるため、Sequelize について非常に良く理解している ChatGPT のおかげで、これは以前ほど大きな問題ではない。おそらく Sequelize が 10 年存在しているためだろう。
- Sequelize は Prisma と比べて型に対する感度が高くないため、問題につながる可能性がある。
- TypeScript のサポートがあまり良くない。私のプロジェクトでは問題ないが、多くの他のプロジェクトでは大きな問題になりうる。
Prisma の長所と短所
長所:
- 独自のスキーマ言語を持っている。これにより、スキーマ/モデルをより簡単かつきれいに作成できる。たとえば、私たちの大規模データセットの Mongoose による表現は約 262 行(空白を含む)だった。しかし同じデータセットを Prisma で表現すると、221 行(空白を含む)だけだった。
- Prisma には CLI ツールがあり、データベースの作成と移行(修正)を容易にしてくれる。これは非常に便利である。万能ではないが、ORM の中で今まで見た中では最も優れたものだ。
- 生の SQL クエリをサポートしている。
- Prisma のコードはきれいでシンプルである。Prisma の構文を学んで慣れる必要はあるが、Sequelize の構文よりもはるかに理解しやすい。
- Prisma には、Node.js と TypeScript 向けのクエリビルダーを自動生成するクライアントがある。
- ドキュメントは非常に非常に優れており、整理されている。ChatGPT も役立つが、Prisma については Sequelize ほど最新ではない。
- 2023 年 5 月 15 日時点:
- NPM では、Prisma の最終更新は「6 日前」で、週 1,344,705 回ダウンロードされている。
- GitHub では、Prisma の最終更新は「3 時間前」で、Fork は 1.1k、Stars は 31.3k である。
短所:
- Postgres に対する正規表現フィルタリングをサポートしていないが、「contains」「includes」「startsWith」のフィルターオプションはある。
- 私のテストでは、Prisma は Postgres において私たちの大規模データセットのエントリを作成する速度が大幅に遅かった。Sequelize は JSON ファイル 1 件あたり約 2.26 秒の速度でその大規模エントリを作成した。一方 Prisma は JSON ファイル 1 件あたり約 11.21 秒だった。これらの結果に基づくと、この作業では Prisma は Sequelize より約 5 倍遅い。
- また、大規模データセットから 1 件を削除すると、待ち時間が 4 分近くになり、これは非常に非常に悪い。
- 私のテストでは、最大かつ最も複雑なデータセットの 1 件を削除する際、Sequelize の方がはるかに速かった。データセットの構築に関しては、Sequelize に Prisma を上回る優位性はなかった。この大規模データセットでは両方とも 3 層の深さのリレーションを扱う必要があったため、公平な比較だったと言える。
- Prisma はスタートアップである。つまり、Prisma は 5,650 万ドルの資金調達を受けている営利企業である。これを踏まえると、Prisma の主要 ORM コード/パッケージは Apache-2.0 ライセンスでオープンソースである。これは良いことだが、Prisma には投資家がいるため、ライセンスに関して MongoDB のようなことをしてきても驚きはしない。
出典
- https://www.bitovi.com/blog/battle-of-the-node.js-orms-objection-prisma-sequelize
- https://www.prisma.io/docs/orm/more/comparisons/prisma-and-sequelize
- https://github.com/prisma/prisma
- https://github.com/sequelize/sequelize
- https://www.youtube.com/watch?v=rLRIB6AF2Dg
- https://www.youtube.com/watch?v=RebA5J-rlwg
- https://www.youtube.com/watch?v=a5Wh_LDXtLc
- https://www.youtube.com/watch?v=4QN1BzxF8wM