Firebase消息传递的体面数据结构?

时间:2016-06-18 21:42:24

标签: firebase firebase-realtime-database

我尝试使用Firebase,我只是想确保此数据结构针对Firebase进行了优化。

会话对象/树/看起来像这样:

conversations: {
  "-JRHTHaKuITFIhnj02kE": {
    user_one_id: "054bd9ea-5e05-442b-a03d-4ff8e763030b",
    user_two_id: "0b1b89b7-2580-4d39-ae6e-22ba6773e004",
    user_one_name: "Christina",
    user_two_name: "Conor",
    user_one_typing: false,
    user_two_typing: false,
    last_message_text: "Hey girl, what are you doing?",
    last_message_type: "TEXT",
    last_message_date: 0
  }
}

,消息对象如下所示:

messages: {
  "-JRHTHaKuITFIhnj02kE": {
    conversation: "-JRHTHaKuITFIhnj02kE",
    sender: "054bd9ea-5e05-442b-a03d-4ff8e763030b",
    message: "Hey girl, what are you doing?",
    message_type: "TEXT",
    message_date: 0
  }
}

是否需要在对话对象中存储相对于用户的名称,还是可以通过用户UID轻松查找用户名?除了名称问题,这个好吗?我不想开始使用非常糟糕的数据结构。

注意:是的,我知道对话的UID&消息是一样的,我厌倦了弥补变量。

2 个答案:

答案 0 :(得分:0)

我通常会在数据库中的单个位置对单个屏幕中显示的数据进行建模。这使得可以使用单个读/侦听器检索该数据。

按照这种思路,将用户名保留在会话节点中是有意义的。实际上,我通常也会在每个消息节点中保留用户名。后者可以防止查找,尽管在这种情况下我可能会将数据模型扩展到一点,以保持代码尽可能简单。

对于聊天的命名:如果这是一个相当标准的聊天应用程序,那么用户可能希望彼此之间保持1:1的持续聊天,这样每次你和我聊天时,我们最终会相同房间。在这个答案中可以找到一种在数据模型中实现这一目标的好方法:Best way to manage Chat channels in Firebase

答案 1 :(得分:0)

我认为你的结构并不正确。你应该记住“如果”完整的分析。

尽管如此,我建议采用这种方式构建它(我为了获得很大的流量而不是在性能方面做了很多测试。但是你可以随时进行非规范化以在需要时提高性能):

{
  "conversation-messages" : {
    "--JpntMPN_iPC3pKDUX9Z" : {
      "-Jpnjg_7eom7pMG6LDe1" : {
        "message" : "hey! Who are you?",
        "timestamp" : 1432165992987,
        "type" : "text",
        "userId" : "user:-Jpnjcdp6YXM0auS1BAT"
      },
      "-JpnjibdwWpf1k-zS3SD" : {
        "message" : "Arya Stark. You?",
        "timestamp" : 1432166001453,
        "type" : "text",
        "userId" : "user:-OuJffgdYY0jshTFD"
      },
      "-JpnkqRjkz5oT9sTrKYU" : {
        "message" : "no one. a man has no name.",
        "timestamp" : 1432166295571,
        "type" : "text",
        "userId" : "user:-Jpnjcdp6YXM0auS1BAT"
      }
    }
  },
  "conversations-metadata" : { // to show the conversation list from all users for each user
    "-JpntMPN_iPC3pKDUX9Z" : {
        "id": "-JpntMPN_iPC3pKDUX9Z",
        "date":995043959933,
        "lastMsg": "no one. a man has no name.",
        "messages_id": "-JpntMPN_iPC3pKDUX9Z"
    }
  },
  "users" : {
    "user:-Jpnjcdp6YXM0auS1BAT" : {
      "id" : "user:-Jpnjcdp6YXM0auS1BAT",
      "name" : "many-faced foo",
      "ProfileImg" : "...."
      "conversations":{
            "user:-Yabba_Dabba_Doo" : {
                "conversation_id": "-JpntMPN_iPC3pKDUX9Z",
                "read" : false
            }
      }
    },
    "user:-Yabba_Dabba_Doo" : {
      "id" : "user:-Yabba_Dabba_Doo",
      "name" : "Arya Stark",
      "ProfileImg" : "...."
      "conversations":{
            "user:-Jpnjcdp6YXM0auS1BAT" : {
                "conversation_id": "-JpntMPN_iPC3pKDUX9Z",
                "read" : true
            }
      }
    }
  }
}