GraphQL + NewSQL!? FaunaDB を試してみる。

こんにちは k-jun です。今回は Spanner の論文から派生した NewSQL の一種 FaunaDB を試してみたいと思います。

https://fauna.com/

どうやら、DB 自体は OSS ではないようですね。DB という主要コンポーネントを特定のベンダーに頼る点は結構マイナスですがやっていきます。 せっかく Spanner から派生しているのになんだかもったいないですね。

Setup

こちらチュートリアルに従っていきます。

f:id:K-jun1221:20211125065822p:plain

サインアップ後のダッシュボードはこんな感じ。データベースを作っていきます。

f:id:K-jun1221:20211125070119p:plain

サンプルのデータを突っ込んだ状態でデータベースを作成しました。中身がダッシュボードからでも確認できるようで、Json らしきものが確認できます。 インデックスの仕組みもあるようで、他の DB 同様に肝となる箇所です。

ドキュメントを参照する限りではインデックスは作り放題みたいに書いてありますが、本当かしら。

you can have hundreds of indexes without affecting overall performance.

f:id:K-jun1221:20211125070556p:plain

FQL と呼ばれる軽いデータ整形関数を DB にて記述できるようです。MySQL での Function なんかに相当するものでしょうか。かゆいところに手が届くといいですね。

f:id:K-jun1221:20211125070637p:plain

Run

ではでは、実際に Query を発行して取得結果を見ていきます。

f:id:K-jun1221:20211125070954p:plain

この Paginate 関数はやばいですね。ページネーションはアンチパターンがあったりといろいろとめんどくさいですし。これ、MySQL にも欲しいなー。

f:id:K-jun1221:20211125071052p:plain

これも表現のレベルが高度。Paginate の 結果を key としてその詳細情報を取ってきて関数に渡しているようですね。かなり面白いです。

f:id:K-jun1221:20211125071230p:plain

GraphQL の Interface 経由でアクセスできることも見ていきます。リンクはこれ

データベースを作成。

f:id:K-jun1221:20211125075924p:plain

スキーマを GraphQL 形式で記述していきます。

$ cat ~/Desktop/schema.gql
type Todo {
   title: String!
   completed: Boolean
}

type Query {
   allTodos: [Todo!]
   todosByCompletedFlag(completed: Boolean!): [Todo!]
}

作成したスキーマを食わせたところ、見知った画面が開きましたね。

f:id:K-jun1221:20211125080136p:plain

mutation で document も生成できていそうです。

f:id:K-jun1221:20211125080226p:plain

使い勝手は完全に GraphQL ですね。チュートリアルを実行した限りでは、NewSQL の何たるかが全く伝わってこなかったので少し調べてみます。

https://docs.fauna.com/fauna/current/comparisons/compare-faunadb-vs-dynamodb

DynamoDB との比較記事があったのでざっと読みましたが、以下以外に特徴はなさそうだと感じました。

  • GraphQL の Interface をサポートしている
  • Index へのデータタイプが制限されず柔軟
  • ACID トランザクションをサポート

比べるべきは Spanner などであって、DynamoDB ではないはずですね。ここらへん のスター数も微妙ですし、OSS でないことも相まってそこまで活発的ではないのかもしれません。 TiDB や、CockroachDB の利点の一つにベンダーロックインされる Aurora, Spanner と違って、OSS ってのがあるのでやっぱり重要ですよね...。スケールするのかどうかも微妙。

それでは今回はこの辺で。