【问题标题】:Handling custom Roles based users in database处理数据库中基于自定义角色的用户
【发布时间】:2013-12-09 08:16:37
【问题描述】:

我正在开发一个我有 5-6 个角色的应用程序。是的,这是很常见的事情,但我面临一个问题。我正在处理自己的数据和表格。

我查看了其他帖子,但大多数都与会员资格有关。 好吧,为了解决这个问题,我创建了一个包含列的表

TblUsers

  1. 用户ID
  2. 姓名
  3. 电子邮件
  4. 角色-- 在本专栏中,我存储了 TeacherStudent 等角色

但现在我遇到了用户可以拥有的情况 多个角色。假设用户是老师和学生,还有更多。

所以,我的问题是我应该如何管理我的数据库,以便它可以有效地工作,并且应该反映一个合理的数据库处理,并且在将来它应该在获取角色和检查“角色”并允许权限。

我认为的一个解决方案是将角色保留在不同的表中

tblRoles

Role_Id      Role
1            Client
2            Teacher
3            Student
4            Superitendent
5            Principal

然后将角色保存在用户表中,如下所示

tblUsers

User_Id      Name    Email      Roles
1            Pin     hh           1
2            Sin     mm           1,2
3            ll      ii           3,2
4            uu      hv           3

User_Id      Name    Email      Roles
1            Pin     hh         Teacher
2            Sin     mm         Client, Teacher.

但是这样做会使编码变得复杂吗?

如果我使用上述技术,我将如何加入并获得角色 假设拥有 Id 2 的用户已登录并获得用户的角色,我必须这样做?

var Roles=get Roles from tblUsers where user_id= 2

然后

Roles.split(',');

然后检查计数并获得这样的角色

var User_Role = get Role from tblRoles where Role='Roles[0]' ;

如果我在 Roles Array 中有多个值,那么我必须一次又一次地调用 Database?

请帮助我解决这个问题。你的建议对我很有帮助。

【问题讨论】:

    标签: c# .net asp.net-mvc sql-server-2008 sql-server-2005


    【解决方案1】:

    您可以这样制作表格: tbl用户:

    User_Id      Name    Email
    1            Pin     hh
    2            Sin     mm
    3            ll      ii
    4            uu      hv
    

    tblRoles:

    Role_Id      Role
    1            Client
    2            Teacher
    3            Student
    4            Superitendent
    5            Principal
    

    tblUserRoles:

    User_Id      Role_Id
    1            1
    1            2
    1            5
    3            4
    3            2
    

    为了使用这个表,你可以简单地使用这样的 sql 查询:

    WITH Roles_CTE(User_Id, Role) AS(
    SELECT User_Id.tblUserRoles, Role.tblRoles FORM tblUserRoles INNER JOIN tblRoles
    ON tblUserRoles.Role_Id = tblRoles.Role_Id)
    
    SELECT User_Id.tblUsers, Name.tblUsers, Role.Roles_CTE FROM
    Roles_CTE INNER JOIN tblUsers ON tblUsers.User_Id = Roles_CTE.User_Id
    

    为了在 c# 中使用此查询,您应该使用 ADO.NET 组件。 对于像您这样的 sql-server 用户,有 System.Data.SqlClient 命名空间。

    【讨论】:

      【解决方案2】:

      教科书中的经典解决方案是制作三个表格:

      1. 具有至少一个 userid 列的用户表。
      2. 具有至少一个 roleid 列的角色表。
      3. 关系表通过至少一个 userid 列和一个 roleid 列链接用户表和角色表。

      对于用户拥有的每个角色,关系表中应该有一行,其中 userid 是用户的 id,roleid 是相应角色的 id。这种方案是最灵活和可扩展的,当你需要查询一些信息时,如果你能熟练使用SQL的“join table”技巧,永远不会复杂。

      【讨论】:

        【解决方案3】:

        使用列创建一个作为 UserRoleMapping 的表

        MappingID、User_Id、Role_Id

        根据分配给该表的角色数量,该表将针对一个用户包含多行。

        【讨论】:

          【解决方案4】:

          执行此操作的典型方法是使用包含角色的不同表。 比如.... err user_roles(user_id, roles) 其中 user_id 是外键。

          USER_ID    ROLES
          1          1
          1          2
          2          2
          

          因此该表与您的用户表是多对一的关系。

          【讨论】:

            【解决方案5】:

            删除Roles 列并添加UserRole 表。这是最好的方法。

            解决 m:n 关系的关键是将两个实体分开,并在它们之间用第三个相交实体创建两个一对多 (1:n) 关系。

            如果你使用实体框架,所有的查询都会很简单。 例如:

            db.Users.Find(2).Roles.ToList(); //Get all roles of User(2)
            db.Roles.Find(1).Users.ToList();//Get all Teacher
            

            【讨论】:

              猜你喜欢
              • 2018-07-27
              • 2023-03-09
              • 2014-10-22
              • 2014-05-13
              • 2011-08-25
              • 2019-09-10
              • 2022-10-05
              • 2018-06-28
              • 2020-10-24
              相关资源
              最近更新 更多