Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift Firebase数据结构用户交互最佳实践_Swift_Firebase_Firebase Realtime Database - Fatal编程技术网

Swift Firebase数据结构用户交互最佳实践

Swift Firebase数据结构用户交互最佳实践,swift,firebase,firebase-realtime-database,Swift,Firebase,Firebase Realtime Database,我正在开发一个评论应用程序,希望找出构建Firebase数据库的最佳实践,以存储用户对标题和彼此帖子的评论、喜好和评论。我正在使用Xcode和Swift 我是否创建了一个单独的评论节点,该节点存储所有评论,并具有一个用户ID子节点(用于评论作者的用户ID)和一个标题ID节点(用于被评论标题的ID) 我是否在标题和用户节点中嵌套与标题或用户关联的评论 当需要显示(比如说所有用户的评论)时,我是否需要使用用户的ID查询数据库 要显示标题的所有评论,我是否使用标题的ID进行查询 谢谢这很难给出一个答案

我正在开发一个评论应用程序,希望找出构建Firebase数据库的最佳实践,以存储用户对标题和彼此帖子的评论、喜好和评论。我正在使用Xcode和Swift

  • 我是否创建了一个单独的评论节点,该节点存储所有评论,并具有一个用户ID子节点(用于评论作者的用户ID)和一个标题ID节点(用于被评论标题的ID)

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

  • 当需要显示(比如说所有用户的评论)时,我是否需要使用用户的ID查询数据库

  • 要显示标题的所有评论,我是否使用标题的ID进行查询


  • 谢谢

    这很难给出一个答案,因为有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
    
    所以问题是,;您需要查询什么

    让我们拿着你的三块钱

    当需要显示(比如说所有用户的评论)时,我是否需要查询 使用用户ID的数据库

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

    let ref = fbRef.child("users").child("uid_0").child("reviews")
    ref.observe...
    
    然后,您可以对结果进行迭代以获得审阅引用

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

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

    编辑

    其中一条评论是一个具体的问题,所以让我这样说

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

    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"
    
    然后假设我们知道电影和电影的电影id_0。为了获得评论和用户,类似的东西会起作用

    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方面还不够高级,无法做任何花哨的事情还有我的框架。我现在已经干了十天了@不,不是教育家;工程师和计算机科学的学校教育,企业主的爱和程序员的激情。真值允许引用(本例中为uid)作为键存储和访问Firebase。您可以将“true”视为占位符;Firebase不允许nil值,因此您必须将某个值作为值,因此通常使用true。它可以是“a”或“1”或“dude”-它只需要一些东西来允许存储密钥。如果您使用我的结构,那么是的,您将有重复的数据,但这在Firebase中很常见。我将对答案再补充一些。