📘

Facebook社製ORM ent選定理由、v1へのロードマップ

2022/01/06に公開

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 を導入している企業

Facebook

本番環境の複数のチームおよびプロジェクトで使用されています。
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.

https://github.com/ent/ent#about-the-project

メルカリ

結論から言うと私のチームではentを使用することに決めました。 entはGoのためのエンティティフレームワークで、テーブルのスキーマやDBへの読み書きを静的に型付けされたGoのコードとして自動生成することができ、SQLを一切書かずにGoのコードのみでデータベースクエリやグラフトラバーサルを容易に行うことができます。

https://engineering.mercari.com/blog/entry/20211205-44a97f0e1c/

ソウゾウ

データベースは Microservices がそれぞれ独立して管理しています。メルカリShops では、PostgreSQL を採用しました。スタート初期は CockroachDB を検討していましたが、 Go で採用した ORM である ent が対応していなかったのと、Cloud SQL での運用を優先し、 PostgreSQL を選択しています。今後 CockroachDB への移転を検討しています。

https://engineering.mercari.com/blog/entry/20210810-mercari-shops-tech-stack/

entの採用理由

採用理由

  • 開発元がFacebookと信頼でき、v1へのロードマップもちゃんとしている
  • ドキュメントが充実している
  • Goで単一コードで、スキーマ定義できる
    • migrationのバージョン管理は、デプロイイメージのバージョンと対応させてる
    • CloudRunにCloudSchedulerから、migrationエンドポイントを呼んでる
  • 型安全にSQLクエリを書ける
  • MySQLに対応している
  • GraphQLと相性が良い
  • 基本的なDB操作(transactionなど)は、機能十分である。
  • DBからの新規開発においては、かなり低コストで開発ができる。

短所

  • 論理削除未対応
    • issueはあがっているが、未対応
  • 複雑なクエリを実装する際は、ちょっと大変
    • gqlgen dataloaderを使っているので、複雑なクエリ実装はほぼない。
  • 既存のDBがあって、そのスキーマに合わせて実装するのは辛そう
    • idがuuidだったり、、、
  • 日本語の記事はあまりない
    • 開発での調べごとは、公式ドキュメント(日本語)に無い場合は、Github Issue(英語)を読む必要がある

v1へのロードマップ

Github issueに上がっているロードマップを噛み砕いてリストアップしました。

手早く初めたい

公式が日本語で分かりやすい!
https://entgo.io/ja/docs/getting-started

あとは、使ってみた系の記事を読むのも良いかと思います。
https://future-architect.github.io/articles/20210728a/
https://zenn.dev/masamiki/articles/83a8db3f132fcb1c48f0

GraphQLライブラリgqlgenを使う

GraphQLを扱う際は、entのGraphQLインテグレーションを使うことをオススメします。
entは、gqlgenをintegrationとして扱うことができます。
v1のロードマップでも言及されていますが、gqlgenとのintegrationは、今後も機能拡充されていく方針です。

https://entgo.io/ja/docs/graphql

おわりに

Facebook社製のORMであるentについて、まとめました。

entはまだ発展途上ですが、すでにいくつかのプロジェクトに採用されております。
特に、新規プロジェクト(DBスキーマ定義から新規作成)においては、entを採用する価値が大いにあると思います。
是非entを検討してみてください。

twitterでも情報発信しているので、良かったらフォローお願いしますmm
https://twitter.com/kenbu05

参考

https://entgo.io/ja/docs/getting-started
https://github.com/ent/ent
https://github.com/ent/ent/issues/46

Discussion