2012-03-14 7 views
0

新しいプロジェクトでは、メインデータベースのmongodbに行くことにしましたが、私の経験がないため、さまざまなコレクション間の関係をどのように構造化すべきか混乱することになりました。MongoDBの関係

私の場合、ユーザーコレクション、「メモ」コレクション、およびグループコレクションがあります。ノートは、異なるユーザーやグループに公開することができます。ユーザーがグループの一部であり、そのグループがメモへの読み取りアクセス権を持っている場合、ユーザーも同様です。ユーザーがグループから削除された場合、ユーザーはメモにアクセスできなくなります。ただし、ユーザーはユーザーごとにメモにアクセスすることができ、アクセス権のあるグループから削除されてもメモを表示することができます。うまくいけばそれは理にかなっている。

私が直面している問題は、このすべてが可能になるようにアクセス許可を設定することです。権限をnotesコレクションに保存する必要がありますか?次のようにそのが保存されている場合:

note: {id: xxxx, followers:[{id:user1, permission:write},{id:groupA, permission:read}]} 

次にUser2がグループAの一部である場合には、私は彼らが自分のIDでノードに関連付けられているかどうかを確認する必要があるだろう、とされていない場合、私は持っていますそのノートを見ることができる各グループをチェックし、そのメンバーを見て、異なるグループが異なるパーミッションを持っているならば、私は最高のパーミッションを取らなければなりません。これは効率的ではないようです。

user: {id:user1, projects:[xxxxx, xxxxx], groups:[xxxxx,xxxx...]} 

グループコレクション:

ユーザーのコレクションは次のようになります

group: {id:groupA, projects:[xxxxx, xxxx...], users:[user2...]} 

グループが削除された場合、私はそのようにプロジェクトとユーザー文書をグループ文書をリンクに計画していましたプロジェクトから、プロジェクトはグループから削除されます。これを行うにはdbrefが最善の方法だと思われます。

私はベストプラクティスを見てきましたが、私が持っている全体的な構造が厄介であるように感じましたが、別のやり方を考えることはできません。

+0

は、ユーザーがちょうど1人のグループにすることはできません理由はありますか? – Derick

+0

ユーザーがログインすると、2つのコレクションのフィールドが完全に異なることになります。私はこの例をパーミッションの関連情報だけに限定しました。私はグループとしてユーザーを持つことは、すべてのグループをまだチェックしているので、アクセス許可を設定する方法に必要なチェックの量を制限するとは思わない。 – aelnaiem

+0

クエリはどのように見えますか?特定のメモを検索して、どのグループとユーザーにアクセス権があるかを確認するか、特定のグループまたはユーザーを検索してアクセス権のあるメモを確認していますか? – Barrie

答えて

1

要件を満たしていれば、グループにはユーザーがグループを持つユーザーより多くのユーザーがいる場合は、ユーザーにgroup_idsを格納することを検討する必要があります。

ユーザーとグループを2つの異なるスキーマとis_group属性のような1つのコレクションにまとめることができますが、コレクションレベルのロックがある可能性があります。

ユーザーがアクセス権を持っているかどうかを調べるには、プロジェクトコレクションを照会し、プロジェクト文書が取得された後でメンバーのグループIDが書き込み配列または読み取り配列内にあるかどうかを確認するだけです。

プロジェクト:

{ 
    "_id": ObjectId, 
    "write": [group_id, group_id, ...], 
    "read": [group_id, group_id, ...] 
} 

ユーザー:

{ 
    "_id": ObjectId, 
    "groups": [] 
} 

グループ:

{ 
    "_id": ObjectId, 
}