【问题标题】:Firebase database structuring for private messaging用于私人消息传递的 Firebase 数据库结构
【发布时间】:2017-11-02 10:07:42
【问题描述】:

有没有一种简单的方法来构建一个在两个用户之间有消息传递的数据库。在 firebase-database 中,您是否必须指向同一事物的指针? 我希望能够在两个用户下对对话进行伪克隆。这样,user1 就有了一个他正在与之交谈的人的列表,user2 也是如此,并且对话信息只需要存储一次。在写这篇文章时,我可能已经回答了我自己的问题,但这是我正在考虑的两种选择。 Block 2 似乎空间效率更高。有没有人对如何解决这个问题有任何其他建议。

块 1:每次发送消息时,都将其存储在两个用户下。

{
    messaging:
        user1:
            user2:
                message1: 
                    messageBody: "text"
                    sender: "user1"
                message2: 
                    messageBody: "text"
                    sender: "user2"
                message3: 
                    messageBody: "text"
                    sender: "user1"
        user2:
            user1:
                message1: 
                    messageBody: "text"
                    sender: "user1"
                message2: 
                    messageBody: "text"
                    sender: "user2"
                message3: 
                    messageBody: "text"
                    sender: "user1"

}

或者另一种选择是 Block2:每次发送消息时,将其存储在该会话引用下,但对于每对用户都有对该会话的引用。

{
    conversations:
        conversation1:
            message1: 
                messageBody: "text"
                sender: "user1"
            message2: 
                messageBody: "text"
                sender: "user2"
            message3: 
                messageBody: "text"
                sender: "user1"
pairs:
    user2:
        user1:
            conversationName: "conversation1"
    user1:
        user2:
            conversationName: "conversation1"

}

有没有办法在数据库里说,不管孩子的顺序,都指向同一个东西?所以第二行和第三行将引用相同的内容:

let dbRef = FIRDatabase.database().reference().child("messages")
let user1MessagesRef = dbRef.child("user1").child("user2")
let user2MessagesRef = dbRef.child("user1").child("user2")

【问题讨论】:

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

我正在开发一个使用 Firebase 的 iOS 开源聊天应用程序,我遇到了同样的问题。

我的问题是时间戳没有设置为相同的值,因此我创建了一个 Firebase 云函数,将对话中的消息克隆到用户数据中。

我的数据库布局如下:

chats:
    chatID: (Which is both users' IDs separated by an '&' character)
        messages:
            childAutoID1:
                message: "message body"
                timestamp: server timestamp value.
                userID: the id of the user who sent the message
            childAutoID:
                message: "message body"
                timestamp: server timestamp value.
                userID: the id of the user who sent the message
userData:
    userID1:
        userID2:
            message: "Last message"
            timestamp: latest message timestamp
            userID: latest message user id
    userID2:
        userID1:
            message: "Last message"
            timestamp: latest message timestamp
            userID: latest message user id

起初,我将消息从移动应用程序填充到 3 个位置:chats/chatID/messages、userData/userID1/userID2 和 userData/userID2/userID1 但我的问题是他们没有得到相同的时间戳,因为在将值填充到每个节点的时间之间存在微小的延迟。这就是为什么我创建了将消息从聊天/聊天 ID/消息复制到其他 2 个位置的云功能。

这里是云函数文件的链接:https://github.com/Tawa/TNChat/blob/master/Firebase/functions/index.js

也许这不是你所需要的,但我希望它能帮助你解决你的问题。

该项目仍未记录,我计划在未来几天内记录它。

编辑:忘了提到云功能还会向收件人的设备发送静默通知。检查 AppDelegate 以了解它是如何处理的。 :)

【讨论】:

  • 嗨 TawaNicolas。感谢您的答复。特别是,虽然我试图看看是否有办法以节省空间的方式做到这一点。例如在 python 中,当你执行 x={'a':1,'b':2}; y=x; z={'a':1,'b':2}; x 和 z 指向完全不同的对象,但 x 和 y 指向同一个对象,因此您只有 2 个对象存储在内存中,而 y 只是指向同一个对象。
  • 您所做的确实带来了使用与号在两个用户之间创建独特聊天模式的选项。如果用户名是唯一的,并且您将两个用户名按字母顺序排列并与 & 连接,假设用户名没有此字符,那么您可以存储一次聊天信息,并在获得消息列表时轻松找到消息列表的键参与消息的两个用户。并且密钥将是一致的,因为您按字母顺序排列了两个用户名
  • @CentripetalA I 您不能指向 Firebase 数据库中的同一个对象。它们必须写在不同的位置。但是,作为节省空间,您可以做一些已经完成但在 THCat 中注释掉的事情:您可以在阅读消息后删除它们。这是我能想到的节省空间的最佳解决方案,因为我自己也在考虑节省空间。但现在我禁用了它。
  • @CentripetalA 用户名是 TNChat 中的电话号码,因此它们是唯一的,不会出现您担心的冲突。你也应该这样做,不要使用用户名作为用户 ID,找出一个唯一的密钥并使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 2016-10-20
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
相关资源
最近更新 更多