DEV Community

dmitrii
dmitrii

Posted on

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

Когда слышишь термин «информационная система», первое время он кажется слишком общим. Под него можно подвести почти что угодно: интернет-магазин, банковское приложение, электронный дневник, систему учета сотрудников или даже небольшой сервис для регистрации обращений пользователей.

Но почти у всех таких систем есть общая задача: получить данные, сохранить их, обработать и предоставить пользователю в удобном виде.

В этой статье я разберу устройство информационной системы на простом примере — системе учета заявок. Такая система может использоваться внутри компании: сотрудник сообщает о проблеме, заявка сохраняется, специалист берет ее в работу, а затем меняет статус после решения.

Цель статьи — не создать полноценный промышленный продукт, а показать основные компоненты информационной системы и то, как они взаимодействуют друг с другом.

Постановка задачи

Представим небольшую организацию, в которой сотрудники периодически обращаются в техническую поддержку.

Например:

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

Если подобных обращений немного, их можно принимать через мессенджер или записывать в обычную таблицу.

Однако со временем возникают проблемы.

Непонятно, какие заявки уже выполнены, какие еще находятся в работе, кто отвечает за конкретное обращение и когда оно было создано.

Поэтому имеет смысл создать отдельную информационную систему.

Пусть она умеет:

создавать заявку;
хранить информацию о пользователе;
показывать список заявок;
изменять статус заявки;
назначать ответственного сотрудника;
хранить дату создания заявки.

Получается уже вполне реальная прикладная задача.

Из чего будет состоять система

Упрощенно систему можно разделить на три основных уровня:

Интерфейс пользователя → серверная часть → база данных

Пользователь работает с интерфейсом. Например, заполняет форму создания заявки.

Интерфейс отправляет данные на сервер.

Сервер проверяет их и записывает в базу данных.

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

Такое разделение используется во множестве современных приложений.

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

Начать удобно со структуры данных.

Для небольшой системы нам понадобятся как минимум две сущности:

пользователи;
заявки.

Таблица пользователей может выглядеть следующим образом:

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)
Enter fullscreen mode Exit fullscreen mode

);

После этого база данных уже может хранить основные сущности системы.

Добавим пользователя:

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
Enter fullscreen mode Exit fullscreen mode

Балансировщик распределяет запросы между серверами.

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

Но принцип остается тем же: система получает, хранит, обрабатывает и передает информацию.

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

Top comments (0)