web-dev-qa-db-ja.com

FirebaseとGraphQL?

この2つを一緒に使用した経験はありますか?

Firebase呼び出しを関連フィールドのリゾルバーに配置して、コンポーネントの小道具からクエリの引数に変数を渡すと考えられます。

ご意見をお聞かせください!

71
omgj

あなたの質問に答えるには、3つの方法があります。

1. FirebaseとGraphQL

Firebaseの使用を設定している場合は、FirebaseのAPIをGraphQLクエリとミューテーションに1対1でマッピングできます。

Firebase APIをGraphQLリゾルバに確実にラップし、そのように呼び出しを行うことができます。 これはその良い例です

const ref = path => firebase.database().ref(path)
const getValue = path => ref(path).once('value')
const mapSnapshotToEntities = snapshot => snapshot.val().map((value, id) => ({ id, ...value }))
const getEntities = path => getValue(path).then(mapSnapshotToEntities)

const resolvers = {
    Author: {
        posts(author) {
            return getEntities('posts').then(posts => filter(posts, { authorId: author.id }))
        },
    },

    Post: {
        author(post) {
            return getEntities('authors').then(posts => filter(authors, { id: authorId }))
        },
    },
};

基本的に、ここで行うことは、Firebaseをデータベースとして使用することです。これは、リゾルバでリレーショナル方式でデータをクエリするまで動作します。データストアの上にあるサーバー側で結合を実行する機能がなければ、リゾルバのFirebaseに大量のラウンドトリップリクエストを行って、1つのリクエストだけを処理することになります。

ほとんどの人がFirebaseを使用する理由は、この側面のデータリレーショナルモデリングツールがかなり不足しているため、主に単なるデータストアとしてではなく、リアルタイム機能のためです。それなら、おそらく別のデータソースを使用してGraphQLに移行する方が良いでしょう。

2.サービスとしてのGraphQLバックエンド

FirebaseのようなBaaS製品の使用にオープンであることを考慮すると、GraphQL BaaSへの切り替えを検討することもできます。

3.自己ホストGraphQL

独自のデータストアを使用して自己ホスト型ソリューションに変更する場合は、同様に多くの利点があります。ここにいくつかの大物がいます。

  • 特定のアプリのニーズに合わせて、独自のデータストア(おそらく複数)を使用する柔軟性

  • カスタムクエリと突然変異

  • APIのWebhookに接続されたマイクロサービス経由ではなく、カスタムロジックをネイティブに追加します

  • 独自の認証および許可メカニズムを実行する

  • おそらく低コストのソリューション

53
vince

ここでいくつかの推奨事項に強く反対します。 GraphQLはリレーショナルで使用できますが、NoSQLでも使用できます。 RTD(リアルタイムデータベース)とFirestoreを備えたFirebaseは、NoSQLデータベースであるため、NoSQLデータベースとしてモデル化する必要があります!このアプローチにはトレードオフがあります:

1。最適化された読み取り:

NoSQLデータベースとして、コレクションはクライアント(モバイルまたはWeb)のビューとしてモデル化する必要があります。そのため、クエリを作成すると、すべてが既にマージされ、クライアントやFirebase関数で計算された小道具を作成する必要がありません。このアプローチにより、読み取りが非常に高速になります。

2。最適化されていない書き込み:

ここでの主なトレードオフは、関連データ(ユーザー名、プロフィール写真などの更新など)に触れた場合、データベース内のすべてのドキュメントを更新することです。この場合、データベース内のすべてのドキュメント(つまり、投稿、コメントなど)を見つけて、原子性を確保する必要があります。このアプローチは、書き込み操作よりもはるかに多くの読み取り操作を行うアプリがある場合にお勧めします(ブログのように、7000読み取りから1書き込みの例)。

。簡単にスケーリング:

コレクションは他のドキュメントと強固な関係を持たないため、1つのサーバーのみで完全なコレクションを持つことも、多くのコレクションに分割することもできます。 (だから、FirebaseはDynamoDBのように拡張が安価です。)

GraphQLはクエリ言語のみです。簡単にクエリを実行できるはずですが、データベースのモデル化方法を指示するべきではありません。データベース、クエリ、および突然変異をモデル化する方法を指示する必要があります。

14
Nico

TL; DR:GraphQLは、Firebaseが足りない場所で輝いています。強力なデータモデリング、柔軟で効率的なクエリ、オープンな仕様はすべて、Firebaseに欠けているGraphQLの重要な部分です。

強力なデータモデリング

Firebaseは、その限られたデータモデリングに基づいて多くの批判を受けています。基本的に、データは同じデータを複数回記述する単一の巨大なJSONとして構造化されます。同じデータへの参照を手動でallを追跡する必要があるため、データを更新する必要があるときはいつでも、最初は便利だと思われるものが管理不能なクライアントコードになります。

一方、GraphQLで使用されるデータ構造は非常に直感的であり、グラフとしてモデル化されているため、考えるのに馴染みがあります。 IDL構文 を使用すると、GraphQLスキーマと呼ばれるデータモデルを簡単に記述できます。 Twitterアプリの場合、スキーマは次のようになります。

type Tweet {
  id: ID!
  title: String!
  author: User! @relation(name: "Tweets")
}

type User {
  id: ID!
  name: String!
  tweets: [Tweet!]! @relation(name: "Tweets")
}

ここでは、いくつかのスカラープロパティと、TweetUserの間の1対多の関係を持つ2つのタイプUserTweetを定義しました。単一のデータ項目はノードと呼ばれ、ユーザーノードは多くのツイートノードに接続できます。このデータ構造は、FirebaseのJSONアプローチを除き、シンプルで柔軟です。

柔軟で効率的なクエリ

GraphQLの柔軟なクエリ機能は、その主な利点の1つです。クエリは階層的です。つまり、グラフ構造を反映するデータ要件を指定できます。 Twitterの例では、すべてのユーザーとそのツイートを取得するクエリがあります。

query {
  allUsers {
    id
    name
    tweets {
      title
    }
  }
}

クエリしたいフィールドを自由に含めたり、除外したりすることができ、リレーションをまたいでクエリすることもできます。これは、複数のクエリを実行する必要も、不要なデータをクエリする必要もないことを意味し、GraphQLクエリを非常に効率的にします。

ミックスにクエリ引数を追加すると、カスタムオーダーやフィルターなどの機能を追加して、 強力なGraphQL API を取得できます。

そのすべては、Firebaseでは不可能です。

リアルタイムデータ

Firebaseのリアルタイム機能は非常に人気がありますが、GraphQLコミュニティは リアルタイムに関するコンセンサス に近づいているため、Firebaseの最大の利点も無効になります。基礎概念の理解を深めるために、GraphQLサブスクリプションで このビデオチュートリアル をお勧めします

結論

したがって、あなたの質問に答えるには、GraphQLはほとんどの点でFirebaseを上回っており、それが優先選択となります。

GraphQLに興味がある場合は、GraphQLの長所を組み込み認証や AWS Lambda への柔軟なフックなどの強力な機能と組み合わせた Graphcool を確認することをお勧めします。カスタムビジネスロジックを実装する他のサーバーレス機能。

免責事項:私はGraphcoolで働いています:)

13
marktani

graphqlとfirebaseをローカルで使用できます。リクエストを解決するときにUIがブロックされるのを避けるために、すべての面倒な作業はウェブワーカーで行うことができます。

「リクエストを解決するために必要な多くのラウンドトリップ」について一言。転送されたデータを気にしないのであれば、すべての「ラウンドトリップ」は同じソケットフレームにマージされるのでそれほど大したことではありません。ただし、大きなフレームを避けたい場合は、Firebaseデータベースの前に少しdataloaderを置くだけです。

リアルタイム更新の場合、firebaseからのリアルタイムイベントをサブスクライブし、Webworkerに送信するだけで、スキーマを介して解決できる実際のgraphqlサブスクリプションに変換できます。

この問題の詳細については、中程度の投稿で確認できます。 「クライアント側のみ」Firebase、GraphQL、およびapollo-client 2.0を使用したリアルタイムWebアプリケーション

それが役立つことを願っています!

6

Firebaseを使用する必要がありますか?探しているものを提供するGraphQLに固有のサービスがあります。 https://scaphold.io はYC Fellowship Companyであり、特に有望であり、経験のような経験を与えますが、GraphQLによって強化されています。

6
Michael