移除非规范化Firebase结构中的团队用户

时间:2018-12-11 08:23:46

标签: firebase firebase-realtime-database denormalization

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

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

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

我将进行两个查询。一个要求一个团队的所有成员,另一个要求一个成员的所有团队。

在界面中,我具有多个选择,用户可以在其中选择团队成员。此人将选择/取消选择多个用户,然后按保存按钮。

当用户按Save时,将发生以下情况。

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

  • 我将团队添加到具有 “ user /:userId / teams /:teamId” set => true

但是从用户表中删除团队又如何呢?我想不出一种有效的方法。我提出的解决方案如下。

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

  • 当保存按钮为时,查找所选选项中的更改 按下并仅更新已更改的用户(我最喜欢的是 远)。

还有另一种结构化数据库的方法吗?还有其他选择可以方便地从成员中删除团队吗?

1 个答案:

答案 0 :(得分:0)

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

您将不得不对许多错误项进行伪造,而根据您的要求对其中一些错误项进行伪造。

您宁愿只将有关团队的信息放在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),所以最好的办法是可以更改数据库并对其进行调整以适合您的需求。因此,我想说,更好的方法是为使团队与用户建立单独的结构。