2017-03-15 19 views
2

のは、私は私のFirebaseデータベースに次のようなデータ構造を持っていると仮定しましょう:Firebase複雑なルール

{ 
    "allProjects": { 
    "foo": true, 
    "bar": true, 
    "baz": true 
    }, 
    "allUsers": { 
    "user1": true, 
    "user2": true, 
    "user3": true 
    }, 
    "projects": { 
    "foo": { 
     "name": "foo", 
     "members": { 
     "user1": true 
     } 
    }, 
    "bar": { 
     "name": "bar", 
     "members": { 
     "user2": true 
     } 
    }, 
    "baz": { 
     "name": "baz", 
     "members": { 
     "user1": true, 
     "user3": true 
     } 
    } 
    }, 
    "users": { 
    "user1": { 
     "name": "user1" 
    }, 
    "user2": { 
     "name": "user2" 
    }, 
    "user3": { 
     "name": "user3" 
    } 
    } 
} 

問題

私は私のデータを保護することができるようにいくつかのルールを記述しようとしています。ここではいくつかの要件があります:

  1. ユーザーは、彼らが
  2. ユーザーのみがそれらと同じプロジェクトに属しているユーザーが表示されます(つまり/project/:id/members/:userId === true)の一部であるプロジェクトが表示されるはずです。

は、ここで私が思い付くことができたものです。

{ 
    ".read": false, 
    ".write": false, 
    "allProjects": { 
    ".read": "auth !== null" 
    }, 
    "allUsers": { 
    ".read": "auth !== null" 
    }, 
    "projects": { 
    "$projectId": { 
     // requirement 1 
     ".read": "data.child('members').hasChild(auth.uid)" 
    } 
    }, 
    "users": { 
    "$userId": { 
     // requirement 2 
     ".read": "???", 
    } 
    } 
} 

答えて

2

典型的なアプローチは、各ユーザーが見ることができるユーザーのリストを維持するだろう。

user_friends: { 
    "user1": { 
    "user3": true 
    } 
    "user3": { 
    "user1": true 
    } 
} 

ユーザーがプロジェクトに追加/削除されると、この派生リストを最新の状態に保つ必要があります。また、スケジュール保守操作でこの派生リストを計算することもできます。

このようなデータを複製することは、SQLデータベースとほとんどのNoSQLデータベースとの大きな違いの1つです。 Firebaseでは、ユースケースを考慮して余分なデータを保存することがよくあります。素晴らしい紹介として、NoSQL data modelingを読んで、Firebase for SQL developersを見ることをお勧めします。

ところで、私はあなたが/projects/$projectidの下にユーザーのリストを組み合わせたことに気付きました。これはお勧めしません。最良の結果を得るには、それらを2つのトップレベルリストに分割します。

"projects": { 
    "foo": { 
     "name": "foo", 
    }, 
    "bar": { 
     "name": "bar", 
    }, 
    "baz": { 
     "name": "baz", 
    } 
    }, 
    "members": { 
    "foo": { 
     "user1": true 
    }, 
    "bar": { 
     "user2": true 
    }, 
    "baz": { 
     "user1": true, 
     "user3": true 
    } 
    },