Страницы

Поиск по вопросам

воскресенье, 5 января 2020 г.

Как сделать правильную архитектуру БД при множественных связях в pivot-таблице?

#php #laravel #relation


В базе данных есть следующие таблицы:


users (id, name, surname)
teams (id, name)
roles (id, name)
permissions (id, name)
team_role_permission (team_id, role_id, permission_id)
team_user (user_id, team_id, role_id)


Не понимаю, как именно я должен описать отношения в таблице team_role_permission
и team_user. В обычных отношениях laravel нет возможности создать many-to-many отношение
с 3 полями. Если говорить про практику, то мне нужно иметь лишь 3 описанных отношения в БД:


В каких командах играет игрок и какова его роль в каждой из них (метод teams в модели
User/Player)
Какие игроки состоят в команде и каковы их роли (метод players в модели Team)


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


Ответы

Ответ 1



По идее это может выглядеть вот так. И никто не запрещает вам создать модель TeamUser, в которой вы укажете нужные связи. Ну или как вы делали, но опять же с созданием промежуточной таблицы со связями.

Ответ 2



Начнем по порядку: "В каких командах (team_id) играет игрок (user_id) и какова его роль(role_id) в каждой из них (метод teams в модели User/Player)" Для этого существует team_user (user_id, team_id, role_id). Понятней было бы в таком порядке team_id, user_id, role_id. "Какие игроки (user_id) состоят в команде (team_id) и каковы их роли (role_id) (метод players в модели Team)" Данный вопрос покрывает та же связь team_user (user_id, team_id, role_id). "Таблица team_role_permission нужна, поскольку в каждой команде (team_id) создатель (?) может кастомно выбирать роли (role_id) для каждой роли(role_id) пользователей (user_id)." Возможно имелось ввиду "выбирать роли (role_id) для каждого пользователя (user_id)", тогда team_role_permission не нужна. Точнее нужна только для связи команды с permission. Но, если все таки имелось ввиду то, что написано, тогда должна существовать связь "создатель", team_id, user_id, role_id, role_id. По сути это подмена роли другой ролью, что в общем не очень хорошо. Если у одного игрока может быть несколько ролей в одной команде тогда связь team_user следовало бы разбить на две: team_user (team_id, user_id) и team_user__role(team_user_id, role_id).

Комментариев нет:

Отправить комментарий