我正在构建一个评论应用,并希望找出构建Firebase数据库的最佳实践,以存储用户对标题和其他帖子的评论,评论和评论。我正在使用Xcode和Swift。
我是否创建了一个单独的REVIEWS节点来存储所有评论,并且具有用于评论作者的用户ID的USER ID子节点以及正在审阅的Title的ID的TITLE ID节点?
我是否在标题和用户节点中嵌套与标题或用户相关的评论?
当显示时间说出所有用户的评论时,我是否会使用用户的ID查询数据库?
要显示标题的所有评论,我是否使用标题ID进行查询?
由于
答案 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)")
})
}
}