Firebase上的延迟加载?

3

我正在尝试使用Firebase数据库,并查看了建模多对多或一对多关系的推荐方法。

假设我有一个用户与帖子之间的关系:

用户拥有许多帖子。

这是我的模型设计思路:

class User{

List<String> postIds;

...
}

class Post{

String userId;

....
}

这是根据Firebase文档这里的内容。
我喜欢这个设计,而不是像mongodb样式一样在用户集合下嵌入用户创建的帖子,这个设计是平面的;因此,如果我们以后想要仅提取系统中的用户,我们就不必将帖子也提取到用户下面。
但是,对于这种设计,我的疑虑是即使在帖子中嵌入了ids,以后也可能会出现问题;想象一下有100个用户,每个用户有1000篇文章。如果我想要显示用户列表,我必须拉取100个用户,这意味着我必须拉取100,000个帖子id。
Firebase上是否有任何懒加载的概念?也就是说,当我获取用户实体时,postIds不应该自动加载;它应该按需加载。
2个回答

2

目前Firebase中没有“懒加载”或“按需加载”的构造。访问时,一个位置下的所有数据都会被读取和传输。你可以做的一件事是将UserUserInfo分别放在两个不同的分支中,这样你就可以单独访问用户,而不需要拉取过多的数据。

class User {
  String id;
  String name;
  String gender etc.
}

class UserInfo {
  List<String> postIds;
  Other info maintained per user
}

以此方法,您可以阅读用户信息而无需提取额外信息。

0

Firebase 中的一个重要规则是尽可能将数据扁平化。您可以查看此帖子正确构建复杂应用的 Firebase 数据结构,以更好地理解。

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

希望能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接