Как организовать структуру базы данных для нескольких типов пользователей?

Я разрабатываю базу данных, в которой будут храниться пользователи разных типов. В настоящее время существует всего два типа пользователей, клиенты и агенты. В дальнейшем, возможно, будет добавлен тип “организация”, которая будет создавать и управлять агентами. Так же в системы присутствуют администраторы, реализованные через роли.
Идея состоит в том, чтобы иметь users таблицу, отвечающую в значительной степени исключительно за вход на сайт ( email и password, token и другие технические поля), и дополнительные таблицы для каждого из соответствующих типов пользователей, которые имеют свой собственный уникальный набор столбцов. Например, у агентов в дальнейшем появятся поля специальность, опыт, дипломы и тд. У клиентов в данный момент нет уникальный полей, но об этом дальше. Однако, поскольку я раньше не управлял базой данных такой сложности, мне интересно, как организовать пару аспектов:

  1. Во-первых, пользователями могут быть любой из вышеперечисленных типов. Например, если пользователь авторизован как агент, он все равно должен иметь возможность оформить заказ.
  2. Во-вторых, необходимо предусмотреть возможность создания клиентов или агентов без создания учетной записи пользователя. Например, если клиент связался с компанией по телефону или отправил электронное письмо, не зарегистрировавшись на сайте. Также возможно добавление типа "организация", где администратор организации сможет создавать агентов с возможностью или без возможности входа в систему (сохранение записи в таблице agent, без записи в user).
  3. В-третьих, прошу обратить внимание на таблицу “appointment”. В таблице содержаться FK для клиентов и агентов, а не user.


Основные проблемы, которые у меня возникают
  1. Дублирование основных данных ( first_name, last_name ) у клиента и агента, так как эти данные хранятся в user, а мне нужно иметь возможность создавать клиента и агнета без user
  2. Сомнения в надобности таблицы “клиент”, так как в данный момент в ней нет дополнительных полей и это усложняет систему.


Вот что получилось на данный момент
643e7dee9da91882195234.png
  • Вопрос задан
  • 854 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Jack444
Таблицы client/agent/user_data можно в одну таблицу user упаковать, + добавить поля is_client bool и is_agent bool, но так как вы уже сделали связь к role то перекидывайте туда роли client и agent, если возможно использование нескольких ролей для пользователя то используйте не name varchar a names varchar[] чтобы поле было массивом.
Ещё обычно создаётся таблица permissiion которая привязывается к ролям и юзерам + дополнительно хранит поля table_name и action, либо вместо таблицы типом JSONB добавить ячейку в роли и юзеры.
Вообще postgre изначально умеет работать с пользователями и можно использовать такие фичи как CREATE USER и ALTER ROLE но такой вариант может оказаться костыльным и логику с правами лучше перекинуть на уровень приложения.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы