Sequelize と Prisma

はじめに

現在、eBay では社内ツールを MongoDB から Postgres に移行しています。これは非常に難しいプロジェクトですが、正面から取り組むことにわくわくしています。調査の結果、私たちのコードベースでは、コードベース自体がすでに Mongoose を使うように設計されていたため、ORM を使うのが最善だと判断しました。しかし今の課題は、どの ORM が私たちのコードベースに最適なのかということです。このブログでは、その問いについて掘り下げます。なお、雇用主との契約上の性質により、このブログではすべてを開示できないことをご承知おきください。

要件

プロジェクトの要件を慎重に分析した結果、どの ORM ソリューションにも満たすべき以下の必須基準を定めました。

  • JavaScript パッケージであること。コードの大部分が JavaScript で書かれているため
  • Postgres とその主要機能のほとんどをサポートしていること
  • 性能が少なくとも Mongoose と同等、またはそれ以上であること
  • オープンソースであり、かつ保守されていること

ORM

かなり多くの調査を行った結果、要件に合う上位 3 つの ORM は SequelizePrisma、および 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 のようなことをしてきても驚きはしない。

出典