android - Firebase 实时数据库 --- 嵌套的 singleValueEventListeners 是一种不好的做法吗?
问题描述
实时您不能跨多个根节点执行单个查询,所以我想知道执行多个查询(一个接一个地嵌套)是否是一种不好的做法?我知道这可以在 firestore 中的一个查询中完成,但由于大量用户读/写,我专门对我的应用程序的这一部分使用实时。
reference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
//get Data from query one here
reference2.addListenerForSingleValueEvent(){
//get Data from query two here
reference3.addListenerForSingleValueEvent(){
//get Data from query three here
}
}
}
解决方案
进行多次调用以从每个引用中读取相应条目的替代方法是复制每个引用下其他条目的数据。
在您的抽象示例中有点难以推理,所以让我们选择一个更具体、更简单的用例:聊天应用程序。假设您有两级实体:用户和聊天消息。每条聊天消息都由一个用户编写,一个用户有一个显示名称。在最标准化的数据模型中,这可能是:
users: {
user1: {
name: "david s."
},
user2: {
name: "Doug Stevenson"
},
usere: {
name: "Frank van Puffelen"
}
},
messages: {
message1: {
message: "In real time you can't do a single query across multiple...",
uid: "user1"
},
message2: {
message: "In a very general sense, nested callbacks...",
uid: "user2"
}
message1: {
message: "The alternative to doing multiple calls...",
uid: "user3"
}
}
现在假设我们有一个用例,我们想要显示最近的 10 条聊天消息,每条消息都带有发布该消息的用户的姓名。
上面的数据可以正常工作,但是您需要从/users
节点读取用户名,这与您现在所做的差不多。这称为客户端连接,并且非常有效,因为Firebase 通过单个连接对请求进行管道传输。
您可以使用缓存对名称的查找进行重复数据删除,因为用户名的更改频率通常远低于聊天消息。这减少了开销,因为您只加载每个用户的数据一次,但代码可能会有点冗长。
另一种方法是复制用例所需的最少数据。这意味着您的数据模型将如下所示:
users: {
user1: {
name: "david s."
},
user2: {
name: "Doug Stevenson"
},
usere: {
name: "Frank van Puffelen"
}
},
messages: {
message1: {
message: "In real time you can't do a single query across multiple...",
name: "david s.",
uid: "user1"
},
message2: {
message: "In a very general sense, nested callbacks...",
name: "Doug Stevenson",
uid: "user2"
}
message1: {
message: "The alternative to doing multiple calls...",
name: "Frank van Puffelen",
uid: "user3"
}
}
现在,您可以通过单次阅读显示最新 10 条消息的列表。代价是您使用更多的存储空间,但通常存储应该被认为是便宜的。代码的缺点是你现在需要编写重复的数据,这更复杂。当然,重复的数据可能会不同步。
以上所有方法都是有效的。您选择哪一个取决于您的应用程序的用例、复制数据的舒适程度以及您个人对代码量、带宽消耗等的重视程度。没有万能的答案,因此您必须自己拨打电话。
有关该主题的一些精彩阅读/查看,请参阅:
推荐阅读
- c++ - 了解此 printf 的结果
- python - Postgres 仅在部署到 Heroku(Flask)时才返回意外结果
- javascript - 在 Javascript 对象数组中查找递归(循环)id
- scipy - 是否可以解决 python 的 RegularGridInterpolator 中的输入?
- javascript - 你能用JS移动一个div吗?
- ruby - 简单的红宝石,除非方法错误
- c# - 如何在C#中检测控件是否是按钮
- javascript - 无法从 cpanel 连接我在 mongodb atlas 上创建的 mongodb 集群
- java - 使用多个对象循环 JSON
- coldfusion - cfselenium - 如何在冷融合应用程序中实现自动化