2017-04-22 5 views
0

私はFirebaseでアプリケーションを構築しており、いくつかのアドバイスを使用することができます。キーポイントは次のとおりです。Hey #AskFirebase、このスキーマはどのように設計すればよいですか?

  • このアプリは、従業員の作業時間を追跡するためのものです。
  • ユーザーはチームに分かれており、各チームにはマネージャーがいます。
  • ユーザーが時計を入れたり止めたりすると、アプリはどれくらいの時間働いているかを追跡します。

私は設計上の問題を抱えています。ここでの要件は以下のとおりです。

  • マネージャーが&を読み取ることができ、ユーザーが唯一&が自分を読み書きすることができながら、自分のチームのすべてのユーザーのタイムカードを書きます。
  • ユーザーが独自のタイムカードを表示しているときは、最新のタイムカードをタイムスタンプでソートして表示する必要があります。
  • チームの全員のタイムカードを管理者が見ているときに、UIは最新のタイムカードをタイムスタンプでソートして表示する必要があります。

3つのすべての要件を同時に解決することが課題であることが証明されています。私の最初の直感は、このようにタイムカードを構築することでした:

{ 
    "timeCards": { 
    "-teamId_1": { 
     "-userId_1": { 
     "-timeCard_1": { 
      "startsAt: 1234567890123, 
      "endsAt": 1234567899999, 
      "duration": 2234567 
     }, 
     "-timeCard_2": "..." 
     } 
    } 
    } 
} 

これは、簡単に最初の二つの要件を解決します。管理者は、チーム全体のための読み取り/書き込みしているように

  • 簡単に許可ルールを作成しますユーザーは自分自身の読み書きしかできません。
  • 簡単にこのスキーマを持つ第三の要件を解決するために、残念ながらdb.ref('timeCards/${tid}/${uid}').orderByChild('startsAt')

/wのタイムスタンプでソートされた特定のユーザーの時間を照会するために、クライアント上でいくつかの重い物を持ち上げる必要です。 TimestampでソートされたチームのタイムカードのすべてをFirebaseに照会する方法はありません。だから、私はチームのすべてのタイムカードをプルダウンしてから、&をマージしてクライアントに並べ替える必要があります。

私は、これがこのような多分構造、非正規化のための呼び出しを考えています:

{ 
    "timeCards": { 
    "byTeam": { 
     "-teamId_1": { 
     "-timeCard_1": { 
      "userId": "-userId_1", 
      "startsAt: 1234567890123, 
      "endsAt": 1234567899999, 
      "duration": 2234567 
     }, 
     "-timeCard_2": "..." 
     } 
    }, 
    "byUser": { 
     "-userId_1": { 
     "-timeCard_1": { 
      "teamId": "-teamId_1", 
      "startsAt: 1234567890123, 
      "endsAt": 1234567899999, 
      "duration": 2234567 
     }, 
     "-timeCard_2": "..." 
     } 
    } 
    } 
} 

しかし、これは、2つのFirebase機能、timeCards/byTeamtimeCards/byUserを見てものを見ているものを必要とし、サーバー上の複雑各ミラーすることを取得します他のコレクションへのレコード。

しかし、その状況で無限のアップデートループを回避する方法はわかりません。 (timeCards/byTeam/-teamId_1/-timeCard_1を更新するとFirebase機能が起動し、timeCards/byUser/...が更新され、Firebase機能が起動し、timeCards/byTeam/...などを更新すると想像してください)

私は簡単な解決法がありませんか?

答えて

0

Firebaseによれば、データをできるだけフラットに保つことが良い方法です。だから、次のようになります。

{ 
    "users": { 
     "-userId_1": { 
      "name": "John" 
     }, 
     "-userId_2": { 
      "name": "Ann" 
     } 
    }, 
    "teams": { 
     "-teamId_1": { 
      "name": "Gladiators" 
     } 
    }, 
    "timeCards": { 
     "-timeCard_1": { 
      "startsAt": 1234567890123, 
      "endsAt": 1234567899999, 
      "duration": 2234567, 
      "userId": "-userId_1", 
      "teamId": "-teamId_1" 
     }, 
     "-timeCard_2": { 
      "startsAt": 1234567890123, 
      "endsAt": 1234567899999, 
      "duration": 2234567, 
      "userId": "-userId_2", 
      "teamId": "-teamId_1" 
     } 
    }, 
    "usersInTeams": { 
     "-teamId_1": { 
      "-userId_1": true, 
      "-userId_2": true 
     } 
    }, 
    "teamsInUsers": { 
     "-userId_1": { 
      "-teamId_1": true 
     }, 
     "-userId_2": { 
      "-teamId_1": true 
     } 
    }, 
    "timeCardsInUsers": { 
     "-userId_1": { 
      "-timeCard_1": true 
     }, 
     "-userId_2": { 
      "-timeCard_2": true 
     } 
    }, 
    "timeCardsInTeams": { 
     "-teamId_1": { 
      "-timeCard_1": true, 
      "-timeCard_2": true 
     } 
    } 
} 

その後、あなたは「タイムカード」(ノード:/timeCards/{pushId})に書くときトリガークラウド機能書くことができます: "とし、タイムカードIDに「timeCardsInUsers」(/timeCardsInUsers/{userId}ノード)を追加しますtimeCardsInTeams "(ノード:/timeCardsInTeams/{teamId})。

異なるノードに書き込むため、ループの問題を解決する必要があります。

関連する問題