2013-12-09 74 views
0

我正在研究一个应用程序,其中我有5-6个角色。是的,这是一件很平常的事情,但我面临一个问题。我正在处理我自己的数据和表格。在数据库中处理基于用户角色的用户

我已查看其他帖子,但大多数都与会员相关。 好了,来处理这个我已经创建了拥有列

向tblUsers

  1. 用户ID
  2. 名称
  3. 电子邮件
  4. Roles--在本专栏中,我像存储角色表Teacher,Student

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

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

一个解决方案,我还以为是让角色在不同的表

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]' ; 

,如果我在角色数组不止一个值,那么我必须再次调用数据库然后再次?

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

回答

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

0

井教科书经典的解决方案是让三个表:

  1. 用户表与至少一个用户ID列。
  2. 包含至少一个角色ID列的角色表。
  3. 关系表将用户表和角色表链接到至少一个用户标识列和一个角色标识列。

对于用户拥有的每个角色,关系表中应该有一行,其中userid是用户的id,而roleid是相应角色的ID。这个解决方案非常灵活和可扩展,当你需要查询一些信息时,如果你能够熟练地使用SQL的“连接表”技巧,它永远不会变得复杂。

0

创建一个表与列

MappingID,USER_ID UserRoleMapping,ROLE_ID

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

0

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

USER_ID ROLES 
1   1 
1   2 
2   2 

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

0

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

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

enter image description here

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

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