【问题标题】:Fetching details of a group user belongs to in firebase在firebase中获取用户所属组的详细信息
【发布时间】:2018-02-21 09:04:18
【问题描述】:

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

用户

-userId

    -Name
    -age
    -groups

        groupId1:true
        groupId2:true

-groupId

    -name
    -desc
    -UserId

        -UserId1:true
        -UserId2:true

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

  1. 通过检查来自用户的索引查找我的用户所属的所有组。
  2. 使用我们从第 1 步获得的 groupid 列表,从 Groups 中获取组的详细信息。

还有其他更好的建议吗?

【问题讨论】:

  • 我认为这也是最好的解决方案

标签: firebase firebase-realtime-database many-to-many nosql


【解决方案1】:

使用您当前的数据结构,您确实必须采用两步法:

  1. 加载组 ID 列表
  2. 加载每个组的元数据(例如名称)

这称为客户端连接,在 Firebase 中很常见。

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

UserGroups
  User1
    Group1: "This is the first group"
    Group2: "This is the second group"

正如您在此示例中看到的,我们已将 true 标记替换为组的实际名称。这样做的好处是,对于一个简单的用例,您只需要阅读此列表而无需进行客户端连接。缺点是您需要决定是否/如何保持数据同步。我在这里写了一个带有选项的答案:How to write denormalized data in Firebase

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

Users
Groups
UserGroups
GroupUsers

这是多对多关系的常见模式,我在这里进一步描述:Many to Many relationship in Firebase

【讨论】:

  • 由于我的应用程序每次更改时都需要更新组信息,因此我更喜欢使用第一种方法进行两步检索。
  • 通过上述方法,我遇到了麻烦。有人可以就这个问题提供任何建议stackoverflow.com/questions/46204767/…
【解决方案2】:

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

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];
      }
    }
  }];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2020-06-19
    • 2014-11-30
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    相关资源
    最近更新 更多