Skip to content
n0pashkov edited this page Mar 2, 2025 · 1 revision

Модели данных

В этом разделе описаны основные модели данных, используемые в системе заявок на ремонт техники.

Пользователь (User)

Модель пользователя представляет собой учетную запись в системе.

Атрибуты

Поле Тип Описание
id Integer Уникальный идентификатор пользователя
username String Имя пользователя для входа в систему
email String Электронная почта пользователя
full_name String Полное имя пользователя
hashed_password String Хэшированный пароль пользователя
is_active Boolean Флаг активности пользователя
role String Роль пользователя (user, agent, admin)

Связи

  • tickets - заявки, созданные пользователем (отношение один-ко-многим)
  • assigned_tickets - заявки, назначенные пользователю (отношение один-ко-многим)
  • comments - комментарии, оставленные пользователем (отношение один-ко-многим)

SQL-представление

CREATE TABLE users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username VARCHAR(255) NOT NULL UNIQUE,
    email VARCHAR(255) NOT NULL UNIQUE,
    full_name VARCHAR(255),
    hashed_password VARCHAR(255) NOT NULL,
    is_active BOOLEAN NOT NULL DEFAULT TRUE,
    role VARCHAR(50) NOT NULL DEFAULT 'user'
);

Заявка (Ticket)

Модель заявки представляет собой запрос на ремонт технического оборудования.

Атрибуты

Поле Тип Описание
id Integer Уникальный идентификатор заявки
title String Заголовок заявки
description String Описание проблемы
status String Статус заявки (new, assigned, in_progress, need_info, completed, rejected)
priority String Приоритет заявки (low, medium, high, critical)
category String Категория оборудования
equipment_id Integer Идентификатор оборудования (опционально)
resolution String Решение проблемы (заполняется при завершении)
created_at DateTime Дата и время создания заявки
updated_at DateTime Дата и время последнего обновления заявки
user_id Integer Идентификатор пользователя, создавшего заявку
assigned_to_id Integer Идентификатор пользователя, которому назначена заявка (опционально)

Связи

  • user - пользователь, создавший заявку (отношение многие-к-одному)
  • assigned_to - пользователь, которому назначена заявка (отношение многие-к-одному)
  • comments - комментарии к заявке (отношение один-ко-многим)

SQL-представление

CREATE TABLE tickets (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    title VARCHAR(255) NOT NULL,
    description TEXT NOT NULL,
    status VARCHAR(50) NOT NULL DEFAULT 'new',
    priority VARCHAR(50) NOT NULL DEFAULT 'medium',
    category VARCHAR(100),
    equipment_id INTEGER,
    resolution TEXT,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    user_id INTEGER NOT NULL,
    assigned_to_id INTEGER,
    FOREIGN KEY (user_id) REFERENCES users (id),
    FOREIGN KEY (assigned_to_id) REFERENCES users (id)
);

Комментарий (Comment)

Модель комментария представляет собой сообщение, оставленное к заявке.

Атрибуты

Поле Тип Описание
id Integer Уникальный идентификатор комментария
text String Текст комментария
created_at DateTime Дата и время создания комментария
ticket_id Integer Идентификатор заявки, к которой относится комментарий
author_id Integer Идентификатор пользователя, оставившего комментарий

Связи

  • ticket - заявка, к которой относится комментарий (отношение многие-к-одному)
  • author - пользователь, оставивший комментарий (отношение многие-к-одному)

SQL-представление

CREATE TABLE comments (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    text TEXT NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    ticket_id INTEGER NOT NULL,
    author_id INTEGER NOT NULL,
    FOREIGN KEY (ticket_id) REFERENCES tickets (id),
    FOREIGN KEY (author_id) REFERENCES users (id)
);

Диаграмма связей

+----------------+       +----------------+       +----------------+
|      User      |       |     Ticket     |       |    Comment     |
+----------------+       +----------------+       +----------------+
| id             |<----->| user_id        |       | id             |
| username       |       | assigned_to_id |<----->| text           |
| email          |       | title          |       | created_at     |
| full_name      |       | description    |<----->| ticket_id      |
| hashed_password|       | status         |       | author_id      |
| is_active      |       | priority       |       +----------------+
| role           |       | category       |
+----------------+       | equipment_id   |
                         | resolution     |
                         | created_at     |
                         | updated_at     |
                         +----------------+

Схемы Pydantic

Для валидации данных и сериализации/десериализации используются следующие схемы Pydantic:

Пользователи

  • UserBase - базовая схема с общими полями
  • UserCreate - схема для создания пользователя (включает пароль)
  • UserUpdate - схема для обновления пользователя (все поля опциональны)
  • UserResponse - схема для ответа API (без хэшированного пароля)

Заявки

  • TicketBase - базовая схема с общими полями
  • TicketCreate - схема для создания заявки
  • TicketUpdate - схема для обновления заявки (все поля опциональны)
  • TicketResponse - схема для ответа API (включает дополнительные поля)

Комментарии

  • CommentBase - базовая схема с общими полями
  • CommentCreate - схема для создания комментария
  • CommentResponse - схема для ответа API (включает дополнительные поля)

Индексы и оптимизация

Для оптимизации запросов в базе данных созданы следующие индексы:

-- Индекс для поиска заявок по статусу
CREATE INDEX idx_tickets_status ON tickets (status);

-- Индекс для поиска заявок по пользователю
CREATE INDEX idx_tickets_user_id ON tickets (user_id);

-- Индекс для поиска заявок, назначенных агенту
CREATE INDEX idx_tickets_assigned_to_id ON tickets (assigned_to_id);

-- Индекс для поиска комментариев по заявке
CREATE INDEX idx_comments_ticket_id ON comments (ticket_id);