Dev.to · 2 min read

Как устроена информационная система: проектируем простую систему учета заявок

Как устроена информационная система: проектируем простую систему учета заявок

Когда слышишь термин «информационная система», первое время он кажется слишком общим. Под него можно подвести почти что угодно: интернет-магазин, банковское приложение, электронный дневник, систему учета сотрудников или даже небольшой сервис для регистрации обращений пользователей. Но почти у всех таких систем есть общая задача: получить данные, сохранить их, обработать и предоставить пользователю в удобном виде. В этой статье я разберу устройство информационной системы на простом примере — системе учета заявок. Такая система может использоваться внутри компании: сотрудник сообщает о проблеме, заявка сохраняется, специалист берет ее в работу, а затем меняет статус после решения. Цель статьи — не создать полноценный промышленный продукт, а показать основные компоненты информационной системы и то, как они взаимодействуют друг с другом. Постановка задачи Представим небольшую организацию, в которой сотрудники периодически обращаются в техническую поддержку. Например: не работает принтер; отсутствует доступ к корпоративной системе; необходимо установить программу; возникла проблема с компьютером; требуется создать новую учетную запись. Если подобных обращений немного, их можно принимать через мессенджер или записывать в обычную таблицу. Однако со временем возникают проблемы. Непонятно, какие заявки уже выполнены, какие еще находятся в работе, кто отвечает за конкретное обращение и когда оно было создано. Поэтому имеет смысл создать отдельную информационную систему. Пусть она умеет: создавать заявку; хранить информацию о пользователе; показывать список заявок; изменять статус заявки; назначать ответственного сотрудника; хранить дату создания заявки. Получается уже вполне реальная прикладная задача. Из чего будет состоять система Упрощенно систему можно разделить на три основных уровня: Интерфейс пользователя → серверная часть → база данных Пользователь работает с интерфейсом. Например, заполняет форму создания заявки. Интерфейс отправляет данные на сервер. Сервер проверяет их и записывает в базу данных. Когда необходимо показать список заявок, происходит обратный процесс: сервер получает информацию из базы данных и передает ее интерфейсу. Такое разделение используется во множестве современных приложений. Проектирование базы данных Начать удобно со структуры данных. Для небольшой системы нам понадобятся как минимум две сущности: пользователи; заявки. Таблица пользователей может выглядеть следующим образом: users id name email role Здесь id — уникальный идентификатор пользователя. Поле role определяет роль. Например: user support admin Теперь создадим таблицу заявок: tickets id title description status created_at author_id executor_id Поле author_id будет содержать идентификатор пользователя, создавшего заявку. executor_id — идентификатор сотрудника, который занимается ее выполнением. Таким образом, между таблицами возникает связь. Один пользователь может создать несколько заявок. В терминах баз данных это называется отношением один ко многим. Условно схема выглядит так: users +----------+ | id | | name | | email | | role | +----------+ | | v tickets +-------------+ | id | | title | | description | | status | | created_at | | author_id | | executor_id | +-------------+ Даже на этом этапе становится видно, зачем информационной системе нужна структурированная база данных. Если хранить всю информацию в одной большой таблице, данные пользователей придется постоянно дублировать. Например, имя и электронная почта автора будут повторяться в каждой его заявке. Это усложняет изменение данных и увеличивает вероятность ошибок. SQL и создание таблиц Для хранения информации можно использовать PostgreSQL. Таблица пользователей может быть создана следующим SQL-запросом: CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(150) UNIQUE NOT NULL, role VARCHAR(30) NOT NULL ); Таблица заявок: CREATE TABLE tickets ( id SERIAL PRIMARY KEY, title VARCHAR(200) NOT NULL, description TEXT, status VARCHAR(30) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, author_id INTEGER NOT NULL, executor_id INTEGER, FOREIGN KEY (author_id) REFERENCES users(id), FOREIGN KEY (executor_id) REFERENCES users(id) ); После этого база данных уже может хранить основные сущности системы. Добавим пользователя: INSERT INTO users (name, email, role) VALUES ( 'Иван Петров', 'ivan@example.com', 'user' ); Теперь можно создать заявку: INSERT INTO tickets ( title, description, status, author_id ) VALUES ( 'Не работает принтер', 'Принтер в кабинете 203 не печатает документы', 'new', 1 ); Получить все заявки можно обычным запросом: SELECT * FROM tickets; Но пользователю системы работать напрямую с SQL, конечно, не нужно. Для этого существует серверная часть приложения. Зачем нужен backend Backend — это часть системы, которая находится между пользовательским интерфейсом и базой данных. Именно сервер решает, что разрешено делать пользователю. Например, если приложение получает команду: Создать заявку сервер должен: проверить, авторизован ли пользователь; проверить корректность данных; сохранить заявку; вернуть результат. Если пользователь пытается изменить чужую заявку или назначить себя администратором, backend должен отклонить запрос. Поэтому нельзя строить приложение так, чтобы пользовательский интерфейс напрямую работал с базой данных. Сервер выступает контролируемой точкой доступа к информации. API Связь между интерфейсом и сервером часто строится через API. Например, для нашей системы можно определить следующие HTTP-запросы: GET /tickets Получить список заявок. GET /tickets/15 Получить заявку с идентификатором 15. POST /tickets Создать новую заявку. PATCH /tickets/15 Изменить заявку. Например, при создании обращения интерфейс может отправить серверу JSON: { "title": "Не работает принтер", "description": "Принтер не печатает документы" } Сервер обработает запрос и может вернуть: { "id": 42, "title": "Не работает принтер", "status": "new", "created_at": "2026-08-13T10:30:00" } Интерфейсу при этом совершенно не обязательно знать, какой SQL-запрос выполнялся внутри системы. Это одно из преимуществ разделения приложения на уровни. Статусы заявок Практически в любой системе учета появляется понятие состояния объекта. Для заявки можно использовать статусы: new in_progress resolved closed Но просто разрешить менять статус на любой другой — не всегда хорошая идея. Например, логично определить последовательность: new | v in_progress | v resolved | v closed Это уже пример бизнес-логики. Бизнес-логика — правила, определяющие поведение информационной системы. Например: новую заявку может создать любой сотрудник; назначить исполнителя может только сотрудник поддержки; закрыть заявку можно только после выполнения; обычный пользователь не может удалить чужое обращение. Именно такие правила превращают обычную базу данных в полноценную информационную систему. Авторизация пользователей Следующая проблема — как сервер понимает, какой пользователь выполняет запрос. Обычно используется механизм авторизации. Пользователь вводит логин и пароль. После успешной проверки сервер выдает ему токен или создает сессию. При дальнейших запросах приложение сообщает серверу, от имени какого пользователя выполняется операция. Например: POST /tickets Authorization: Bearer Сервер получает идентификатор пользователя из токена и автоматически указывает его как автора новой заявки. В реальном приложении пароль нельзя хранить в базе данных в открытом виде. Вместо этого хранится его криптографический хеш. Это важный пример того, как требования к информационной системе выходят далеко за пределы обычного хранения данных. Необходимо учитывать безопасность. Интерфейс системы Для простого варианта достаточно нескольких страниц. Страница входа Поля: Email Пароль Список заявок Можно представить его в виде таблицы: ID Название Статус Автор Исполнитель 1 Не работает принтер new Иван — 2 Установить программу in_progress Анна Сергей 3 Нет доступа к системе resolved Максим Сергей Создание заявки Пользователь вводит: название; описание проблемы. Остальные данные система формирует автоматически. Например, дату создания не нужно вводить вручную. Страница заявки На ней можно показать полную информацию: Заявка №15 Название: Нет доступа к корпоративной системе Описание: После смены пароля система сообщает об ошибке. Автор: Иван Петров Исполнитель: Сергей Иванов Статус: В работе Создана: 13.08.2026 Такой интерфейс уже позволяет использовать систему в реальной работе. Что происходит при создании заявки Теперь рассмотрим полный процесс. Пользователь нажимает кнопку «Создать заявку». Шаг 1. Интерфейс Пользователь вводит: Название: Нет доступа к системе Описание: После ввода пароля появляется ошибка Шаг 2. Запрос к серверу Frontend отправляет: POST /tickets с данными: { "title": "Нет доступа к системе", "description": "После ввода пароля появляется ошибка" } Шаг 3. Проверка Backend проверяет: существует ли пользователь; заполнено ли название; не превышена ли допустимая длина данных. Шаг 4. Запись в базу Сервер выполняет примерно такой SQL-запрос: INSERT INTO tickets ( title, description, status, author_id ) VALUES ( 'Нет доступа к системе', 'После ввода пароля появляется ошибка', 'new', 7 ); Шаг 5. Ответ Сервер сообщает интерфейсу, что заявка создана. Пользователь видит: Заявка №43 успешно создана. На первый взгляд действие выглядит очень простым. Но внутри него взаимодействует сразу несколько частей информационной системы. Что произойдет при росте нагрузки Для учебного проекта можно запустить backend и базу данных даже на одном компьютере. Но представим, что системой пользуются уже не 20 сотрудников, а 100 000 человек. Тогда начинают появляться новые задачи. Например: сервер получает слишком много запросов; база данных начинает отвечать медленнее; необходимо хранить резервные копии; требуется журналирование действий; появляются требования к отказоустойчивости. Архитектура становится сложнее. Может появиться несколько серверов: Пользователи | v Балансировщик / \ v v Backend 1 Backend 2 \ / \ / v v Database Балансировщик распределяет запросы между серверами. Могут также появляться кеширование, очереди сообщений, репликация базы данных и другие механизмы. Но принцип остается тем же: система получает, хранит, обрабатывает и передает информацию. Почему нельзя сделать все в одной таблице Excel На небольшом количестве данных Excel действительно может решить задачу. Допустим, есть таблица: Автор Email Проблема Статус Исполнитель Однако при увеличении числа пользователей появляются ограничения. Во-первых, информация начинает дублироваться. Имя и email пользователя придется записывать снова для каждой заявки. Во-вторых, сложно контролировать права доступа. В полноценной системе можно разрешить пользователю видеть только свои заявки, а администратору — все. В-третьих, становится сложнее работать одновременно большому количеству пользователей. Кроме того, информационная система может автоматически проверять данные, отправлять уведомления и выполнять другие действия. То есть отличие заключается не только в способе хранения данных, но и в автоматизации процессов вокруг них. Что можно добавить в систему дальше Даже из такой простой идеи можно постепенно получить достаточно серьезный проект. Например, добавить приоритет заявки: low medium high critical После этого можно реализовать фильтрацию: Показать все критические заявки, которые еще не выполнены. SQL-запрос будет выглядеть примерно так: SELECT * FROM tickets WHERE priority = 'critical' AND status != 'closed'; Можно добавить комментарии к заявкам. Для этого появляется новая таблица: comments id ticket_id author_id text created_at После этого одна заявка может иметь множество комментариев. Можно добавить историю изменения статусов: ticket_history id ticket_id old_status new_status changed_by changed_at Это позволит определить, кто и когда изменил заявку. Также можно реализовать: прикрепление файлов; email-уведомления; поиск; фильтрацию; статистику; личный кабинет; раздел администратора; категории заявок; автоматическое назначение исполнителя. Из небольшого учебного приложения постепенно получается достаточно полноценная информационная система. Какие технологии можно использовать Один из возможных наборов технологий: Frontend: HTML CSS JavaScript Backend: Python FastAPI Database: PostgreSQL API: REST Для небольшого проекта этого более чем достаточно. При этом конкретные технологии здесь вторичны. Backend можно написать на Java, C#, Go, JavaScript или другом языке. PostgreSQL можно заменить другой СУБД. Главное — понимать назначение каждого компонента и взаимодействие между ними. Что я понял при разборе такой системы До изучения устройства подобных приложений информационная система может восприниматься просто как программа с базой данных. Но в реальности это набор связанных компонентов. База данных отвечает за хранение информации. Backend реализует правила работы и управляет доступом к данным. API определяет способ взаимодействия компонентов. Frontend предоставляет пользователю интерфейс. Авторизация отвечает за идентификацию пользователей и разграничение прав. А архитектура определяет, как все эти части связаны между собой. Даже простая система учета заявок затрагивает сразу несколько областей: базы данных, программирование, проектирование архитектуры, безопасность и пользовательские интерфейсы. Именно этим информационные системы мне и кажутся интересными: разработчик работает не только над отдельным алгоритмом или интерфейсом, а проектирует целый процесс работы с информацией. Заключение Информационная система необязательно должна начинаться с огромной архитектуры, десятков сервисов и миллионов пользователей. Начать можно с простой задачи. Например: Пользователь создает заявку, система сохраняет ее, сотрудник принимает ее в работу и после выполнения меняет статус. Но даже в таком небольшом сценарии появляются ключевые элементы современной информационной системы: пользователи; база данных; связи между сущностями; backend; API; интерфейс; бизнес-логика; авторизация; безопасность. Именно поэтому небольшой проект зачастую полезнее для понимания информационных технологий, чем попытка сразу изучить устройство огромных систем. Разбирая систему по частям, становится понятнее, зачем нужны базы данных, серверная разработка, API и архитектура приложений — и каким образом из этих компонентов собирается единый работающий продукт.

This is a summary aggregated from Dev.to. Read the complete article on the original site:

Read full article at Dev.to

More Programming & Dev News