【问题标题】:Firebase Data Structure Best Practice For User Interaction用户交互的 Firebase 数据结构最佳实践
【发布时间】:2018-05-17 08:46:22
【问题描述】:

我正在构建一个评论应用,并想找出构建 Firebase 数据库以存储用户对标题和彼此的帖子的评论、喜欢和 cmets 的最佳做法。我正在使用 Xcode 和 Swift。

  1. 我是否创建一个单独的 REVIEWS 节点来存储所有评论,并为评论作者的用户 ID 设置一个 USER ID 子节点,并为正在审查的标题的 ID 设置一个 TITLE ID 节点?

  2. 我是否将与标题或用户关联的评论嵌套在标题和用户节点中?

  3. 当需要显示所有用户的评论时,我是否使用用户 ID 查询数据库?

  4. 为了显示标题的所有评论,我是否使用标题的 ID 进行查询?

谢谢

【问题讨论】:

    标签: swift firebase firebase-realtime-database


    【解决方案1】:

    这很难给出一个答案,因为有 100 种不同的结构可以工作。这是一个交联的双引用结构来说明这一点

    movies
       movie_0
         title: "Monty Python and the Holy Grail"
         reviewed_by
           uid_1: tre
         reviews
           review_0: true
    
    reviews
       review_0
         movie_id: "movie_0"
         uid: "uid_1"
         review: "Best movie evah"
    
    users
      uid_0
         name: "Tim"
         reviewed_movies:
           movie_0: true
         reviews
           review_0: true
    

    有了这种疯狂,你可以:

    query movies for which users reviewed it or which reviews
    query reviews for certain users, certain movies and that the actual review was
    query users for names, which movies that user reviewed and what the reviews were
    

    所以问题是;您需要查询什么?

    让我们带上你的#3

    当需要显示所有用户的评论时,我是否会查询 使用用户 ID 的数据库?

    我介绍的结构,如果你想得到一个用户的所有评论,你根本不需要查询!你直接观察用户节点

    let ref = fbRef.child("users").child("uid_0").child("reviews")
    ref.observe...
    

    然后您可以遍历结果以获取评论参考

    同样,您可以在评论节点中查询所有评论,其中 uid 是相关用户的 uid。

    我知道这不是一个具体的答案,但它确实提供了指导

    编辑

    其中一个 cmets 是一个特定的问题,所以让我这样解决。

    假设唯一的目标是查看特定电影的所有评论。结构可以大大简化:

    movies
       movie_0
         title: "Monty Python and the Holy Grail"
    reviews
       review_0
         movie_id: "movie_0"
         uid: "uid_1"
         review: "Best movie evah"
    users
      uid_1
         name: "Tim"
    

    然后假设我们知道电影和movie_0的电影id。为了获得评论和用户,这样的事情会起作用

    let reviewsRef = self.ref.child("reviews")
    let query = reviewsRef.queryOrdered(byChild: "movie_id").queryEqual(toValue: "movie_0")
    query.observeSingleEvent(of: .value) { snapshot in
        for child in snapshot.children {
            let snap = child as! DataSnapshot
            let dict = snap.value as! [String: Any]
            let uid = dict["uid"] as! String
            let review = dict["review"] as! String
    
            let userRef = self.ref.child("users").child(uid)
            userRef.observeSingleEvent(of: .value, with: { userSnapshot in
                let userDict = userSnapshot.value as! [String: Any]
                let userName = userDict["name"] as! String
                print("\(userName) said \(review)")
            })
        }
    }
    

    【讨论】:

    • 这是一个很好的回应。所以基本上,如果我想查看特定电影的所有评论,我可以直接这样做吗?我想我真正的问题是,在执行保存评论的功能代码时,我会将评论保存到三个不同的位置?用户、电影和评论,而不是一个评论节点,其中一个用户和电影 ID 作为子节点。
    • 您是某种教育工作者吗?你非常清楚和简洁。您之前对访问嵌套在节点中的子节点并遍历所有子节点的回复非常有帮助,并帮助我了解了更多信息。
    • 我不明白的一件事是你提出的“真实”价值观。
    • 我想我正在寻找最简单的方法来做到这一点,因为我在 firebase 方面还不够先进,无法用我的框架做任何花哨的事情。我现在已经用了十天了!
    • @ROKOKO 不,不是教育家;受教育的工程师和计算机科学,热爱的企业主和热情的程序员。 true 值允许在 Firebase 中作为键存储和访问引用(在本例中为 uid)。您可以将 'true' 视为占位符; Firebase 不允许 nil 值,所以你必须有一些东西作为值,所以使用 true 是常见的做法。它可以是“a”或“1”或“dude”——它只需要一些东西来允许存储密钥。如果你使用我的结构,那么是的,你会有重复的数据,但这在 Firebase 中很常见。我会在答案中添加更多内容。
    猜你喜欢
    • 2016-09-21
    • 2011-04-07
    • 2023-04-08
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 2017-07-02
    • 2013-09-22
    • 1970-01-01
    相关资源
    最近更新 更多