快速加载“相关”数据的最佳方法是什么?
通用设置,如果我有一个用户列表,所有用户都存储在uid
节点下,并且包含一个存储uid的follows
列表,例如:"users" : { "abc123" : { "email" : "[email protected]", "follows" : { "xyz789" : true } }, "xyz789" : { ... }}
一个用户遵循的所有用户最有效的数据加载方式是什么?最好通过uid
遍历每个observeSingleEvent(of: .value)
吗?
这是我想出的解决方案,但感觉有些麻烦:
func loadRelated(user: User, completion: @escaping (Bool, [UserObject]) -> ()) {
let ref = Database.database().reference(withPath: "users/" + user.uid + "/follows")
ref.observeSingleEvent(of: .value) { snapshot in
var uids = [String]()
for child in snapshot.children {
let userData = child as! DataSnapshot
uids.append(userData.key)
}
let userRef = Database.database().reference(withPath: "users")
var users = [UserObject]()
var count = 0
uids.forEach { uid in
userRef.child(uid).observeSingleEvent(of: .value) { snapshot in
let user: UserObject(from: snapshot)
users.append(user)
count += 1
if count == uids.count {
completion(true, users)
}
}
}
}
}
我真的不想沿着非规范化路径走下去,并将每个用户的数据存储在顶级用户下。
最佳答案
如果决定使用Realtime Database,则最佳做法是在您的情况下创建另一个名为user-follows
的根节点。您可以通过将值设置为user-follows/$uid/$fid
来在路径true
上创建关注,然后在您的应用中,您必须为observeSingleEvent
上的每个快照键($fid
)输入user-follows/$uid
。
为了避免分别观察每个后续步骤,您不必将值设置为true
,而只需将您需要的有关用户的数据存储在user-follows/$uid
中。但是,例如,用户可以更改其用户名,因此您需要使每个user-follows
中的数据保持最新。您可以在用户更改信息时利用Firebase Cloud Functions维护user-follows
。
否则,我建议您查看Firebase Firestore,其中允许一些嵌套。