2017-08-29 11 views
1

私のアプリケーションのデータベースを設計する際に問題があります。アプリではユーザーがジョブを作成してからGeoFireを使用して近くの人を見つけます。Firebaseデータベースの設計を最適化する

これは、これまでの仕事のために私のデザインです:

enter image description here

ユーザーと、その後の労働者がある見ることができるように。新しいジョブをサービスユーザのユーザ一意のID(UID)にプッシュした後、geoFireを使用して、近くにあるworkerUsersを検索します。私はその後、作業員のUIDにジョブをプッシュします。

私は基本的にこれらのジョブのコピーを作成しています:

は今ここに私の質問です。一度それを作成した人(サービス利用者の下)と近くのすべての従業員のために一度。 これは効率的ではありませんか?近くのユーザーにジョブオブジェクト全体の代わりに何らかのポインタを渡すべきですか?

さらに重要な質問は:デザインはそのままであれば、ジョブの作成者がそれを削除したとき、どうすればいいですか?私はworkerUsersで各ジョブを見つけてジョブUIDでジョブを削除する必要があります。 Firebaseはこれをサポートしていますか?

ありがとうございます!

答えて

2

私は基本的にこれらのジョブのコピーを作成しています。 (serviceUsersの下に)それを作成した人のために1回、近くのすべてのworkerUsersのために1回。 これは効率的ではありませんか?近くのユーザーにジョブオブジェクト全体の代わりに のポインタを渡すべきですか?

すべてのジョブには、「ポインタ」(私はむしろキーと呼ぶ)として機能するUUIDが必要です。それから、すべてのユーザーは、コピー全体ではなくジョブUUIDを含める必要があります。そのため、参照できます。私はあなたのユースケースを完全に再現するつもりはありませんが、アイデアを得るべきです。

{ 
    users: { 
    exampleUserId: { 
     jobs: ['exampleUUID'] 
    } 
    }, 
    jobs: { 
    exampleUUID: { 
    name: 'awesome job' 
    } 
    } 
} 

それが仕事の 作成者は、それを削除したときに私が上に行くだろうか、であるような設計は大丈夫ですか?私は workerUsersで各ジョブを見つけ、ジョブUIDでジョブを削除する必要があります。 Firebase はこれをサポートしていますか?

これはサポートしていますが、私の提案を上から実装して、まともなやり方で実装する必要があります。この後、あなたは、その仕事のように聞こえるはずですcloud functionを作成することができます:「与えられたUUIDを持つジョブが削除されると、その後、すべてのユーザーを通過し、それが存在する場合は、それへの参照を削除」

exports.checkReferences = functions.database.ref('/jobs/{uuid}').onWrite(event => { 
    // check information here 

    if (!event.data.val()) { 
    // job was removed! get its uuid and iterate through users and remove the uuid from them 
    } 
}); 
+0

はどうもありがとうございましたあなたの答え:)もう一つの質問をフォローアップ:私はデータベースが繰り返されるデータで膨らんでいないので、これは物事を行うための純粋な方法の多くであることを理解します。しかし、現在、私のworkerUsersは 'jobs/workerUsers/{uid}'の変更を待ち受ける '.on( 'value')'を持っています。私がjobKeysの配列をどこに持っていれば、serviceUsers内のジョブを繰り返し問い合わせなければならないでしょう。それは公正なトレードオフでしょうか? –

+0

これは、IMHOを実行する方法です。これは単純なJSONオブジェクトであり、データ間の高度な関係に依存することはできません。いつでもデータベースをプロファイルし、最適化するための方法を模索することができます。 - https://firebase.google。com/docs/database/usage/profile –

+0

ありがとうございました:) –

関連する問題