为聊天应用程序构建NoSQL数据库(使用FireBase)

时间:2016-03-13 11:34:07

标签: firebase firebase-realtime-database nosql

多年来使用关系数据库,我正在尝试使用FireBase开发一个非常基本的聊天/消息应用程序

FireBase使用JSON格式字符串的NoSQL数据结构方法。

我做了很多研究,以便了解如何在考虑性能的情况下构建数据库。我试图"反规范化"结构最终得到以下结论:

{

"chats" : {

    "1" : {
        "10" : {
            "conversationId" : "x123332"
         },
        "17": {
            "conversationId" : "x124442"
        }
    }
},

"conversations" : {

    "x123332" : {

      "message1" : {

        "time" : 12344556,
        "text" : "hello, how are you?",
        "userId" : 10
      },
      "message2" : {

        "time" : 12344560,
        "text" : "Good",
        "userId" : 1
      }
    }
  }
}

数字1,10,17是示例用户ID。

我的问题是,这可以用更好的方式构建吗?我们的目标是随着应用用户的增长而扩展,并且仍然可以获得最佳性能。

2 个答案:

答案 0 :(得分:5)

使用类似Firestore的面向文档的数据库结构,您可以按以下方式存储对话;

{
   "chat_rooms":[
      {
         "cid":100,
         "members":[1, 2],
         "messages":[
           {"from":1, "to":2, "text":"Hey Dude! Bring it"},
           {"from":2, "to":1, "text":"Sure man"}
          ]
      },
      {
         "cid":101,
         "members":[3, 4],
         "messages":[
           {"from":3, "to":4, "text":"I can do that work"},
           {"from":4, "to":3, "text":"Then we can proceed"}
          ]
      }
   ]
}

您可以通过此结构运行NoSQL查询的几个示例。

获取用户ID为 1 的已登录用户的所有对话。

db.chat_rooms.find({ members: 1 })

获取所有文档,以及由用户ID 1 发送的邮件。

db.chat_rooms.find({ messages: { from: 1 } })

上述数据库结构还能够使用MySQL或MSSQL在RDMS数据库中实现表关系。这也可以在群聊室应用中实现。

此结构经过优化,可以减少数据库文档读取的使用,从而省去了为基础架构支付更多费用的钱。

根据上面的示例,由于我们有4条消息,因此您将获得2次文档读取,但是如果单独存储所有消息并通过过滤发件人ID来运行查询,则将获得4种数据库查询,这是一种庞大的查询当您的数据库中有大量对话历史记录时,该数量就会增加。

答案 1 :(得分:2)

存储消息的一种情况可能如下所示:

"userMessages": 
    { "simplelogin:1": 
        { "simplelogin:2": 
            { "messageId1": 
                { "uid": "simplelogin:1", 
                  "body": "Hello!", 
                  "timestamp": Firebase.ServerValue.TIMESTAMP },
               "messageId2": { 
                  "uid": "simplelogin:2", 
                  "body": "Hey!", 
                  "timestamp": Firebase.ServerValue.TIMESTAMP } 
                 } 
             } 
         } 

这是一个来自这个结构的fireslack示例。本教程使用firebase构建类似slack的应用程序: https://thinkster.io/angularfire-slack-tutorial

如果您想要更具体的内容,更多信息会有所帮助。