我来自RDMS背景。我很难通过关联集合获取关系数据,这是我得到的集合......
databaseReference = firebaseDatabase.getReference("posts");
query = databaseReference.orderByChild("post_kind").equalTo("S");
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
int postId = snapshot.child("post_id").getValue();
String postKind = snapshot.child("post_kind").getValue();
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.e("DatabaseError", databaseError.toString());
}
});
我想列出科技组中的用户,基本上我可以像这样查询
users collection
- user_1
- name: abc
- email: xxxx@example.com
- user_2
- name: efg
- email: efg@example.com
groups collection
- group_tech
- name: tech
- group_finance
- name: finance
groupUsers collection
- groupUserID
- groupID: group_tech
- userID: user_1
还有另一种方法来解决我以这种方式对数据进行建模的问题。
this.groupUsersCol = this.afs.collection('groupUsers');
this.groupUsersCol.ref.where('groupID', '==', this.params.gid)
.onSnapshot(function(querySnapshot) {
var employees = [];
querySnapshot.forEach(function(doc) {
// here i only get the user id, how i get the user doc?
// Also, i cannot direct call this.afs.doc(...)
console.log("user", doc.data())
});
});
以这种方式存储数据的好处是,检索数据非常方便。像...
如果您想要获取该组中的所有用户,您可以在
中查询users collection
- user_1
- name: abc
- email: xxxx@example.com
- groups: {
group_tech: true
}
- user_2
- name: efg
- email: efg@example.com
- groups: []
groups collection
- group_tech
- name: tech
- users: {
user_1: true
}
- group_finance
- name: finance
与用户一样,获得用户的群体,绝对容易。但是从组中删除用户时存在缺点。你需要从2个表中删除。
请建议!分享您的经验和实践方法,这将是一件好事,欢迎并非常感谢您!
答案 0 :(得分:0)
我建议使用第二种方式,正如您所提到的那样,它可以更好地查询并简化您的安全规则。请注意复合索引有20k的限制,所以如果您的用户在数千个组中,请不要这样做。
为了解决这个缺点,不是处理“删除”客户端,而是使用云功能在服务器端执行。只需使用Cloud Functions监听器监控用户和组,查找已更改的字段,如果现在任何关系false
删除关系的两端。