用于firebase聊天的NoSQL数据库设计

问题描述 投票:8回答:1

我正在firebase的帮助下设计一个聊天应用程序,但我对数据库设计感到震惊。我已阅读firebase structure data for app提供的以下链接

我目前的做法:

"messages" : {
  "-Kkiyu4zSKQAzu3MxpGe": {
    "recId" : 1994,
    "senderId" : 9,
    "senderName" : "Alex",
    "text" : "Hello",
    "time" : "2017-05-22T12:37:41+0530"
  },
  "-Kkiyw1yVTbR_wDFFiuA" : {
    "recId" : 9,
    "senderId" : 1994,
    "senderName" : "Ted",
    "text" : "Hi",
    "time" : "2017-05-22T12:37:49+0530"
  },
  "-KkiywFENy__tCHuuuom" : {
    "recId" : 1994,
    "senderId" : 9,
    "senderName" : "Alex",
    "text" : "What's up?",
    "time" : "2017-05-22T12:37:50+0530"
  },
  "-KkiyxDjsUIXBlM0Cn3R" : {
    "recId" : 9,
    "senderId" : 1994,
    "senderName" : "Ted",
    "text" : "All good",
    "time" : "2017-05-22T12:37:54+0530"
  }

类似地,我有用户JSON结构,在该结构中,我有3种类型的用户,如下所示

1. Branch Manager 2. Delivery boy 3. Admin

"users" : {
  "9" : {
    "empId" : 9,
    "isOnline" : false,
    "name" : "Alex",
    "userType" : "M"
  },
  "1994" : {
    "branchId" : 9,
    "empId" : 1994,
    "isOnline" : false,
    "name" : "Ted",
    "userType" : "D"
  },
  "25" : {
    "empId" : 25,
    "isOnline" : false,
    "name" : "Tim",
    "userType" : "A"
  }
}

我的应用程序中的听众如下:

sendReference.observe(.childAdded, with: { (snapshot) in
        if let data = snapshot.value {
            let message = RCMessage(object: data)
                message.Id = snapshot.key
            let dbManager = RCPersistencyManager()
                dbManager.add(message: message)
        }
    })

receiveReference.observe(.childAdded, with: { (snapshot) in
        if let data = snapshot.value {
            let message = RCMessage(object: data)
            message.Id = snapshot.key
            let dbManager = RCPersistencyManager()
            dbManager.add(message: message)
            dbManager.update(userwithMessage: message)
        }
    })

我添加了我的发送者ID和我的接收器ID上的听众,我认为这是切肉刀,因为我将收到只有发送或指向我的信息。

sendReference = companyReference.child("messages").queryOrdered(byChild: "senderId").queryEqual(toValue: Int(RCDataManager.get(stringforKey: "RCUserID")!))

receiveReference = companyReference.child("messages").queryOrdered(byChild: "recId").queryEqual(toValue: Int(RCDataManager.get(stringforKey: "RCUserID")!))

但是现在更大的问题到了我在应用程序处于前台时附加这些监听器现在我收到的数据是在以下查询下创建的每个子项我确实为应用程序维护了一个本地数据库但我不想让所有的孩子一次又一次,当孩子的数量超过200或说300,同步数据库需要时间,这会降低我的应用程序的性能我想只获得查询下的新消息,我知道这个设计不好得到真的很期待好的答案。

提前致谢

ios swift firebase firebase-realtime-database chat
1个回答
0
投票

我收到的数据是在以下查询下创建的每个孩子我为app维护了一个本地数据库,但我不想一次又一次地让所有的孩子,因为当孩子的数量超过200或300说需要时间来同步数据库,这会降低我的应用程序的性能我想只获得查询下的新消息

你的问题有很多要解压缩,但这只是显示你的细节。尝试解压问题,您似乎真的只是想将查询结果限制在最近。

为了做到这一点,请查看filtering your data

Firebase Query Filtering Methods (Swift)

如果我是你几乎伪代码,我会怎么做:

1) Initial population of local cache of messages.
2) On subsequent opens, query your local cache for the 
    newest message and check the `time` at which it was created
3) In your queries to Firebase, add the queryStartingAtValue and pass it your last synced time and you'll only receive new messages.

如果不知道你的用户界面是什么样的,很难说限制你下载的邮件数量的可行性,因为你需要某种“加载更多”指标才能无缝地完成。该方法与初始载荷相同。

© www.soinside.com 2019 - 2024. All rights reserved.