我正在Swift中创建一个与餐厅评分应用类似的应用,其中用户在不同的餐厅发表评论。现在,我可以使用以下代码将用户的注释成功保存到数据库中。我的应用程序不需要注册或登录屏幕,用户可以根据需要直接发表评论,因此我将currentUserID设置为匿名。

@IBAction func OnSubmitTouched(_ sender: UIButton) {
    if (textField.text != ""){

       let ref = Database.database().reference()
       let commentsReference = ref.child("comments")
       let newCommentID = commentsReference.childByAutoId().key
       let newCommentReference = commentsReference.child(newCommentID)
       // guard let currentUser = Auth.auth().currentUser else {
       //     return
       // }
        var currentUserID = "anonymous"
        if let currentUser = Auth.auth().currentUser {
               currentUserID = currentUser.uid
        }
       // let currentUserID = currentUser.uid
        newCommentReference.setValue(["uid": currentUserID, "commentText": textField.text!]) { (error, ref) in
            if error != nil {
                print(error!.localizedDescription)
                return
            }
}


现在,问题是,当向其他用户显示这些评论时,如何以一种方式分隔所有餐馆的评论,以使所有餐馆最终都不会拥有完全相同的评论部分?在仪表板中,我可以为每个餐厅的评论记录创建子记录,但是,应用程序中有1000多个餐厅,这将花费大量时间。将餐厅名称视为表视图中的单元格,用户不能添加餐厅,而只能添加评论。
如果有人能帮助我,我将感到非常高兴。我知道该职位有点长,但我只是想确保所有内容都清楚。提前非常感谢您!

最佳答案

好吧,首先是第一件事;如果您担心因为餐厅节点不在那里而无法在Firebase中的某个位置存储数据,请不必担心。

当您写入位置(例如comments/restaurantNameOrIDHere/comment1/)时,如果沿途未定义任何节点(例如commentsrestaurantNameOrIDHere),则Firebase会为您创建该节点。

顺便说一句,进入数据库结构。有两种方法可以立即使我脱颖而出。


将餐厅名称/标识存储在评论中,并将所有评论存储在comments/节点下。


优点:鉴于注释具有足够的信息可以使您知道数据库属于哪个餐厅,因此可以使数据库更加平坦和规范化。
缺点:这将要求您在注释对象中添加一个字段。这也意味着查询特定餐厅的评论会更加昂贵。它要么必须获取所有注释,然后过滤掉不属于所讨论餐厅的注释,要么必须在Firebase查询上进行过滤,这在Firebase方面要昂贵得多。

将评论存储在餐厅名称/标识节点(例如comments/reallyCoolRestaurant/)下。


优点:这使您可以按餐厅名称/标识原样存储评论,这意味着现在开发时间更少了。这也使得要求给定餐厅的所有评论都变得非常便宜和容易。
缺点:由于所有评论都分布在许多不同的餐厅节点中,因此访问所有评论变得有些麻烦。



由于以下原因,我个人倾向于将两者结合使用:


根据评论所属的餐厅将其存储在存储桶中,可以轻松高效地查询餐厅的评论。
在将来可能需要提取和分析餐馆评论的情况下,存储评论所属的餐馆可能会很有用。


如果您想保持简单,只选择一个,那么我会选择第二个。

关于swift - Firebase显示来自数据库的不同注释,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52011751/

10-11 19:52
查看更多