获取firebase中用户所属组的详细信息

获取firebase中用户所属组的详细信息,firebase,firebase-realtime-database,many-to-many,nosql,Firebase,Firebase Realtime Database,Many To Many,Nosql,下面是我在firebase中的数据库结构。我只登录了用户Id 使用者 团体 我想列出用户所属的所有组的详细信息。 我的做法是, 通过检查来自用户的索引,查找我的用户所属的所有组 使用我们从步骤1获得的groupid列表,从Groups中获取组的详细信息 还有其他更好的建议吗?根据您当前的数据结构,您确实需要采用两步方法: 加载组ID列表 加载每个组的元数据(例如名称) 这称为客户端连接,在Firebase中非常常见 或者,您可以在每个用户的组下复制关于每个组的最重要信息。例如 UserGroup

下面是我在firebase中的数据库结构。我只登录了用户Id

使用者

团体

我想列出用户所属的所有组的详细信息。 我的做法是,

  • 通过检查来自用户的索引,查找我的用户所属的所有组
  • 使用我们从步骤1获得的groupid列表,从Groups中获取组的详细信息
    还有其他更好的建议吗?

    根据您当前的数据结构,您确实需要采用两步方法:

  • 加载组ID列表
  • 加载每个组的元数据(例如名称)
  • 这称为客户端连接,在Firebase中非常常见

    或者,您可以在每个用户的组下复制关于每个组的最重要信息。例如

    UserGroups
      User1
        Group1: "This is the first group"
        Group2: "This is the second group"
    
    正如您在本示例中看到的,我们已将
    true
    标记替换为组的实际名称。这样做的好处是,对于一个简单的用例,您只需阅读此列表,而不必进行客户端连接。缺点是您需要决定是否/如何保持数据同步。我在这里写了一个带有选项的答案:

    请注意,您的数据模型并没有完全展平,因为您混合了实体类型。我建议将每个用户的元数据(他们的名称和描述)从“用户所属的组列表”中分离出来。这将为您留下四个顶级列表:

    Users
    Groups
    UserGroups
    GroupUsers
    

    这是多对多关系的常见模式,我在这里进一步描述了它:

    下面的方法将检索用户所属的组详细信息

    self.usersPerGroupRef = [_rootRef child:@"Group"];
      [_usersPerGroupRef observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {
        self.usersArray = [NSMutableArray new];
        for (snapshot in snapshot.children) {
          NSMutableDictionary *groupDict = [NSMutableDictionary new];
          groupDict = snapshot.value[@"UserId"];
          if ([groupDict objectForKey:@"userID"]) { 
           NSLog(@"Group Name: %@",snapshot.value[@"name"]);
            [self.usersArray addObject:snapshot.key];
          }
        }
      }];
    

    我认为这是最好的解决方案,因为我的应用程序每次更改时都需要更新组信息,我更喜欢使用第一种方法,即执行两步检索。通过执行上述方法,我遇到了一个showstopper。是否有人可以就此问题提供任何建议
    Users
    Groups
    UserGroups
    GroupUsers
    
    self.usersPerGroupRef = [_rootRef child:@"Group"];
      [_usersPerGroupRef observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {
        self.usersArray = [NSMutableArray new];
        for (snapshot in snapshot.children) {
          NSMutableDictionary *groupDict = [NSMutableDictionary new];
          groupDict = snapshot.value[@"UserId"];
          if ([groupDict objectForKey:@"userID"]) { 
           NSLog(@"Group Name: %@",snapshot.value[@"name"]);
            [self.usersArray addObject:snapshot.key];
          }
        }
      }];