【问题标题】:Decent data structure for Firebase messaging?Firebase 消息传递的体面数据结构?
【发布时间】:2016-10-20 11:48:28
【问题描述】:

我正在尝试开始使用 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 是相同的,我厌倦了编造变量。

【问题讨论】:

标签: firebase firebase-realtime-database


【解决方案1】:

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

按照这种思路,将用户名保留在对话节点中是有意义的。事实上,我通常也会在每个消息节点中保留用户名。后者避免了查找的需要,尽管在这种情况下,为了使代码尽可能简单,我可能会稍微扩展数据模型。

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

【讨论】:

  • 将所有内容存储在一个位置的问题是,当加载“对话”时(实际上是我的应用程序中的不同关系,但对话更容易),消息并不总是相关的。此外,用户之间的消息不应该一次全部加载,如果他们都在同一个对象下,这是必需的,即使假设我们只想加载 50 条最近的消息。将其全部存储在一个位置会影响规模的性能。此外,这允许在不加载消息的情况下查询“对话”。
【解决方案2】:

我认为你的结构不正确。您应该牢记“假设”的完整分析。

不过,我建议以这种方式构建它(我是为了好玩而编造的,并没有在获得巨大流量时对性能进行真正的测试。但您总是可以在需要时进行非规范化以提高性能):

{
  "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
            }
      }
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    相关资源
    最近更新 更多