2013-08-22 3 views
0

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

Пользователю в моем приложении могут быть назначены разрешения. Они могут иметь разрешения на индивидуальном уровне или быть частью группы. Таким образом, у меня есть следующие таблицы (я думаю, что имена являются относительно понятны, но может добавить дополнительную информацию, если это необходимо):

  • пользователей
  • Права доступа
  • User_Permissions
  • группы
  • User_Groups
  • User_Group_Permissions

Проект таблица разрешений это:

  • ID INT (разрешение идентификатор, первичный ключ)
  • имя VARCHAR (255) (имя разрешения, такие как "Администрация")
  • описание VARCHAR (1000) (Краткое описание разрешения)
  • default_value TINYINT (значение по умолчанию для назначения пользователей (Да/нет/Никогда))

Однако, когда я проверить разрешение в коде, я не хотел используйте «Magic String», поэтому я создал перечисление для разрешения в моей таблице разрешений, а затем использовать его так:

public enum EPermission 
{ 
    ADMINISTRATION = 1, 
    LOGIN = 2 
} 

public bool HasPermission(EPermission permission) 
{ 
    int permission_id = (int)permission; 
    //look up the permission in the database based on permission_id 
} 

Идентификаторов в моей таблице разрешений соответствуют числовым значениям я присвоенные в моих перечислениях. Приложение не имеет возможности изменить их. Разрешения в таблице разрешений вставляются с этими идентификаторами как часть установки и не должны быть изменены.

Является ли такое соединение приемлемым? Я не ожидаю, что данные изменятся, но всегда возможно, что это возможно, и мне просто интересно, может ли быть лучший способ сделать что-то, прежде чем я углубись в это.

ответ

1

Да, это «приемлемо» и довольно распространенная практика.

EDIT: Если вы хотите свести к минимуму вероятность того, что ваша БД и перемычка перестанут синхронизироваться, вы можете отобразить перечисление, чтобы засеять таблицу данными во время развертывания.

+0

Интересно - не думал об идее отражения.Это будет только когда-либо развернуто один раз (или, по крайней мере, в одном месте), возможно, это слишком много для моей ситуации, но, тем не менее, спасибо. – Mansfield

1

Поскольку вы не изменяете разрешения, вы также можете уйти от таблицы разрешений и использовать только перечисление. Затем вы можете сохранить значение enum как int в таблицах User_Permissions и User_Group_Permissions.

При извлечении данных из базы данных вы можете десериализовать значение для перечисления. Это уменьшает вероятность того, что данные в вашей базе данных будут повреждены и больше не совпадут с вашим перечислением.

0

Я подозреваю, что это не поможет в долгосрочной перспективе. что если один пользователь может иметь одно или несколько разрешений. Затем вам нужно переключить флаг перечисления?

+0

Перечисление представляет только одно разрешение. У пользователя может быть столько или меньше, чем есть - меня беспокоит только связь между перечислением и таблицей разрешений. – Mansfield

Смежные вопросы