在 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" 结构。一个位置下的所有数据在访问时被读取和传输。您可以做的一件事是将 User
和 UserInfo
分开到两个不同的分支,这样您就可以分别访问用户而不会引入过多的数据。
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
}
});
希望对您有所帮助。
我正在试用 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" 结构。一个位置下的所有数据在访问时被读取和传输。您可以做的一件事是将 User
和 UserInfo
分开到两个不同的分支,这样您就可以分别访问用户而不会引入过多的数据。
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
}
});
希望对您有所帮助。