Теоретический конспект лекции

Тема 4. Проектирование структур баз данных — Организация интерфейса с пользователем: ввод

Фундаментальный теоретический материал по архитектуре сопряжения пользовательских интерфейсов (UI) с реляционными базами данных, компоновке форм ввода, эргономике взаимодействия и маппингу элементов управления на атрибуты таблиц.

Дисциплина ОП.08 Основы проектирования баз данных
Тематический раздел Тема 4 (§2.2 с.7–8 программы)
Занятие №23 (2 академических часа)
Ключевые концепции MVC, Data Binding, Master-Detail, Маппинг полей, UX-эргономика

1. Введение: интерфейс пользователя как точка входа данных в БД

Реляционная база данных — это строгое математическое ядро информационной системы, оперирующее нормализованными таблицами, первичными и внешними ключами, ограничениями доменов и декларативными предикатами (CHECK, UNIQUE, EXCLUDE). Однако подавляющее большинство данных генерируется людьми — операторами, клиентами, менеджерами, врачами, диспетчерами.

Человек не мыслит в категориях SQL-команд INSERT INTO orders (id, client_id, ...) VALUES (...). Для человека естественной средой взаимодействия является графический пользовательский интерфейс (GUI / UI), представленный экранными формами, диалоговыми окнами, текстовыми полями, переключателями и табличными сетками.

Главный парадокс проектирования: Пользователь стремится к максимальной свободе и скорости ввода (хочет видеть все данные на одном экране, вводить неструктурированный текст), в то время как СУБД требует строгой типизации, нормализации (отсутствия избыточности) и ссылочной целостности. Задача инженера по базам данных — спроектировать интерфейс ввода так, чтобы объединить высокое удобство для человека (UX) с абсолютной целостностью данных в реляционном хранилище.

2. Архитектура сопряжения слоев приложения: от клика до диска

В современной промышленной разработке прямое взаимодействие интерфейса (View) с сервером базы данных категорически исключено. Применяется многоуровневая (N-tier) архитектура, обеспечивающая изоляцию ответственности, безопасность учетных данных СУБД и независимое масштабирование.

+========================================================================================================+ | 1. УРОВЕНЬ ПРЕДСТАВЛЕНИЯ (VIEW / UI) | | - Графические компоненты ввода: Input (Mask), Combobox/Select, RadioGroup, Checkbox, DatePicker | | - Сетка спецификации (Master-Detail Grid), кнопки отправки (Submit) и сброса (Reset) | | - Клиентская UX-валидация: подсветка незаполненных обязательных полей, проверка формата регулярками | +========================================================================================================+ | | [1] Отправка DTO (Data Transfer Object) | через HTTP POST/PUT / WebSocket / IPC v +========================================================================================================+ | 2. УРОВЕНЬ БИЗНЕС-ЛОГИКИ И КООРДИНАЦИИ (CONTROLLER / BACKEND) | | - Маршрутизация запросов (REST API / GraphQL / RPC Endpoint) | | - Десериализация DTO и серверная валидация бизнес-правил (проверка прав, правдоподобия данных) | | - Определение границ транзакции (Transaction Boundary: BEGIN TRANSACTION / COMMIT / ROLLBACK) | +========================================================================================================+ | | [2] Передача доменной модели | в репозиторий сущности v +========================================================================================================+ | 3. УРОВЕНЬ ДОСТУПА К ДАННЫМ (DATA ACCESS LAYER / DAO / ORM / REPOSITORY) | | - Data Mapper / ORM (Entity Framework, Hibernate, SQLAlchemy, Prisma, Dapper) | | - Формирование параметризованного SQL (Prepared Statements) с защитой от SQL-инъекций | | - Преобразование объектного графа в реляционные строки (Object-to-Relational Mapping) | +========================================================================================================+ | | [3] Выполнение команд SQL через низкоуровневый драйвер | (JDBC, Npgsql, libpq, asyncpg, mysql-connector) v +========================================================================================================+ | 4. РЕЛЯЦИОННАЯ СУБД (DATABASE ENGINE / POSTGRESQL / MYSQL) | | - Декларативные ограничения целостности: PRIMARY KEY, FOREIGN KEY, NOT NULL, CHECK, UNIQUE, EXCLUDE | | - Выполнение триггеров, журналирование WAL, модификация страниц данных на диске | | - Гарантия ACID-свойств (Атомарность, Согласованность, Изоляция, Долговечность) | +========================================================================================================+

2.1. Паттерны архитектуры UI: MVC, MVP, MVVM

2.2. Механизм Data Binding (привязка данных)

Data Binding связывает визуальное свойство контрола (например, input.value или select.selectedValue) со свойством структуры данных. В контексте баз данных выделяют:

3. Типы элементов управления формы ввода и их реляционный маппинг

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

Элемент UI Привязка к типам СУБД Связи и ограничения БД Инженерные особенности маппинга
Текстовое поле с маской (Masked Input) VARCHAR(n), CHAR(n) NOT NULL, CHECK (col ~ 'regex') Форматирует ввод пользователя по шаблону (например, +7 (999) 999-99-99 или 999-999-999 99). В базу данных передается так называемое raw-значение (только цифры) либо стандартизированная строка. Предотвращает ошибки оператора при вводе идентификаторов.
Выпадающий список (Combobox / Select) INT, BIGINT, UUID FOREIGN KEY REFERENCES parent_table(id) Критически важное правило: разделение Display Member (видимый пользователю текст, например ФИО клиента) и Value Member (скрытый числовой суррогатный ключ client_id). В запрос INSERT отправляется строго Value Member. Для справочников свыше 100 позиций применяется динамический поиск Autocomplete.
Группа радиокнопок (RadioGroup) VARCHAR(n), ENUM, SMALLINT CHECK (priority IN ('low', 'medium', 'high')) Выбор одного варианта из фиксированного небольшого списка (2–5 значений). Все радиокнопки объединяются общим именем группы. Исключает ввод отсутствующих значений, так как одно из полей обычно выбрано по умолчанию (DEFAULT в таблице).
Флажок (Checkbox) BOOLEAN NOT NULL DEFAULT FALSE Отражает бинарные состояния (0 или 1, Да или Нет). Свойство checked = true мапится в TRUE, false — в FALSE. Если колонка допускает NULL, используется трехпозиционный чекбокс (Tri-state), однако в архитектуре баз данных рекомендуется заменять такие атрибуты строгими перечислениями.
Компонент выбора даты (DatePicker) DATE, TIMESTAMP, TIMESTAMPTZ CHECK (end_date >= start_date) Исключает ввод несуществующих дат (30 февраля, 13 месяц). Маппинг данных осуществляется в строгом стандарте ISO 8601 (YYYY-MM-DD), что исключает ошибки региональных настроек сервера СУБД (конфликт форматов DD/MM/YYYY и MM/DD/YYYY).
Табличная часть (Master-Detail Grid) Две таблицы: Мастер-запись (1) и массив строк Деталей (М) FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE Позволяет вводить списки связанных сущностей: строки накладной, позиции спецификации заказа. Каждая строка содержит элементы выбора товара (FK), количества (INT/NUMERIC) и цены. Отправка и запись производятся единой неделимой транзакцией.

4. Компоновка сложных форм ввода: паттерн Master-Detail

Большинство корпоративных учетных документов (заказы, счета-фактуры, путевые листы, истории болезней) представляют собой иерархическую структуру «Один-ко-Многим» (1:M). Для их ввода используется паттерн Master-Detail (Шапка — Табличная часть).

+--------------------------------------------------------------------------------------------------------+ | ШАПКА ДОКУМЕНТА (MASTER RECORD) | | Номер заказа: [ 2026-004812 ] Дата оформления: [ 2026-10-01 ] | | Контрагент (Клиент): [ ООО "СеверТранс" | v ] (ID: 104) Склад: [ Центральный склад №1 | v ] | +--------------------------------------------------------------------------------------------------------+ | ТАБЛИЧНАЯ ЧАСТЬ СПЕЦИФИКАЦИИ (DETAIL GRID) | | # | Товар / Услуга (Select FK) | Количество | Ед. изм. | Цена (руб) | Скидка % | Сумма (руб) | | ---+--------------------------------------+------------+----------+------------+----------+--------------| | 1 | Кабель витая пара UTP Cat 5e (305м) | 5 | бухта | 4 500.00 | 5% | 21 375.00 | | 2 | Коммутатор управляемый 24-Port L2 | 2 | шт | 18 200.00 | 0% | 36 400.00 | | 3 | Патч-панель 19" 24 порта RJ-45 | 4 | шт | 1 850.00 | 10% | 6 660.00 | | [ + Добавить строку ] [ - Удалить выбранную ] | +--------------------------------------------------------------------------------------------------------+ | ПОДВАЛ ФОРМЫ (ИТОГИ И ДЕЙСТВИЯ) | | ИТОГО К ОПЛАТЕ: 64 435.00 руб. Статус: [ Черновик | v ] | | [ Отменить ] [ Сохранить и провести заказ ] | +--------------------------------------------------------------------------------------------------------+

Транзакционная механика сохранения Master-Detail в СУБД

При сохранении формы на бэкенд передается единый JSON-объект. Бэкенд выполняет атомарную транзакцию:

-- Серверная транзакция сохранения документа Master-Detail
BEGIN;

-- 1. Вставка родительской записи (Master) с получением сгенерированного ID
INSERT INTO orders (client_id, warehouse_id, order_date, total_amount, status)
VALUES (104, 1, '2026-10-01', 64435.00, 'draft')
RETURNING order_id INTO :new_order_id;

-- 2. Вставка строк спецификации (Detail) с привязкой к новому order_id
INSERT INTO order_items (order_id, item_id, quantity, unit_price, discount_percent)
VALUES 
    (:new_order_id, 301, 5, 4500.00, 5.00),
    (:new_order_id, 814, 2, 18200.00, 0.00),
    (:new_order_id, 922, 4, 1850.00, 10.00);

-- 3. Фиксация транзакции: данные записаны либо полностью, либо ни одна строчка
COMMIT;

5. Правила эргономики UI и UX-инженерия экранных форм

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

6. Вопросы для самопроверки студентов

1. Почему прямое связывание элементов формы ввода с SQL-запросами считается грубой архитектурной ошибкой?
Потому что это нарушает принцип многоуровневой архитектуры, создает критическую уязвимость перед SQL-инъекциями, раскрывает учетные данные СУБД на клиенте и делает невозможным централизованный контроль бизнес-логики и прав доступа.
2. Чем отличается Value Member от Display Member в выпадающем списке (Combobox)?
Display Member — это читаемое строковое представление (например, ФИО врача или наименование товара), отображаемое пользователю. Value Member — это реальный суррогатный первичный ключ справочника (ID), который связывается с внешним ключом целевой таблицы при вставке.
3. Почему валидация на стороне интерфейса (HTML5 / JavaScript) не отменяет необходимость ограничений в СУБД?
Потому что клиентский интерфейс не контролируется сервером: злоумышленник или сбой в ПО могут обойти JS-проверки, отправив прямой HTTP-запрос через консоль браузера или API-клиент. Гарантировать ACID-целостность могут только ограничения ядра базы данных.
4. В чем заключается архитектурная суть паттерна Master-Detail и почему его сохранение требует транзакции?
Паттерн отображает связь «один ко многим» между документом и его строками. Транзакция обязательна, чтобы гарантировать неделимость: если сохранение хотя бы одной строки спецификации завершится ошибкой, шапка документа будет автоматически откатана (ROLLBACK), предотвращая появление «висячих» записей-сирот.