这很难给出一个答案,因为有 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)")
})
}
}