快速加载“相关”数据的最佳方法是什么?

通用设置,如果我有一个用户列表,所有用户都存储在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,其中允许一些嵌套。

10-04 19:37