所以基本上我正在使用 mysql 构建所有以前的应用程序来存储数据并考虑切换到 firebase 数据库,这让我觉得有点疯狂。我正在尝试实现一个聊天系统,但在理解它的工作原理时遇到了一些麻烦。基于Denormalizing Your Data is Normal我得到了关于非规范化如何工作的想法和概念。
我知道我可以创建一个消息结构来存储聊天消息,如下所示(来自 doc 的示例)
"messages": {
"one": {
"m1": {
"name": "eclarke",
"message": "The relay seems to be malfunctioning.",
"timestamp": 1459361875337
},
"m2": { ... },
"m3": { ... }
},
"two": { ... },
"three": { ... }
}
但这是我的场景,假设我有一个最多可包含 1000 人的群聊。
- 场景 1: 我允许用户删除消息。当用户在群聊中发送了一些粗俗的内容,并且其中一位成员感到不舒服并决定将其删除时,这将导致其他用户无法观看该消息。
- 场景 2 如果其中一名成员被管理员踢出,我希望他在被踢出之前仍然能够观看之前的消息。
对于 SQL
版本中的场景一,当用户删除时,我创建了一个包含 messageID 和 userID 的表,并执行如下查询,该消息仍可用于其他用户。
SELECT * FROM message WHERE roomId = $userId AND messageId NOT IN ($messageId)
但是firebase数据库不支持这个功能,所以我现在唯一能想到的办法就是把每一条新消息都写到所有的成员树
"messages": {
"john": {
"m1": {
"name": "eclarke",
"message": "The relay seems to be malfunctioning.",
"timestamp": 1459361875337,
"groupId" : "1"
},
"m2": { ... },
"m3": { ... }
},
"jimmy": { ... },
"paul": { ... }
}
因此,当用户删除消息时,我可以轻松地将其从他自己的消息节点中删除,以便其他用户仍然可以使用该消息。
我的困惑是,如果群聊达到 1000 人,我可能需要写入 1000 个用户节点树,在 firebase 数据库中写入如此多的数据时会不会有问题?我的意思是写入时间很长,磁盘空间等问题。或者有更好的方法吗?如果没问题,我想我也可以解决方案 2。如果标题有任何误解,我感到非常抱歉,因为从 sql 到无 sql 真的很难切换。
感谢任何预付款。
最佳答案
不,您不需要将数据写入 1000 个用户节点,您只需要写入一次。为了实现这一点,您需要有一个如下所示的数据库结构:
Firebase-root
|
---- Groups
| |
| ---- groupId
| |
| ---- groupName: "Android"
| |
| ---- users
| | |
| | ---- userId1: true
| | |
| | ---- userId2: true
| |
| ---- messages
| |
| ---- messageId1: "Hello"
| |
| ---- messageId2: "Hy"
| |
| //and so on
|
---- messages
|
---- messageId1
| |
| ---- users
| |
| ---- userId1: true
| |
| ---- userId2: true
|
---- messageId2
|
---- users
|
---- userId1: true
|
---- userId2: false // false for second message
希望对您有所帮助。
关于android - 尝试了解在我的场景中非规范化与 firebase 数据库的配合情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44169412/