Не думаю, что это отличный план. Предположим, вы вручную обновляете чьи-то роли и вводите название роли немного неправильно? Если у вас есть отдельная таблица, ограничение базы данных предупредит вас. Предположим, вы решили изменить название роли? Если бы у вас была отдельная таблица, вам нужно было бы изменить ее только в одном месте.
Нормализация базы данных выполнена по уважительным причинам; это не просто придирчиво. Вы не будете повторять код ключа в своей кодовой базе более чем в одном месте; денормализация базы данных эквивалентна.
ИЗМЕНЕНО ДЛЯ ДОБАВЛЕНИЯ:
Вы подчеркиваете, что приложение в конечном итоге будет принимать решения на основе значений, возвращаемых базой данных; например предоставление определенных опций, если у пользователя есть роль «Администратор». Это верно, и это другое, отдельное место, где последовательность, например, имен ролей может нарушаться. Я не думаю, что денормализация базы данных делает это менее вероятным.
Один хороший подход, чтобы помочь с этим (и хороший способ реализовать авторизацию в целом) - это иметь единое место в коде, где роль преобразуется в определенные общие возможности (например, администраторы могут читать и писать все сущности, гости могут читать определенные объекты и ничего не может написать и т. д.). Затем во многих местах, где вам нужно установить доступ, вы проверяете возможность, а не роль.
То есть, в представлении, если вы решаете, показывать ли кнопку «изменить» в описании элемента, вы не проверяете, делая if role=='ADMIN' or role=='EDITOR'
, вы проверяете, делая if user.can_edit(item)
, В другом месте вы установили, что администраторы и редакторы получают возможность редактировать элементы. См., Например, подход, который использует система авторизации Rails CanCan .
При использовании этого подхода есть только одно место, где вы ссылаетесь на названия ролей (например, в CanCan у вас есть класс, называемый «способностями», который определяет все правила для того, кто что может делать, исходя из их ролей. Везде иначе вы указываете, какие способности пользователь должен определить, что он может делать или видеть.