Facebook社製ORM ent選定理由、v1へのロードマップ
Facebook社製ORM ent
の選定理由・v1へのロードマップをまとめました。
entの日本語記事がまだ少ないので、少しでもent
について知っていただければと思って書きました。
著者は本業・個人開発共にORMとしてent
を採用しています。
entとは?
GolangのORM(Object-relational mapping)です。
ent はGoのためのシンプルかつ強力なエンティティフレームワークです。このフレームワークを使うことで,大量のデータモデルをもつアプリケーションのビルドとメンテナンスを簡単に行うことができます。
by https://entgo.io/ja/docs/getting-started
特徴
- データベーススキーマをグラフ構造として簡単にモデル化
- 型安全にsqlクエリを書ける
- コード生成に基づく静的型付け
- データベースクエリおよびグラフトラバーサルの記述が容易
- まだversion 0系にもかかわらず、Githubスター数が9600もついており、Facebookやメルカリでも採用されている
- Facebookにて、開発が盛んでありv1へのロードマップも公開されている
ent を導入している企業
本番環境の複数のチームおよびプロジェクトで使用されています。
a8mとalexsnのチームが開発・保守してくれています。
The ent project was inspired by Ent, an entity framework we use internally. It is developed and maintained by a8m and alexsn from the Facebook Connectivity team. It is used by multiple teams and projects in production, and the roadmap for its v1 release is described here. Read more about the motivation of the project here.
メルカリ
結論から言うと私のチームではentを使用することに決めました。 entはGoのためのエンティティフレームワークで、テーブルのスキーマやDBへの読み書きを静的に型付けされたGoのコードとして自動生成することができ、SQLを一切書かずにGoのコードのみでデータベースクエリやグラフトラバーサルを容易に行うことができます。
ソウゾウ
データベースは Microservices がそれぞれ独立して管理しています。メルカリShops では、PostgreSQL を採用しました。スタート初期は CockroachDB を検討していましたが、 Go で採用した ORM である ent が対応していなかったのと、Cloud SQL での運用を優先し、 PostgreSQL を選択しています。今後 CockroachDB への移転を検討しています。
entの採用理由
採用理由
- 開発元がFacebookと信頼でき、v1へのロードマップもちゃんとしている
- ドキュメントが充実している
- Goで単一コードで、スキーマ定義できる
- migrationのバージョン管理は、デプロイイメージのバージョンと対応させてる
- CloudRunにCloudSchedulerから、migrationエンドポイントを呼んでる
- 型安全にSQLクエリを書ける
- MySQLに対応している
- GraphQLと相性が良い
- GraphQLライブラリは、extemtionとして設定できるgqlgenを使っています。
- 基本的なDB操作(transactionなど)は、機能十分である。
- DBからの新規開発においては、かなり低コストで開発ができる。
短所
- 論理削除未対応
- issueはあがっているが、未対応
- 複雑なクエリを実装する際は、ちょっと大変
- gqlgen dataloaderを使っているので、複雑なクエリ実装はほぼない。
- 既存のDBがあって、そのスキーマに合わせて実装するのは辛そう
- idがuuidだったり、、、
- 日本語の記事はあまりない
- 開発での調べごとは、公式ドキュメント(日本語)に無い場合は、Github Issue(英語)を読む必要がある
v1へのロードマップ
Github issueに上がっているロードマップを噛み砕いてリストアップしました。
- PostgreSQLサポート
- eager loadingサポート
- override id columnサポート
- hookサポート
- bulk insertサポート
- GraphQLライブラリgqlgenとの統合 <- 今後も更に機能拡張される予定!
- privacyレイヤーサポート
- 特定のデータベース固有定義をサポート
- read時のクエリhookサポート
- マルチレベルキャッシング(実験的ソリューションariga / entcache)
- DBからの読み込みをキャッシングしてくれる
- クラスターのサポート
- readreplica読み取りなど
- 水平シャーディングサポート
- cascading deletionサポート
手早く初めたい
公式が日本語で分かりやすい!
あとは、使ってみた系の記事を読むのも良いかと思います。
GraphQLライブラリgqlgenを使う
GraphQLを扱う際は、entのGraphQLインテグレーションを使うことをオススメします。
entは、gqlgenをintegrationとして扱うことができます。
v1のロードマップでも言及されていますが、gqlgenとのintegrationは、今後も機能拡充されていく方針です。
おわりに
Facebook社製のORMであるentについて、まとめました。
entはまだ発展途上ですが、すでにいくつかのプロジェクトに採用されております。
特に、新規プロジェクト(DBスキーマ定義から新規作成)においては、entを採用する価値が大いにあると思います。
是非entを検討してみてください。
twitterでも情報発信しているので、良かったらフォローお願いしますmm
参考
Discussion