我正在开发一个我有5-6个角色的应用程序。是的,这是常见的事情,但我面临着一个问题。我正在处理我自己的数据和表格。
我已查看过其他帖子,但其中大多数与会员资格有关。 好吧,为了解决这个问题,我创建了一个包含列
的表向tblUsers
Teacher
,Student
等角色但现在我遇到了用户可以拥有的情况 多个角色。假设用户是教师和学生,还有其他人。
所以,我的问题是我应该如何管理我的数据库,以便它应该有效地工作,合理的数据库处理应该反映出来,并且在将来它也应该在获取角色和检查“角色”并允许权限。
我认为一个解决方案是将角色保存在不同的表格中
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数组中有多个值,那么我必须一次又一次地调用数据库吗?
请帮我解决这个问题。你的建议对我很有帮助。
答案 0 :(得分:0)
教科书中的经典解决方案是制作三个表:
对于用户拥有的每个角色,关系表中应该有一行,其中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)关系。
如果使用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
命名空间。