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.
我的问题是,这可以用更好的方式构建吗?目标是随着应用程序用户的增长而扩展,并且仍然可以获得最佳性能.
使用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 个数据库查询,当您在您的数据库中有大量对话记录。
一种存储消息的情况可能如下所示:
"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
如果您想要更具体的信息,更多信息会有所帮助。
| 归档时间: |
|
| 查看次数: |
7931 次 |
| 最近记录: |