Вопрос или проблема
Пожалуйста, помогите мне ответить на этот вопрос. Раньше, когда у меня были только пользователи и администраторы, я создал таблицу пользователей, содержащую реальные данные, такие как имя пользователя, пароль, одноразовый пароль (otp), роль и т.д., и таблицу токенов для хранения информации о сеансе входа пользователя. Когда пользователь входит в систему, я вызываю userRepo findByEmail для проверки. Однако сейчас в моей системе есть объекты, такие как пациенты (пользователи), врачи, лабораторный персонал, администраторы и кассиры, каждый из которых содержит отдельную информацию. Так как мне создать таблицу для хранения как информацией для аутентификации, так и личной информацией объектов? Я все еще не разбираюсь, как, например, когда врач входит в систему, система проверяет учетную запись и пароль, а затем как узнать, кто входит в систему и вызвать соответствующий репозиторий для проверки информации этого объекта. Пожалуйста, помогите мне, я работаю над проектом, используя Spring Boot. Большое спасибо.
Это было бы плохим дизайном добавлять все ваши дополнительные атрибуты в таблицу пользователей для всех типов пользователей, потому что тогда в этой таблице будут некоторые поля, которые не нужны большинству пользователей. У пациента могут быть атрибуты, такие как последнее обследование, которые не имеют смысла для врачей и тому подобное.
Более разумно было бы иметь поле user_type в вашей таблице и отдельные таблицы для каждого из ваших типов пользователей, так что ваши специфические данные пользователя можно было бы вывести по user_type.
Однако это также проблематично, потому что люди могут иметь несколько типов пользователей. Например, врач может заболеть, в этом случае данный врач становится пациентом, оставаясь при этом врачом. Поэтому имеет больший смысл иметь отдельную таблицу для каждого специфического типа пользователя, так что, кроме вашей таблицы users
, у вас будут
patients
doctors
lab_staff
receptionists
cashiers
admins
и каждая из этих таблиц будет содержать дополнительную информацию, которая вам нужна, включая поле user_id
, которое будет являться foreign key
, ссылающимся на соответствующую запись в users
.
Затем вы можете реализовать класс для QualifiedUser
, который будет расширять класс, который у вас есть для пользователя, и будет иметь поле для соответствующего пользователя.
И затем вы можете создать классы, такие как Patient
, Doctor
, LabStaff
, Receptionist
, Cashier
, Admin
, все из которых будут extend
QualifiedUser
, переопределяя базовую таблицу с помощью специальной таблицы пользователя, и вы также можете иметь поле List<QualifiedUser>
внутри вашего User
class
, которое, если будет инициализировано, будет содержать все объекты квалифицированного пользователя, относящиеся к данному пользователю.
Таким образом, все методы объекта пользователя будут наследоваться конкретными расширениями квалифицированного пользователя, где вы также сможете переопределить некоторые из методов, если их нужно выполнять иначе для данного подкласса, а также создать дополнительные поля и методы.
Ответ или решение
Ваша задача по проектированию базы данных для системы с множеством различных объектов пользователей, таких как пациенты, врачи, лабораторный персонал, администраторы и т.д., требует внимательного подхода. Ниже представлены рекомендации и схема, как можно организовать таблицы и логику аутентификации в вашем проекте на Spring Boot.
Подход к проектированию базы данных
-
Создание таблицы
users
:
Основная таблицаusers
будет содержать общую информацию для всех типов пользователей. Включите такие поля, как:user_id
(первичный ключ)username
password
email
role
(например, пациент, врач, администратор и т.д.)created_at
updated_at
Пример структуры таблицы:
CREATE TABLE users ( user_id SERIAL PRIMARY KEY, username VARCHAR(50) NOT NULL, password VARCHAR(255) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE, role VARCHAR(20) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
-
Создание специализированных таблиц:
Для каждого типа пользователя создайте отдельную таблицу, например:patients
doctors
lab_staff
receptionists
cashiers
admins
Каждая из этих таблиц будет содержать специфические атрибуты для своего типа пользователя и ссылаться на
users
через внешний ключuser_id
.Пример структуры таблицы для врачей:
CREATE TABLE doctors ( doctor_id SERIAL PRIMARY KEY, user_id INT NOT NULL, specialty VARCHAR(50), experience INT, FOREIGN KEY (user_id) REFERENCES users(user_id) );
-
Избегайте повторяемости данных:
Не добавляйте все возможные поля в одну таблицу, чтобы избежать ситуации, когда одни поля будут использоваться лишь некоторыми типами пользователей. Этот подход не только упрощает структуру базы данных, но и улучшает производительность.
Логика аутентификации
Для обработки различных объектов при аутентификации сущностей вашей системы можно использовать следующие подходы:
-
Сервис аутентификации:
Создайте сервис, который будет обрабатывать логику аутентификации. Он будет использовать общую таблицуusers
для проверки учетных данных. -
Обработка входа:
При входе пользователю необходимо предоставить только учетные данные (username
,password
). Сервис аутентификации проверит эти данные и, если они верны, извлечет соответствующую информацию о пользователе из таблицыusers
. -
Идентификация типа пользователя:
После успешной аутентификации можно использовать полеrole
для определения типа пользователя. В зависимости от роли можно будет делать выборку данных из специализированной таблицы. Например:String role = user.getRole(); switch (role) { case "DOCTOR": Doctor doctor = doctorRepository.findByUserId(user.getUserId()); // логика для врача break; case "PATIENT": Patient patient = patientRepository.findByUserId(user.getUserId()); // логика для пациента break; // и так далее для других ролей }
-
Использование наследования:
Определите базовый классUser
и специализированные классы, такие какPatient
,Doctor
и т.д., которые будут наследоваться от него. Это позволит централизовать общую логику для всех типов пользователей, а специализированные классы могут расширять или переопределять отдельные методы.
Заключение
Следуя этим рекомендациям, вы сможете создать чистую, масштабируемую структуру базы данных, которая будет легко поддерживать и развивать. Главная идея состоит в том, чтобы разделить общие и специфические данные и обеспечить хорошую организацию кода, что позволит легко обрабатывать логику аутентификации для различных типов пользователей в вашем приложении на Spring Boot.