我尝试使用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&消息是一样的,我厌倦了弥补变量。
答案 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
}
}
}
}
}