我刚开始使用Firebase构建我的第一个聊天应用程序(反应本机)。 但是,我对我的数据库应该具有的理想结构略有困惑。 Firebase文档提示结构应尽可能标准化,但我有权访问的查询类型使其看起来像正常化数据会影响性能。关于Firebase聊天应用程序的DB结构的建议
只是适合我的使用情况下,一个简单的例子: 我的快速,非规范化的结构将是:
{
"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"
}
}
}
}
}
}
明显缺点是,如果用户改变他的形象只有新的消息将显示它。
我的标准化结构将是:
{
"workgroups": {
"40": {
"id": "40",
"name": "workgroup 1 name",
"messages": {
"message-1-id": {
"id": "message-1-id",
"text": "Message 1 text",
"user": "1"
},
"message-2-id": {
"id": "message-2-id",
"text": "Message 2 text",
"user": "1"
}
}
}
},
"users": {
"1": {
"id": "1",
"name": "User 1 name",
"avatar": "http://user1avatar.com"
},
"2": {
"id": "2",
"name": "User 2 name",
"avatar": "http://user2avatar.com"
}
}
}
我要为某一个地方获取所有的信息和每个消息将 需要有连接到它的发送者的头像和名字。 非规范化结构仍然是更好的选择吗?
如果规范化的结构仍然是首选,那么我应该如何加入表格? 我的第一个尝试是获取一个地方的所有消息,然后获取每个消息的每个用户 但我怀疑这将是最好的解决方案。
感谢您的帮助!
也许不是你要找的答案,但我建议你做一些简短的实验测试你的用例。在我找到一种适用于我的方法之前,我对数据进行了多次重构,但测试和实验是查明是否存在瓶颈的最佳方法。另外,一旦您拥有可以使用的结构,请不要忘记为要查询的项目创建索引。如果您正在考虑稍后添加安全规则,请进行一些早期实验,以了解这将如何影响您的数据/查询。祝你好运! – Peter
是的,在围绕一个确定的结构构建之前,我肯定会做一些实验。更好地规划它,而不是改变它。谢谢 – WiserTheBassist