TypeORMの未来とMikroORMの現在
Intro
TypeORM
Misskeyのデータベースを支えるORM、TypeORMですが、7ヶ月ほど全く動きがなく、存続が危ぶまれていていました。
しかし最近TypeORMの未来について以下のページが追加されました。
詳しい経緯や内容はuki00aさんがまとめているので、以下の記事を参照してください。
さらに詳しい経緯や内容は以下のIssueを参照してください。
12月25日現在は主にCIやドキュメント周りの改善を行っているようです。
MikroORM
またTypeORMと設計が比較的似ているMikroORMも、今回の移行先としてよく話題に上がっていました。
TypeORMは、Active RecordパターンとData Mapperパターンの両方をサポートしますが、MikroORMはData Mapperパターンに特化しており、リポジトリを使ったデータ操作を推奨しています。
長らくknex.jsというクエリビルダに依存していましたが、来年リリースされる予定のMikroORM v7では依存関係から取り除かれる予定です。
詳しい機能や特徴はuki00aさんがまとめているので、以下の記事を参照してください。
せっかくなので、MikroORMで使用される列挙型に関連した内容を説明します。
これらの列挙型は、MikroORMの内部で定義された特定の機能や挙動を制御するために使用されます。
Cascadeは、エンティティの関連操作(挿入、更新、削除など)を自動で他の関連エンティティに伝播させる設定です。
ALL, PERSIST, MERGE, REMOVEの中から選択できます。
LoadStrategyは、関連エンティティのロード方法を制御します。
Batch Loadingなselect-inと、Eager Loadingなjoinedから選択できます。
GroupOperatorは、ANDやORといった、複数の条件を組み合わせる際に使用される論理演算子です。
IsolationLevelは、データベーストランザクションの分離レベルを設定します。
NodeStateは、エンティティの状態を表します。
ReferenceKindは、エンティティのリレーションシップの参照方法を指定します。
ChangeSetTypeは、エンティティの変更内容を示します。
DataloaderTypeは、データローダーの種類を定義します。
EventTypeは、MikroORMでのイベントの種類を表します。
DeferModeは、遅延処理のモードを制御します。
FlushModeは、データのフラッシュ方法を制御します。
LockModeは、データベースロックの種類を制御します。
PopulateHintは、エンティティの関係をロードする際のヒントを提供します。
PopulatePathは、エンティティの関係ロード時に使用する具体的なパスを指定します。
QueryFlagは、クエリ実行時のフラグを設定します。
QueryOperatorは、クエリ条件に使用される演算子を表します。
QueryOrderは、ASCやDESCといった、クエリ結果の並び順を指定します。
QueryOrderNumericは、ASCやDESCといった、数値的な順序指定を行います。
これらの列挙型は、MikroORMを使用してデータベース操作を効率化し、挙動をカスタマイズする際に重要です。
それぞれの目的に応じて適切に使用することで、コードの可読性や柔軟性を向上させることができます。
他にもCLI, Entity Generator, Migrations(umzug), Reflection(ts-morph), Seederなど基本的なツールは一通り揃っています。
Outro
TypeORMとMikroORMの比較(ChatGPTで生成)
| 特徴 | TypeORM | MikroORM |
|---|---|---|
| 型サポート | TypeScript対応だが型安全性は限定的。型推論のサポートは弱い。 | TypeScript専用設計で型安全性が高い。強力な型推論と補完を提供。 |
| 学習コスト | 比較的低い。デコレーターを使った直感的な構文で学びやすい。 | やや高め。Data Mapper専用で設計思想の理解が必要。 |
| パフォーマンス | 標準的。シンプルなユースケースには十分対応。 | 高速で効率的。キャッシュや最適化機能により大規模なプロジェクトにも対応。 |
| 設計パターン | Active RecordとData Mapperの両方をサポート。 | Data Mapper専用。リポジトリを使った設計が基本。 |
| データベース対応 | SQLデータベース(MySQL, PostgreSQL, SQLite, etc.) | SQL(MySQL, PostgreSQL, SQLite, etc.)とNoSQL(MongoDB)も対応。 |
| モジュール性 | 全機能が一体化されているため柔軟性は限定的。 | モジュール構成で必要な機能だけを選択可能。軽量化しやすい。 |
| クエリビルダー | 基本的なクエリビルダーを提供。複雑なクエリにも対応。 | 高度なクエリビルダーを提供。効率的かつ柔軟なクエリ作成が可能。 |
| マイグレーション | スキーマ変更を管理するマイグレーション機能を提供。 | マイグレーションツールが高性能で、スキーマ生成や更新が容易。 |
| エコシステム | 利用者が多く、公式ドキュメントやコミュニティサポートが充実。 | 新しいツールだが成長中。公式ドキュメントが充実している。 |
| ユースケース | 小~中規模プロジェクトやシンプルな要件に適している。 | 中~大規模プロジェクトや高いパフォーマンス要件に適している。 |
TypeORMの未来とMikroORMの現在について解説してみました。
ぜひTypeORMやめる時の参考にしてみてください。
Discussion