- 1年ほど使っていて、可能な限りすべてのプロジェクトをEdgeDBに置き換えた
- EdgeDBはPostgresの上に作られたGraph/Relational DB
→ 既存のエンジンをそのまま使っているが、ユーザー視点ではすべてが変わっている。最大の変化はクエリ言語とツール類(Tooling)
クエリ言語
- EdgeDBにはSQLがなく、独自言語のEdgeQLを使うのだが、これがゲームチェンジャー
- 一度使ってみると、もう二度とSQLに戻りたいとは思わない
→ 強力な型、オブジェクト指向、ディープクエリが非常に簡単で、人がデータをクエリするときの思考法にうまく対応している(人はJOINするやり方で考えたりはしないので)
- 以前からSQLのファンではなかったが、実際には代替がなかった
- 素晴らしい本スタイルのチュートリアルとともに数日学んで練習したら、DBスキーマのモデリングが楽しくて軽い作業だと分かった
→ SQLの複雑さが消え、SQLがクエリ言語としてどれほど非効率で奇妙かが分かるようになった
- EdgeQLは学びやすく、クイックスタートと概要だけで80%ほど習得できる
- EdgeQLがあまりに気に入っているので、独立した標準になってほしい。たとえばファイルベースDBでEdgeQLが使えるEdgeDBLiteのようなものが出てほしい
ツール類
- バイナリひとつで何でも実行できる最近のパターンに従っている (go や flutter のように)
→ サーバーのインストールと更新、DBの作成/削除、REPL、マイグレーション、バックアップ & プロジェクト管理など
→ そして、ほとんどの場合 "It Just Works"
- EdgeDBはDBとのインタラクションの方法を再発明した
→ "Project" コンセプトでDBに自動接続し、DSNや設定に関係なくそのまま動く
→ 10年以上も localhost に root access 権限を与えるための正確なSQLコマンド を探し回っていたのと比べると、とても爽快
機能
- とても簡単な many-to-many 関係モデリング
- 組み込みGraphQL (フロントエンドから直接接続可能)
- Computed属性
rating := math::mean(.ratings.score)
- backlinks : リンクを逆方向にたどる
→ select User.<author; Userが author という名前のフィールドで接続されているテーブルから検索
- uuid, collection, scalar, abstract およびさまざまな型 (私のお気に入りは cal::local_datetime)
- inheritance, constraints と Introspection のような強力なもの
これまでの経験
- 1年ほど前から使っている。最初は小さな個人プロジェクトを移行し、その後会社のプロジェクトのひとつも移行した
- 私の作業の多くは小規模で実用的なユーザー向けサービスなので、しばしば一人で担当しつつ最適なツールを選べるという贅沢ができた
- EdgeDBを使っている間の大半は "It Just Works" な体験だった
- たいていのことは簡単に見つけられ、素晴らしいドキュメントがあるので探しやすい(本当に、私が見た中でも最高のドキュメントサイトのひとつ)
本番運用に向いているか
- 昨年の秋から「本番で使用中」
- 人によっては「本番で使用中」という言葉に「実際に使っている」以上の意味を持たせることもあるが..
- コマンドラインツールがリファクタリングされた際に自動化スクリプトを少し変更したが、大事ではなかった
- 心の中ではアーリーアダプターとしてのリスクへの代償を払う覚悟をしていたが、今のところ問題はない
EdgeQLの表現力
- これまでSQLについてググったり、ORMの制約や回避策を探し回ったりしていたことから解放された
- EdgeQLはDBで見つけたいものだけをぴったり表現でき、実際に読んで理解できる (他の開発者でも)
- EdgeQLのおかげで、トランザクションすら避けられることがある。単一クエリの中で多重ネスト更新も可能
→ "Simplicity is complicated"
Migrations
- 最もクールなことのひとつは、マイグレーション機能が組み込まれていること
- スキーマを変更して
edgedb migration create を呼び出すとマイグレーションファイルが生成され、
サーバーで edgedb migration apply を実行するだけですぐ適用される
- マイグレーションはハッシュでつながっているため、ランダムにひとつだけ適用して全部壊すようなことはない
- 新しいマイグレーション作成時のデフォルトはインタラクティブで、コマンドラインですべての変更について確認を求められる
パフォーマンス
- 私は大規模なデータを扱うわけではないので、高性能なDBは必要としていない
- ただし下層でPostgresを使っているので、他のDBと比べて性能面で問題にはならない
- EdgeDB自体はPythonで書かれている(Goだと良かったが、開発者たちはPythonにより慣れているようだ)
Goクライアントライブラリ
- 私はGoを使っているので、EdgeQL向けのネイティブGoライブラリがあるのは良かった
- Typescript/Javascript、Python、Go向けの公式ライブラリがあり、.Net と Elixir はコミュニティがサポートしている
アップグレード
- EdgeDBはサーバーバージョンや更新に関する複雑さを抽象化している
- EdgeDB CLIが基本的に自動で処理してくれる。新しい更新があれば表示してアップグレードする
→ 疑わしいほどスムーズ
- 現在は2.0 RCが出ているが、まったく心配していない。これまでの経験から、安全で簡単だと信じられる
コミュニケーションとサポート
- アーリーアダプターとして、公式EdgeDBチャネルで非常に速い返答と支援を受けられていることに満足している
EdgeDB 2.0
- 明日リリースされる2.0では良い機能が追加される
- EdgeDB UI : ビジュアルスキーマエディタ、REPLなどを含むWebアプリ
- グループクエリ、グローバルスキーマ変数、オブジェクト単位のセキュリティ、Direct EdgeQL over HTTP など
気に入らない点や心配な点
- 互換性への約束
- これまではどれも良かった。互換性を壊さないマイナーアップデートだった
- 互換性への約束(commitment)を示してくれると良いと思う
- 増え続ける機能セット
- すでに私が望む以上に多くの機能があるが、さらに増え続けている
- EdgeQLが強力になるほど、DBとサーバーの境界が曖昧になりながら、「これはバックエンドに入れるべきか、それとも賢いDBスキーマに入れるべきか」と悩むようになる
- 組み込みHTTPサーバーを使って、大半のプロジェクトでバックエンドサーバーを完全に置き換える方向へ推すのは理にかなっているように見えるが.. この素晴らしいクエリ言語とエンジンを備えた安定したDBが欲しい
- ともかく、EdgeDBが安定的で一貫性を保ちつつ、機能が増えすぎないことを願っている。現在の機能セットだけでも素晴らしい
結論
- 今後のプロジェクトでは従来のRDBを検討するつもりはない
- SQLに戻るのは、Flutter から Ncurses に行くとか、Goからアセンブリ言語に戻るのと同じだ
- 私にとって、EdgeDBはこの20年のDB分野で最大の進歩だ
- 今後さらに経験を積めば変わるかもしれないが、1年以上使ってきてこの喜びを損なうことは何ひとつなかった
- 使えば使うほどEdgeDBを信頼するようになる
- EdgeDBチームがEdgeDB自体と言語、Webサイト、ツール、コミュニティ作りなどにおいて成し遂げてきたことは非常に印象的だ
→ "Mad respect to the team"
- そして彼らはまだようやくウォームアップを始めたばかりのように見える
10件のコメント
おかげで edgedb を知ることができて、とても便利に使っています!ありがとうございます〜
Prismaと似た道を進んでいるように見えますね。Prismaを便利に使っていますが、パフォーマンス面では惜しい点が多いので、ベンチマーク結果には少し惹かれます。
文法はあまり自分の好みではありませんが……(protobufも使っていますが、変換のサンプルコードもちょっと……)
皆さんはこういうGraphQLっぽい文法を好まれるのでしょうか? 自分としては、結局バックエンドはRDSなので途中で変換することになるはずで、それが明確に見えないと少し敬遠してしまうタイプです……
この投稿を見て興味が湧き、引き続き勉強しています。
ただ、まだ初期段階だからか、行き詰まった部分が出てきても検索結果があまり見つからないですね。
Discordチャンネルはあるのですが、国内の開発者同士で気軽に質問や回答ができるといいと思い、オープンチャットを1つ作りました。
https://open.kakao.com/o/gtGY0Gve
私も使ってみたくてメモしておきました。
この記事とチュートリアルを最後までやってみたら、ますます説得力があると感じました。
興味深いですね。SQLのない世界にはもう戻れないとは……
興味がありますね
印象的です!
graphdb系では ArangoDB に関心を持っていましたが、EdgeDB も一度見てみようと思います
ものすごい称賛ですね。7/28 午前10時(PT)に 2.0 を発表するそうです。
EdgeDB 1.0 リリース
EdgeDB - 開発者のための次世代オープンソース ORDB