我正在尝试使用firebase数据库,我正在检查建议的多对多或一对多关系的建模方式。
说我在帖子和用户之间有这种关系: 用户有很多帖子。
这是我的模型设计方法:
class User{
List<String> postIds;
...
}
class Post{
String userId;
....
}
这是根据firebase文档here。
我喜欢设计,而不是在用户集合下嵌入用户创建的帖子,比如mongodb样式,这个设计是扁平的;所以以后如果我们想要只获取系统上的用户,我们也不必在用户下拉帖子。
但我对这种设计的疑问是,即使在帖子中嵌入ID也可能是以后的问题;想象我有100个用户,每个用户有1000个帖子。如果我想显示用户列表,我必须提取100个用户,这意味着我必须提取100,000个帖子ID。
firebase上是否有任何延迟加载概念?即,当我获取用户实体时,不应自动加载postIds;它应该按需加载。
答案 0 :(得分:2)
没有&#34;延迟加载&#34;或者&#34;按需加载&#34;目前在Firebase中构建。读取位置下的所有数据并在访问时传输。您可以做的一件事是将User
和UserInfo
分开到两个不同的分支,这样您就可以单独访问用户而无需过多的数据。
class User {
String id;
String name;
String gender etc.
}
class UserInfo {
List<String> postIds;
Other info maintained per user
}
通过这种方式,您可以在不提取额外信息的情况下阅读用户。
答案 1 :(得分:0)
Firebase中的一项重要规则是尽可能将数据展平。您可以查看此帖子Structuring your Firebase Data correctly for a Complex App,以便更好地理解。
由于Firebase数据库中无法仅下载每个节点的一个属性,因此实现此目的的唯一方法是使用承载所有这些ID的新节点。因此,如果您想要一种有效的方法来验证id的存在或计算所有用户,请只下载ID列表。为了更好地衡量,您应该在数据库中准确保存id列表。
要获取所有这些ID,您可以使用以下代码:
DatabaseReference postRef = FirebaseDatabase.getInstance().getReference().child("Post");
postRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
String uId = ds.getKey();
Log.d("TAG", uId);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException(); // don't ignore errors
}
});
希望它有所帮助。