2016-03-13 56 views
5

从多年使用关系型数据库的到来,我试图开发使用火力结构一个的NoSQL数据库聊天应用程序(使用火力)

一个非常基本的聊天/即时通讯应用

火力使用使用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。

我的问题是,这可以用更好的方式来构造吗?目标是随着应用用户的增长而扩大规模,并尽可能获得最佳性能。

存储信息的可能是这个样子
+1

Firebase数据结构取决于您想要对数据执行的操作。所呈现的是非常可扩展的,可查询的并且节点对于变化是可观察的。此外,Firebase的速度非常快,可以轻松处理数千个请求。但是,如果不了解全面的范围或对数据的具体问题,这是一个开放式问题。例如;聊天节点的功能是什么?会话节点包含跟踪与另一个用户的对话所需的一切。例如用户登录后,查询包含其用户标识的所有会话,然后观察它们。 – Jay

+0

把它看作是一个基本的WhatsApp应用程序,你有一个活动,显示我所有的聊天。当我点击聊天时,我得到了“详细视图”,这是两个用户之间的会话消息。 –

+0

这个问题本身解释了应用程序的作用,但结构的使用是模糊的;所描述的功能可以通过对话节点轻松完成。使数据非规范化非常重要,但不要仅仅为了在没有必要时创建另一个节点。在这种情况下,它可能或可能不是必需的。这个问题需要更加具体,所以我会建议编写一些测试代码,当你遇到问题时,*然后*发布你的具体问题。 – Jay

回答

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构建了一个类似松弛的应用: https://thinkster.io/angularfire-slack-tutorial

如果您想要更具体的内容,更多信息将会有所帮助。

+0

但simplelogin2登录的是什么,您将如何找到该用户的聊天消息? – Ruben

+1

你可能会在'simplelogin2'下存储相同的信息。是的,它会复制数据库中的信息,但这通常是您在NoSQL中快速查询时支付的代价。 –

+0

你有更多的例子吗?它非常奇怪,并且在数据库中有两次或两次以上的直接反应。在firebase网站(https://firebase.google.com/docs/database/web/structure-data)上有一个不同的聊天应用程序结构,但我不明白你如何阅读这些数据,有钥匙一,二,三..但如果我以“g'”身份登录,如何才能找到当前聊天的正确密钥 – Ruben