android - 尝试了解在我的场景中非规范化与 firebase 数据库的配合情况

标签 android ios firebase firebase-realtime-database nosql

所以基本上我正在使用 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/

相关文章:

android - "FragmentStackSupport cannot be resolved to a type"

javascript - 在 android chrome 中自动播放 html5 视频

javascript - 使用 PhoneGap HTML 在 iOS 中自定义 JavaScript 提示

javascript - Firebase电子邮件/密码身份验证未注册用户

firebase - 我如何添加加载圆形图标,因为从Firestore提取数据需要时间?

android - OpenCV-BackgroundSubtractorMOG2中的Apply方法在5-10秒后使Android应用程序崩溃

ios - 使用 iOS 的 Storyboard呈现登录

ios - 在 Release模式下未调用 Swift 应用程序功能

node.js - 如何使用 Firebase Cloud Functions .npmrc 设置私有(private) NPM 模块?

java - 每当我的 Android AlertDialog 加载、应用程序崩溃时,如何修复错误