我刚开始使用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"
}
}
}
}
}
}
我必须获取某个地方的所有消息,每条消息都会 需要将发件人的头像和名称连接到它。 非规范化结构仍然是更好的选择吗?
如果仍然优先考虑标准化结构,那么我该如何加入表? 我的第一次尝试是获取某个地方的所有消息,然后为每个消息获取每个用户 但我怀疑这将是最好的解决方案。
感谢您的帮助!
答案 0 :(得分:0)
由于我们不知道你的应用程序的最终游戏是什么,所以不可能说最好的方法是什么。您是否需要搜索消息,用户等?你想列出用户吗?
你提到:
“如果用户更改了他的头像,则只有新消息会显示”
我认为你已经回答了你自己的问题。您应该规范化数据,以便消息和用户分开。
Firebase不是关系数据库,因此您不会加入任何表。您查询消息。收到第一条消息后,您可以开始从消息中的用户ID查询用户。您最终将查询一次消息,并为您需要的每个用户查询一次。您可以聪明地查询用户,只查询用户(如果您尚未查询过他们)。
您可以查看this short video如何在Firebase中执行“加入”,而不是在SQL中执行此操作