Firebase数据结构用户互动的最佳实践

时间:2017-12-03 22:22:56

标签: swift firebase firebase-realtime-database

我正在构建一个评论应用,并希望找出构建Firebase数据库的最佳实践,以存储用户对标题和其他帖子的评论,评论和评论。我正在使用Xcode和Swift。

  1. 我是否创建了一个单独的REVIEWS节点来存储所有评论,并且具有用于评论作者的用户ID的USER ID子节点以及正在审阅的Title的ID的TITLE ID节点?

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

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

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

  5. 由于

1 个答案:

答案 0 :(得分: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。

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

修改

其中一条评论是一个具体问题,所以让我这样解决。

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

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)")
        })
    }
}