SequelizeとPrisma
開始
現在、eBayでは、内部ツールをMongoDBからPostgresに移行しています。非常に難しいプロジェクトですが、私はそれに立ち向かうことに興奮しています。調査を行った結果、私たちのコードベースにはORMを使用するのが最適であると判断しました。なぜなら、コードベースはすでにMongooseを使用するように設計されていたからです。しかし、今の課題は、どのORMが私たちのコードベースに最適かということです。このブログでは、その質問に深く掘り下げていきます。雇用主との契約の性質上、すべてを開示することはできないことに注意してください。
要件
プロジェクトのニーズを慎重に分析した結果、どのORMソリューションも満たすべき以下の重要な基準を確立しました:
- JavaScriptパッケージであること;ほとんどのコードがJavaScriptで書かれているため
- Postgresとそのほとんどの機能をサポートすること
- パフォーマンスがMongooseと同等以上であること
- オープンソースであり、メンテナンスされていること
ORM
多くの調査を行った結果、要件に合致するトップ3のORMは、Sequelize、Prisma、およびTypeORMであると判断しました。最終的に、私はSequelizeとPrismaに焦点を当てることに決めました。なぜなら、締切のために3つの異なるORMを完全にテストする時間がなかったからです。
テスト環境
私のテスト環境では、Dockerを通じてPostgresを実行しました。私たちの最大かつ最も複雑なデータセットを取得し、それをドキュメント構造からテーブル構造に変換し、ローカルのPostgresインスタンスに追加しました。データセットは、カラム、1対1の関係、1対多の関係、およびいくつかの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は「昨日」に最後に更新され、4.2kのフォークと27.9kのスターを持っている。
- SequelizeはMITライセンスを持ち、10年以上オープンソースである。したがって、今後もオープンソースであり続ける可能性が高い。
短所:
- モデル/スキーマの表現は非常に複雑で膨大になる可能性がある。例えば、私たちの大規模データセットのMongoose表現は約262行(スペースを含む)でした。同じデータセットをSequelizeで表現すると564行(スペースを含む)になります。
- Sequelizeの構文は、特定のケースで非常に混乱し、複雑になる。
- データベースの移行(編集)は非常に面倒である。sequelize-cliを使用してJavaScriptの移行テンプレートスクリプトを生成できますが、これはほとんどすべてのORMで同じケースのようです。リレーショナルデータベースでの移行は、ほとんどの場合簡単ではありません。
- ドキュメントはあまり良くない。改善されてきたが、まだ作業が必要である。しかし、ChatGPTのようなツールがあるため、これは以前ほど大きな問題ではなくなっている。ChatGPTはSequelizeについて非常に良い理解を持っている可能性が高いからです。
- SequelizeはPrismaと比較して型に敏感ではなく、問題を引き起こす可能性がある。
- TypeScriptをうまくサポートしていない。私のプロジェクトには問題ありませんが、他の多くのプロジェクトには大きな問題になる可能性があります。
Prismaの長所と短所
長所:
- 独自のスキーマ言語を持っている。これにより、スキーマ/モデルをより簡単かつクリーンに作成できる。例えば、私たちの大規模データセットのMongoose表現は約262行(スペースを含む)でしたが、Prismaで表現した同じデータセットはわずか221行(スペースを含む)でした。
- Prismaには、データベースの作成と移行(変更)を容易にするCLIツールがある。これは非常に便利です。銀の弾丸ではありませんが、これまで見た中でORMからの最良のものです。
- 生のSQLクエリをサポートしている。
- Prismaのコードはクリーンでシンプルです。Prismaの構文を学び、理解する必要がありますが、Sequelizeの構文よりもはるかに理解しやすいです。
- Prismaには、Node.jsとTypeScriptのために自動的にクエリビルダーを生成するクライアントがあります。
- ドキュメントは非常に良好でクリーンです。ChatGPTはまだ助けてくれますが、Sequelizeほど最新ではありません。
- 2023年5月15日現在:
- NPMでは、Prismaは「6日前」に最後に更新され、週に1,344,705回ダウンロードされている。
- GitHubでは、Prismaは「3時間前」に最後に更新され、1.1kのフォークと31.3kのスターを持っている。
短所:
- Postgresのための正規表現フィルタリングをサポートしていないが、「contains」、「includes」、「startsWith」フィルタオプションはある。
- 私のテストから、PrismaはPostgresでの大規模データセットのエントリを作成するのが著しく遅い。Sequelizeはその大きなエントリを約2.26秒/エントリ(JSONファイル)の速度で作成しました。一方、Prismaは約11.21秒/エントリ(JSONファイル)の速度でした。これらの結果に基づくと、PrismaはこのタスクでSequelizeよりも約5倍遅いです。
- また、大規模データセットから1つのエントリを削除するのに、ほぼ4分の待機時間がかかり、非常に悪いです。
- Sequelizeは、私のテストで最も大きく複雑なデータセットのエントリを削除するのがはるかに速かった。データセットの構築に関しては、SequelizeはPrismaに対して優位性を持っていませんでした。両方ともこの大規模データセットのために3層の深い関係に対処しなければならなかったので、公平な比較だったと言えます。
- Prismaはスタートアップであり、56.5百万ドルの資金を持つ営利企業です。これを知っていると、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