Хорошее ли решение разделение таблиц юзер и роли?

Ссылка скопирована
2 ответов

подскажите, делаю сайт (Spring), у сайта есть система ролей, юзеры и роли хранятся в бд(PostgreSQL), я разделил таблицы, юзеры в одной таблице, роли в другой, роли прикрепляются к юзерам при помощью их id которые хранятся в отдельной колонке в таблице "РОЛИ".
Подскажите, удачное такое решение или нет ? или лучше все сделать в одной таблице ? или же каким то другим способом ?

Дополнительно:

Вы выделили в системе два класса сущностей. Одна - Пользователь, вторая - Роль.
Под каждый класс нужна отдельная таблица.
Как определить какие взаимоотношения между этими классами?
Нужно примерить следующие коммутативные гипотезы:
Первая пара гипотез:
"Один пользователь должен (может) иметь только одну роль."
"Одна роль должна (может) быть назначена многим пользователям."
Вторая пара гипотез:
"Один пользователь должен (может) иметь несколько ролей."
"Одна роль должна (может) быть назначена многим пользователям."
Если в вашей архитектуре системы справедлива первая пара гипотез, то вы строите взаимоотношение между классами Роль и Пользователь как "один ко многим". Это значит, что у таблицы Пользователь будет внешний ключ в виде идентификатора роли, тем самым вы каждому пользователю сможете назначить только одну роль. Но сами роли могут повторятся у разных пользователей.
Если в вашей архитектуре системы справедлива вторая пара гипотез, то вы строите взаимоотношение между классами Роль и Пользователь как "многим ко многим". Для этого нужно создать промежуточную таблицу, например Пользователь_и_роль, в которой будут два внешних ключа - идентификатор пользователя и идентификатор роли пользователя (можно, но технически нужно еще создать еще идентификатор первичного ключа, чтобы можно было корректно обращаться к записям этой таблицы, не путая их). В этом случае каждому пользователю можно выделить целый набор ролей, не ограничиваясь одной ролью.

Ответы:

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

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Кирилл JS Ответ

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

Разделяя таблицы пользователей и ролей, мы можем управлять правами доступа к данным и функциям приложения более гибко. Например, мы можем создать различные роли (администратор, пользователь, модератор и т.д.) и назначать им определенные права доступа к определенным разделам приложения. Это позволяет обеспечить безопасность приложения и предотвратить несанкционированный доступ к данным.

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

Пример структуры базы данных для разделения таблиц пользователей и ролей на языке PHP:

CREATE TABLE users (
    id INT PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
 
CREATE TABLE roles (
    id INT PRIMARY KEY,
    name VARCHAR(50) UNIQUE NOT NULL
);
 
CREATE TABLE user_roles (
    user_id INT,
    role_id INT,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (role_id) REFERENCES roles(id),
    PRIMARY KEY (user_id, role_id)
);

CREATE TABLE users ( id INT PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, password VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE roles ( id INT PRIMARY KEY, name VARCHAR(50) UNIQUE NOT NULL ); CREATE TABLE user_roles ( user_id INT, role_id INT, FOREIGN KEY (user_id) REFERENCES users(id), FOREIGN KEY (role_id) REFERENCES roles(id), PRIMARY KEY (user_id, role_id) );

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

Другие ответы (1) Ответить на вопрос
Юрий Linux

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

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

Пример структуры таблиц для пользователей и ролей в базе данных MySQL:

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    password VARCHAR(255) NOT NULL
);
 
CREATE TABLE roles (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL
);

CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL, password VARCHAR(255) NOT NULL ); CREATE TABLE roles ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL );

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

CREATE TABLE user_roles (
    user_id INT,
    role_id INT,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (role_id) REFERENCES roles(id),
    PRIMARY KEY (user_id, role_id)
);

CREATE TABLE user_roles ( user_id INT, role_id INT, FOREIGN KEY (user_id) REFERENCES users(id), FOREIGN KEY (role_id) REFERENCES roles(id), PRIMARY KEY (user_id, role_id) );

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

Таким образом, разделение таблиц пользователей и их ролей - хорошее практическое решение, которое помогает нам создать более удобную и безопасную систему управления доступом.

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно