Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 多对多层次关系_Sql_Many To Many - Fatal编程技术网

Sql 多对多层次关系

Sql 多对多层次关系,sql,many-to-many,Sql,Many To Many,在我的应用程序中,我有三个主要表: 使用者 团体 角色 任何组合都有多对多的关系。用户可以位于不同的组中,在每个组中具有不同的角色 最简单的部分是映射用户和组,由中间表user\u group完成。然后,在设计如何将三者联系在一起时,我产生了一些疑问 Q:我是否在用户组中添加另一列?或者创建其他中间表? 考虑到第二种选择,我尝试了以下方法: 这(我认为)将使在前端检索我需要的信息更容易、更整洁: 用户可用的组(user\u Group) 可用于组的角色(组\角色) 给定组中用户可用的角色(u

在我的应用程序中,我有三个主要表:

  • 使用者
  • 团体
  • 角色
  • 任何组合都有多对多的关系。用户可以位于不同的组中,在每个组中具有不同的角色

    最简单的部分是映射用户和组,由中间表
    user\u group
    完成。然后,在设计如何将三者联系在一起时,我产生了一些疑问

    Q:我是否在
    用户组中添加另一列?或者创建其他中间表?

    考虑到第二种选择,我尝试了以下方法:

    这(我认为)将使在前端检索我需要的信息更容易、更整洁:

  • 用户可用的组(
    user\u Group
  • 可用于组的角色(
    组\角色
  • 给定组中用户可用的角色(
    user\u group\u Role

  • 我将使用现有联接表中的附加列。您仍然可以相当轻松地回答所有问题:

  • 用户可用的组

    select *
    from Roles r
    join JoiningTableName j on r.Role_Id = j.Role_Id
    where j.User_Id = myUserId
    
  • 组可用的角色

    select *
    from Roles r
    join JoiningTableName j on r.Role_Id = j.Role_Id
    where j.Group_Id = myGroupId
    
  • 给定组中用户可用的角色

    select *
    from Roles r
    join JoiningTableName j on r.Role_Id = j.Role_Id
    where j.User_Id = myUserId and j.Group_Id = myGroupId
    

  • 我不认为你在文章末尾提出的模式有任何问题

    • 它确保
      用户
      可以关联到
      ,而不要求他们在该
      中具有
      角色

    • 它可以确保
      用户
      只能担任适用于特定
      角色

    • 它可以允许在多个
      组中共享相同的
      角色

    • 它可以允许一个
      ,而不允许任何
      角色


    要缩小模式,您可以想出一些好办法:

    • 为此组中没有角色的
      创建角色
      ;要删除
      用户组的需要

    • 为每个组创建一个
      虚拟用户
      ,该用户拥有该组可以担任的所有角色;要删除
      组角色的需要

    • 等等等等

    这里的缺点是,您最终需要定制代码来处理更改或强制执行约束。您在文章末尾提出的模式可以使用外键约束和复合主键约束强制执行所有必需的约束。总体而言,将更加灵活地适应未来的变化



    我认为没有理由不使用您提出的模式,它对我来说似乎是完全正确、可维护、可理解和有弹性的。

    对于添加到组中的用户,一个附加列的微妙细节是,没有角色。这可能会引入一个空的需求或“成员”角色。@user2864740-我认为
    NoRole
    Member
    角色没有问题,您能详细说明一下为什么您认为这是一个问题,还是您只是指出了需求?@MatBailie不是说有问题,而是“可能的复杂性”-我已将其改为“细微细节”,以减少评论。。污名化?我很高兴听到这个。因为这是我第一个这样的项目。非常感谢