Обработка логики, когда в spring имеется много различных объектов?

Вопрос или проблема

Пожалуйста, помогите мне ответить на этот вопрос. Раньше, когда у меня были только пользователи и администраторы, я создал таблицу пользователей, содержащую реальные данные, такие как имя пользователя, пароль, одноразовый пароль (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.

Подход к проектированию базы данных

  1. Создание таблицы 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
    );
  2. Создание специализированных таблиц:
    Для каждого типа пользователя создайте отдельную таблицу, например:

    • 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)
    );
  3. Избегайте повторяемости данных:
    Не добавляйте все возможные поля в одну таблицу, чтобы избежать ситуации, когда одни поля будут использоваться лишь некоторыми типами пользователей. Этот подход не только упрощает структуру базы данных, но и улучшает производительность.

Логика аутентификации

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

  1. Сервис аутентификации:
    Создайте сервис, который будет обрабатывать логику аутентификации. Он будет использовать общую таблицу users для проверки учетных данных.

  2. Обработка входа:
    При входе пользователю необходимо предоставить только учетные данные (username, password). Сервис аутентификации проверит эти данные и, если они верны, извлечет соответствующую информацию о пользователе из таблицы users.

  3. Идентификация типа пользователя:
    После успешной аутентификации можно использовать поле 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;
       // и так далее для других ролей
    }
  4. Использование наследования:
    Определите базовый класс User и специализированные классы, такие как Patient, Doctor и т.д., которые будут наследоваться от него. Это позволит централизовать общую логику для всех типов пользователей, а специализированные классы могут расширять или переопределять отдельные методы.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...