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

Tar*_*ury 7 nosql firebase firebase-realtime-database

来自多年使用关系数据库,我正在尝试使用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
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Goo*_*ian 8

使用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"}
          ]
      }
   ]
}
Run Code Online (Sandbox Code Playgroud)

您可以运行此结构的 NoSQL 查询示例很少。

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

db.chat_rooms.find({ members: 1 })
Run Code Online (Sandbox Code Playgroud)

获取用户 id 为1发送的所有文档和消息。

db.chat_rooms.find({ messages: { from: 1 } })
Run Code Online (Sandbox Code Playgroud)

上述数据库结构也可以在 RDMS 数据库中实现为使用 MySQL 或 MSSQL 的表关系。这也可以用于群聊室应用程序。

这种结构经过优化,可以减少您的数据库文档阅读使用量,从而可以节省您为基础设施支付更多费用的资金。

根据我们上面的例子,由于我们有 4 条消息,您将获得 2 个文档读取,但是如果您单独存储所有消息并通过过滤发件人 ID 运行查询,您将获得 4 个数据库查询,当您在您的数据库中有大量对话记录。


Luk*_*gen 3

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

"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 } 
                 } 
             } 
         } 
Run Code Online (Sandbox Code Playgroud)

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

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