2013-12-09 4 views
0

Я работаю над приложением, в котором у меня 5-6 ролей. Да, это обычная вещь, но я столкнулся с проблемой. Я обрабатываю данные и свои таблицы.Обработка пользовательских Ролей на основе пользователей в базе данных

Я проверил другие сообщения, но большинство из них связано с Членством. Ну, справиться с этим я создал таблицу, которая содержит столбцы

TblUsers

  1. USERID
  2. Имя
  3. Email
  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-сервера, как вы, есть пространство имен System.Data.SqlClient.

0

Ну классическое решение в тексте книги, чтобы сделать три таблицы:

  1. таблицы пользователя, по крайней мере один столбец идентификаторов пользователей.
  2. Таблица ролей с по меньшей мере одним столбцом ропота.
  3. Таблица отношений связывает таблицу пользователя и таблицу ролей с по меньшей мере одним столбцом пользователя и одним столбцом роутера.

Для каждой роли, которую пользователь имеет, должна быть строка в таблице отношений, в которой идентификатор пользователя и идентификатор пользователя является идентификатором соответствующей роли. Это решение является наиболее гибким и расширяемым, и когда вам нужно запросить некоторую информацию, если вы умеете эффективно использовать трюк «join table» SQL, это никогда не будет сложным.

0

Создать таблицу UserRoleMapping с колоннами

MappingID, user_id, ROLE_ID

таблица будет иметь несколько строк против пользователя в соответствии с количеством ролей назначить к нему.

0

типичный способ сделать это с другой таблицей, содержащей роли. нравится .... err user_roles (user_id, role), где user_id - это внешний ключ.

USER_ID ROLES 
1   1 
1   2 
2   2 

, так что эта таблица имеет много отношения к вашей таблице пользователей.

0

Удалить Roles column и добавить 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 
Смежные вопросы