【问题标题】:Removing users of a team in a denormalized Firebase structure在非规范化 Firebase 结构中删除团队的用户
【发布时间】:2019-05-12 04:50:27
【问题描述】:

我有一些以这种方式构建的 firebase 数据。这真的很简单,但我不知道是否有更简单的方法来构建它以有效地添加和删除团队成员。

在这种情况下,有属于团队的用户和拥有用户的团队。很基本的东西。

users:{
    user1:{
        name: "username",
        profilePicUrl: "https://...",
        teams:{
            team1:true
        }
    },
    user2:{
        ...
    } 
}
teams:{
    team1:{
        name:"SuperTeam",
        members:{
            user1: true,
            user2: true,
            ....
        }
    }
}

我将提出两个问题。一个要求一个团队的所有成员,另一个要求一个成员的所有团队。

在界面中,我有一个多重选择,用户可以在其中选择团队成员。该人将选择/取消选择多个用户并按下保存按钮。

当用户按下保存时,会发生以下事情。

  • 我删除了 teams 表的所有成员并设置了新成员 基于所选选项。

  • 我将团队添加到选定的用户 "user/:userId/teams/:teamId" 设置 => true

但是从用户表中删除一个团队呢?我想不出一个有效的方法来做到这一点。我提出的解决方案如下。

  • 使用多个更新设置团队更新所有用户 null 或 true 取决于选择。这可能适用于小 集,但对于大量用户来说似乎效率不高。
  • 删除用户表中的“团队”数组并获取团队 每个用户通过查询“teams/:teamId/members/userX”等于 真的。这样我只需要更新团队表。它有效,但 它必须下载所有 Teams 数据,对于大型数据库来说 效率不高。

  • 在保存按钮打开时查找所选选项的更改 按下并仅更新更改的用户(我最喜欢的 远)。

还有其他方法来构建数据库吗?还有其他方法可以轻松地从成员中删除团队吗?

【问题讨论】:

    标签: firebase firebase-realtime-database denormalization


    【解决方案1】:

    在我看来,乍一看,您的数据库结构已经足够好了。我可以建议进行更改的事实是,您将用户所属的团队存储在 users 节点中,当存在多个团队时,这会使查询变得有点困难。

    您必须根据您的要求在其中的许多中输入 false 并在其中的一些中输入 true。

    您应该只将有关团队的信息放在 teams 节点中,而将有关用户的其他相关信息放在 users 节点中。

    另外,如果团队本身有一个名称,那么在结构中将其命名为 team1 然后给出正确的名称,这与您在问题中所说的相比似乎是多余的。

    所以你的数据库结构应该是这样的:

    users:{
        user1:{
            name: "username",
            profilePicUrl: "https://...",
            otherInfo : ...
        },
        user2:{
            ...
        } 
    }
    teams:{
        SuperTeam{
             otherInfo: ...
             members:{
                user1: true,
                user2: true,
                ....
            }
        },
    
        MegaTeam {
             otherInfo: ...
             members:{
                user1: true,
                user2: true,
                ....
            }
        }
    
    }
    

    现在要删除一个团队,比如说MegaTeam,您只需从teams 节点中删除一个节点,有关成员的信息也将被删除,因此您无需再次查询即可删除来自users 节点的团队和其他信息。

    编辑:

    由于您使用的是 Firebase,因此 (noSQL) 最好的事情是您可以更改数据库并对其进行调整以满足您的需求。所以我想说,更好的方法是为团队与用户建立单独的结构。

    【讨论】:

    • 我如何进行查询以获取单个用户的所有团队?比如,给我“user1”团队。
    • 如果你想获得有用户的团队,那么最好使用你拥有的结构。但是话又说回来,你会很难移除团队。查看我的编辑。
    • @JoséNúñez 将答案标记为正确,方法是单击答案旁边的 V 型按钮,它应该变成绿色。这有助于问题的未来读者,我也很感激。干杯! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 2017-10-05
    • 2015-05-15
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    相关资源
    最近更新 更多