0

我刚开始使用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" 
    } 
    } 
} 

我要为某一个地方获取所有的信息和每个消息将 需要有连接到它的发送者的头像和名字。 非规范化结构仍然是更好的选择吗?

如果规范化的结构仍然是首选,那么我应该如何加入表格? 我的第一个尝试是获取一个地方的所有消息,然后获取每个消息的每个用户 但我怀疑这将是最好的解决方案。

感谢您的帮助!

+0

也许不是你要找的答案,但我建议你做一些简短的实验测试你的用例。在我找到一种适用于我的方法之前,我对数据进行了多次重构,但测试和实验是查明是否存在瓶颈的最佳方法。另外,一旦您拥有可以使用的结构,请不要忘记为要查询的项目创建索引。如果您正在考虑稍后添加安全规则,请进行一些早期实验,以了解这将如何影响您的数据/查询。祝你好运! – Peter

+0

是的,在围绕一个确定的结构构建之前,我肯定会做一些实验。更好地规划它,而不是改变它。谢谢 – WiserTheBassist

回答

0

由于我们不知道应用程序的最终游戏是什么,所以不可能说最好的方法。你是否需要搜索消息,用户等?你想列出用户吗?

既然你提到:

“如果用户改变了形象只有新的消息将显示为”

你已经回答了你自己的问题,我认为。您应该规范化数据,因此消息和用户是分开的。

Firebase不是关系数据库,因此您不会加入任何表格。您查询消息。一旦获得第一条消息,您就可以开始从消息中的用户标识中查询用户。您将最终为消息查询一次,并为您需要的每个用户查询一次。您可以聪明地查询用户,只查询用户是否已查询过用户。

你可以看看如何做到在火力地堡“加盟”,而不是你如何做到这一点的SQL this short video

+0

为了回答你的问题,我的目标是建立一个简单的聊天,同时也会有图像和视频。每个聊天室/工作组都有多个用户,但不需要搜索或用户列表。 因此,从我的理解你的答案是,我应该优先于非规范化数据结构的规范化,而是寻找一种有效的方法来通过另一个查询访问消息的发件人。 是的,我会保留在我的状态下所有提取的用户列表,并且只提取用户对象,如果它以前没有被提取。 非常感谢! – WiserTheBassist

+0

是的,在这种情况下请去规范化的数据。 PS。请勿使用Firebase数据库来存储图像/视频。查看Firebase存储。然后从数据集链接到存储路径(即使更多的查询,但您获得其他优势)Ds – Peter

相关问题