在数据库中处理基于角色的自定义用户

时间:2013-12-09 08:16:38

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

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

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

的表

向tblUsers

  1. 用户ID
  2. 名称
  3. 电子邮件
  4. 角色 - 在此专栏中,我将存储TeacherStudent等角色
  5. 但现在我遇到了用户可以拥有的情况 多个角色。假设用户是教师和学生,还有其他人。

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

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

    tblRoles

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

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

    向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数组中有多个值,那么我必须一次又一次地调用数据库吗?

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

5 个答案:

答案 0 :(得分:0)

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

  1. 至少包含一个用户标识列的用户表。
  2. 包含至少一个roleid列的角色表。
  3. 关系表将用户表和角色表与至少一个用户标识列和一个角色列链接起来。
  4. 对于用户拥有的每个角色,关系表中应该有一行,其中userid是用户的id,而roleid是对应角色的id。这个解决方案是最灵活和可扩展的,当你需要查询一些信息时,如果你可以熟练地使用SQL的“连接表”技巧,它将永远不会复杂。

答案 1 :(得分:0)

使用列

创建一个UserRoleMapping表

MappingID,User_Id,Role_Id

根据分配给它的角色数量,该表将对用户有多行。

答案 2 :(得分:0)

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

USER_ID    ROLES
1          1
1          2
2          2

这样该表与您的用户表有多对一的关系。

答案 3 :(得分:0)

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

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

enter image description here

如果使用Entity Framework,则所有查询都很简单。 例如:

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

答案 4 :(得分:0)

您可以像这样制作表格: 向tblUsers:

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命名空间。