Firebase显示来自数据库的不同注释

时间:2018-08-24 21:08:09

标签: swift firebase firebase-realtime-database

我正在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多个餐厅,这将花费大量时间。将餐厅名称视为表视图中的单元格,用户不能添加餐厅,只能添加评论。 如果有人能帮助我,我将感到非常高兴。我知道该职位有点长,但我只是想确保所有内容都清楚。提前非常感谢您!

1 个答案:

答案 0 :(得分:0)

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

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

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

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

    • 优点:鉴于注释具有足够的信息以使您知道其所属的餐厅,因此这可以使数据库更加扁平化和规范化。
    • 缺点:这将要求您在注释对象中添加一个字段。这也意味着查询特定餐厅的评论会更加昂贵。它要么必须获取所有注释,然后过滤掉不属于所讨论餐厅的注释,要么必须在Firebase查询中进行过滤,这在Firebase方面比较昂贵。
  2. 将评论存储在餐厅名称/ id节点下,例如comments/reallyCoolRestaurant/

    • 优点:这使您可以按餐厅名称/标识原样存储评论,这意味着现在开发时间更少了。它还使询问给定餐厅的所有评论变得异常便宜和容易。
    • 缺点:访问所有评论变得更加麻烦,因为它们分布在许多不同的餐厅节点中。

出于以下原因,我个人倾向于将两者结合起来:

  • 根据评论所属的餐厅将其存储在存储桶中,可以轻松高效地查询餐厅的评论。

  • 存储评论所属的餐厅可能在将来需要提取和分析餐厅评论的情况下很有用。

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