【发布时间】:2021-05-06 12:16:17
【问题描述】:
我在聊天应用程序上工作一对一聊天,我的数据库结构是
"rules": {
"Messages" :{
"$chatId" : {
".read": "root.child('Chat_members').child(chatId).child(auth.uid).exists()",
".write": "root.child('Chat_members').child(chatId).child(auth.uid).exists()"
}
我想实现删除消息,所以如果 user1 删除消息,我将隐藏它并仅为 user2 显示它,我可以从客户端执行此操作,但是请求所有数据的方法非常低效,例如只有一条消息这将为 user1 显示如何从 firebase 规则执行此操作?我能找到任何帮助吗?
【问题讨论】:
-
我不确定这个问题是否清楚,但这听起来你只需要添加一个
isVisible标志,并且只读取isVisible == true或非规范化数据的消息,因此有两组,一组用于每个用户,如果用户 1 删除了一条消息,则将其从他的“可见消息”中删除,但将其保留在用户 2 的“可见消息”中 -
@Jay 照顾性能的最佳方法是什么?
-
这两种解决方案都不应该对性能产生影响——事实上,减少读取的节点数量实际上会更快。话虽如此,Firebase 的启动速度非常快,因此很可能不会对性能产生任何影响。
-
@Jay 你的意思是我必须为可见性添加一个节点,如果可见性是真的,我会为每条消息检查这个,我会显示消息。这会检查每条消息会减慢消息的显示速度并影响性能吗?
-
嗯。不,这不是我的评论所说的。您将添加一个子节点 isVisible,并且只读取具有 isVisible == true 的节点。因此,如果有 1000 个节点并且用户“删除”其中的 900 个(顺便说一句,这也称为“软删除”),这些节点的 isVisible 将设置为 false,因此它们不再出现在 UI 中。查询只会读取 isVisible == true 的节点。
标签: java android firebase firebase-realtime-database firebase-security