12

ユーザーとアカウントの 2 種類のオブジェクトがあるとします。ユーザーは多くのアカウントを持ち、他のユーザーと共有できます。そのため、User1 と User2 が AccountA を利用できる可能性があります。AccountB は User1 のみが利用できます。したがって、User1 には 2 つのアカウントがあり、User2 には 1 つのアカウントがあります。

これを構造化する「firebase」の方法は何ですか?

私は当初、ユーザーはそれぞれ、自分が属する一連のアカウントを保存できると考えていました。

users: {
  1: {
    name: 'Ted',
    accounts: [1, 2]
  }
  2: {
    name: 'Frank',
    accounts: [1]
  }
}

accounts: {
  1: {
    name: "Checking"
  },
  2: {
    name: "Savings"
  }
}

または、アカウントにはユーザーの配列があります。

users: {
  1: {
    name: 'Ted'
  }
  2: {
    name: 'Frank'
  }
}

accounts: {
  1: {
    name: "Checking",
    users: [1, 2]
  },
  2: {
    name: "Savings"
    users: [1]
  }
}

ユーザーのアカウントを簡単に見つけて、Ted がログインしたときに、データベース全体をプルダウンすることなく、Ted が属するアカウントを一覧表示できるようにする方法を考えています。とにかく、セキュリティのために、彼のマシンにそのすべてのデータを入れたくありません。

質問 #1 セキュリティ ルールはこれを処理しますか? つまり、ユーザーが所属するアカウントのみを許可するようにセキュリティ ルールを設定することを計画しています。「/accounts」をクエリすると、ユーザーがアクセスできるアカウントのみが返されることを期待しています...いいえ?

質問 #2 アイテムのリストを照会するメカニズムはありますか。「/accounts/[1,2]」のように、アカウント「/accounts/1」と「/accounts/2」を取り戻すには?

共有できる情報をありがとう。

4

1 に答える 1

20

詳細に入る前に、覚えておきたいことがいくつかあります。

  1. 通常は、読み取りパターンに基づいてデータを構造化する必要があります。したがって、ユーザーがいるすべてのアカウントを検索する必要がある場合は、そのリストをどこかに保存する必要があります。また、アカウントに関連付けられているすべてのユーザーを検索する場合は、そのリストもどこかに保存する必要があります。質問 2 に関しては、現在、Firebase には一般的なクエリ機能 ("/accounts[1,2]" など) はありませんが、将来的には可能になるでしょう。
  2. セキュリティ ルールを使用してデータをクエリすることもできません。ある場所のすべてのデータを読み取ることができるか、まったく読み取れないかのいずれかです。したがって、質問 #1 に関しては、セキュリティ ルールは自動的に /accounts を照会しません。
  3. セキュリティ ルールでは、要素の配列の内容を検索することはできませんが、オブジェクト内のキーの存在を確認できます。したがって、ユーザー 1 と 4 が何かにアクセスできる場合は、おそらく [1, 4] ではなく { 1: true, 4: true } を格納する必要があります。

それを念頭に置いて、最初の例のようにデータを保存することをお勧めしますが、配列は使用しません。

users: {
  1: {
    name: 'Ted',
    accounts: {
      1: true,
      2: true
    }
  }
  2: {
    name: 'Frank',
    accounts: {
      1: true
    }
  }
}

accounts: {
  1: {
    name: "Checking"
  },
  2: {
    name: "Savings"
  }
}

これにより、特定のユーザーのすべてのアカウントを簡単に取得できます。逆方向 (アカウントのすべてのユーザー) にもアクセスできるようにする必要がある場合は、その情報を複製してアカウントにも保存する必要があります。例えば:

accounts: {
  1: {
    name: "Checking",
    users: {
      1: true,
      2: true
    }
  },
  2: {
    name: "Savings",
    users: {
      1: true
    }
  }
}

お役に立てれば!

于 2013-07-02T16:54:11.867 に答える