多年来使用关系数据库,我正在尝试使用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。
我的问题是,这可以用更好的方式构建吗?我们的目标是随着应用用户的增长而扩展,并且仍然可以获得最佳性能。
答案 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
如果您想要更具体的内容,更多信息会有所帮助。