在firebase上延迟加载?

时间:2017-06-26 06:33:47

标签: android firebase firebase-realtime-database lazy-loading

我正在尝试使用firebase数据库,我正在检查建议的多对多或一对多关系的建模方式。

说我在帖子和用户之间有这种关系: 用户有很多帖子。

这是我的模型设计方法:

class User{

List<String> postIds;

...
}

class Post{

String userId;

....
}

这是根据firebase文档here

我喜欢设计,而不是在用户集合下嵌入用户创建的帖子,比如mongodb样式,这个设计是扁平的;所以以后如果我们想要只获取系统上的用户,我们也不必在用户下拉帖子。

但我对这种设计的疑问是,即使在帖子中嵌入ID也可能是以后的问题;想象我有100个用户,每个用户有1000个帖子。如果我想显示用户列表,我必须提取100个用户,这意味着我必须提取100,000个帖子ID。

firebase上是否有任何延迟加载概念?即,当我获取用户实体时,不应自动加载postIds;它应该按需加载。

2 个答案:

答案 0 :(得分:2)

没有&#34;延迟加载&#34;或者&#34;按需加载&#34;目前在Firebase中构建。读取位置下的所有数据并在访问时传输。您可以做的一件事是将UserUserInfo分开到两个不同的分支,这样您就可以单独访问用户而无需过多的数据。

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
    }
});

希望它有所帮助。