"Оптимальность" - дело растяжимое и зависит от поставленной задачи, если Вам подходит вариант из 3х таблиц ("users", "roles" и "user_role"), то почему нет?
Если, например, у Вас есть очень много разных настроек пользователя, возможно, следует вынести их в отдельную таблицу, иначе нужно ответить на вопрос "А зачем"?