1. Отвязываемся от пользователя, оставляем там только поле type и варианты значений Admin, User
2. Под каждый тип пользователей создаем таблицу: partners, clients, operators
3. Определять является ли пользователь партнером, клиентом или оператором нужно по наличию записи в этих таблицах
4. Определять тип партнера можно добавив поле specialization_id в partners
5. Определять набор предоставляемых услуг партнером, можно добавив таблицу services и связав ее со specializations
Структура БД:
users - пользователи
- id
- type [admin, support, user]
clients - клиенты
- id
- user_id
- title
operators - операторы
- id
- user_id
- title
partners - партнеры
- id
- user_id
- specialization_id - специализация партнера
specializations - специализации (врач, медсестра, массажист)
- id
- title
services - предоставляемые услуги (массаж, обследование...)
- id
- title
specialization_services - связь между специализациями и услугами
- id
- specialization_id
- service_id
Итого:
- не нужно усложнять сущность пользователя
- пользователь может быть партнером, клиентом, оператором и т.п.
- признак партнерства, клиенства и т.п. определяется наличием записи в соответствующей таблице
- в партнерстве помимо названия, хранится его специализация (врач, медсестра и т.п.)
- услуги отображаются в зависимости от специализации, используя связь между таблицой специализаций и услуг
- если подобная структура данных слишком гибкая, ее можно ограничить программно
- проверку прав делать в зависимости от контекста
- например если это кабинет партнера, то смотреть, есть ли запись в таблице партнерства
- решение может показаться усложненным, но на самом деле дает гибкость и более простое понимание бизнес логики в дальнейшем