关于firebase聊天应用程序的DB结构的建议

时间:2017-09-22 10:27:42

标签: firebase react-native firebase-realtime-database denormalization nosql

我刚开始使用firebase构建我的第一个聊天应用程序(本机反应)。 然而,我对数据库应该具有的理想结构感到有些困惑。 firebase文档建议结构应尽可能标准化,但我可以访问的查询类型使其看起来像规范化数据会影响性能。

只是一个适合我的用例的简单示例: 我的快速,非规范化结构将是:

molokai

明显的缺点是,如果用户更改其头像,则只会显示新消息。

我的标准化结构将是:

{
  "workgroups": {
    "40": {
      "id": "40",
      "name": "workgroup 1 name",
      "messages": {
        "message-1-id": {
          "id": "message-1-id",
          "text": "Message 1 text",
          "user": {
            "id": "1",
            "name": "User 1 name",
            "avatar": "http://user1avatar.com"
          }
        },
        "message-2-id": {
          "id": "message-2-id",
          "text": "Message 2 text",
          "user": {
            "id": "1",
            "name": "User 1 name",
            "avatar": "http://user1avatar.com"
          }
        }
      }
    }
  }
}

我必须获取某个地方的所有消息,每条消息都会 需要将发件人的头像和名称连接到它。 非规范化结构仍然是更好的选择吗?

如果仍然优先考虑标准化结构,那么我该如何加入表? 我的第一次尝试是获取某个地方的所有消息,然后为每个消息获取每个用户 但我怀疑这将是最好的解决方案。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

由于我们不知道你的应用程序的最终游戏是什么,所以不可能说最好的方法是什么。您是否需要搜索消息,用户等?你想列出用户吗?

你提到:

  

“如果用户更改了他的头像,则只有新消息会显示”

我认为你已经回答了你自己的问题。您应该规范化数据,以便消息和用户分开。

Firebase不是关系数据库,因此您不会加入任何表。您查询消息。收到第一条消息后,您可以开始从消息中的用户ID查询用户。您最终将查询一次消息,并为您需要的每个用户查询一次。您可以聪明地查询用户,只查询用户(如果您尚未查询过他们)。

您可以查看this short video如何在Firebase中执行“加入”,而不是在SQL中执行此操作