在 Firebase 上延迟加载?

Lazy loading on firebase?

我正在试用 firebase 数据库,我正在检查推荐的多对多或一对多关系建模方法。

假设我在 post 和用户之间有这种关系: 用户有很多 post。

这是我的模型设计方法:

class User{

List<String> postIds;

...
}

class Post{

String userId;

....
}

这是根据 firebase 文档here

我喜欢这种设计,而不是将用户创建的 post 嵌入到用户 collection 下,喜欢 mongodb 样式这种设计是扁平的;所以以后如果我们只想获取系统上的用户,我们也不必将 posts 拉到用户下面。

但我对这种设计的怀疑甚至是将 id 嵌入 posts 以后可能会成为问题;假设我有 100 个用户,每个用户有 1000 个 post。如果我想显示用户列表,我必须提取 100 个用户,这意味着我必须提取 100,000 post 个 ID。

firebase 有延迟加载的概念吗?即,当我获取用户实体时,不应自动加载 postId;它应该按需加载。

目前 Firebase 中没有 "lazy loading" 或 "load on demand" 结构。一个位置下的所有数据在访问时被读取和传输。您可以做的一件事是将 UserUserInfo 分开到两个不同的分支,这样您就可以分别访问用户而不会引入过多的数据。

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

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

通过这种方式,您可以在不提取额外信息的情况下读取用户。

Firebase 中的一个重要规则是尽可能扁平化数据。你可以看看这个post,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
    }
});

希望对您有所帮助。