Методическое руководство преподавателя | СИЭУиП

Тема 4. Проектирование структур баз данных — Средства проектирования структур БД: объекты

Дисциплина: ОП.08 Основы проектирования баз данных (Семестр 4, старт семестра! Занятие №21)

Вид занятия: Урок с объяснением теории. Продолжительность: 2 академических часа (80 минут / 60 минут).

1. Паспорт учебного занятия и дидактические цели

Контекст учебного плана: Занятие 21 открывает 4 семестр изучения дисциплины и переводит студентов от абстрактного математического проектирования таблиц и нормализации (3 семестр) к полноценному архитектурному проектированию инфраструктуры объектов реляционной СУБД (PostgreSQL / ANSI SQL). Студенты должны осознать, что современная база данных — это не просто набор таблиц с первичными и внешними ключами, а сложная экосистема специализированных объектов.

Цель занятия: Сформировать у обучающихся комплексное системное представление об объектном составе промышленной реляционной СУБД, назначении и жизненном цикле каждого класса объектов (таблицы, схемы, представления VIEW и MATERIALIZED VIEW, последовательности SEQUENCE, составные и перечислимые типы ENUM/COMPOSITE, индексы, роли и привилегии), а также развить практические навыки работы с CASE-инструментами визуального проектирования и генерации DDL-скриптов прямого (Forward) и обратного (Reverse) проектирования.

Задачи занятия:

2. Детальный хронометраж и тайминг занятия

Методический регламент разработан для двух режимов проведения: стандартного академического (80 минут) и интенсивного/сокращенного (60 минут).

Этап занятия Регламент 80 мин Регламент 60 мин Ключевые действия преподавателя и акценты
1. Организационный момент и старт 4 семестра 5 мин 3 мин Приветствие, фиксация явки, поздравление с началом 4 семестра. Постановка целей: переход от простых таблиц к зрелой архитектуре СУБД.
2. Мотивация и актуализация опорных знаний 10 мин 7 мин Проблемная ситуация: почему монолитная схема public и только таблицы TABLE приводят к хаосу прав доступа, падению производительности аналитики и дублированию кода запросов? Экспресс-опрос по 3 семестру.
3. Объяснение нового теоретического материала (Часть 1) 25 мин 18 мин Иерархия объектов каталога СУБД. Пространства имен и схемы (CREATE SCHEMA, search_path). Суррогатные ключи и последовательности SEQUENCE (внутреннее устройство, кэширование, пропуски номеров). Типы данных ENUM и Composite types.
4. Объяснение нового теоретического материала (Часть 2) 20 мин 16 мин Представления: обычные динамические VIEW (подстановка AST в запрос, защита данных) против MATERIALIZED VIEW (физический снапшот, агрегаты, REFRESH CONCURRENTLY, уникальный индекс). Роли и привилегии доступа.
5. Обзор CASE-инструментов и инженерии DDL 10 мин 8 мин Сравнение pgModeler, DBeaver EE, dbForge Studio, ERwin. Механизмы Forward Engineering (модель → DDL скрипт) и Reverse Engineering (живая БД → диаграмма сущностей и связей).
6. Первичное закрепление, разбор кейсов и рефлексия 7 мин 6 мин Фронтальный опрос, демонстрация интерактивного рабочего листа zanyatie.html (4 прикладных кейса), разбор типичных заблуждений.
7. Подведение итогов и выдача инструкций 3 мин 2 мин Резюме занятия, анонс следующего практического занятия по моделированию объектов, инструктаж по резервному ДЗ.

3. Фундаментальный разбор объектов реляционной СУБД

3.1. Иерархия каталога и пространства имен (SCHEMAS / NAMESPACES)

Студенты часто воспринимают СУБД как одну плоскую папку с таблицами. Необходимо ввести строгую пятиуровневую модель:

  1. СУБД Кластер (Database Cluster): единый экземпляр СУБД (процессы PostgreSQL/Oracle, общая память Shared Buffers, WAL-журнал, один сетевой порт).
  2. База данных (Database): логически изолированное хранилище данных внутри кластера. Кросс-базовые SQL-запросы в стандартном SQL не поддерживаются без специальных расширений (dblink/postgres_fdw).
  3. Схема / Пространство имен (Schema / Namespace): логический контейнер внутри базы данных. Предотвращает коллизии имен (например, hr.employees и finance.employees), разграничивает зоны ответственности микросервисов или модулей ERP.
  4. Объекты схемы: таблицы, представления, последовательности, типы, функции.
  5. Объекты уровня кластера: пользователи, роли (ROLES), табличные пространства (TABLESPACES).
-- Создание изолированных схем
CREATE SCHEMA billing;
CREATE SCHEMA imaging;
CREATE SCHEMA logistics;
CREATE SCHEMA academic;

-- Управление путем поиска схем в сессии
SET search_path TO billing, public;
SHOW search_path;

3.2. Последовательности (SEQUENCE): атомарные генераторы суррогатных ключей

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

Критически важный методический акцент: Студенты должны твердо усвоить: последовательность НЕ ГАРАНТИРУЕТ отсутствие пропусков при откате транзакции (ROLLBACK)! Вызов nextval() инкрементирует счетчик атомарно и необратимо. Это проектная норма, предотвращающая взаимоблокировки транзакций (Deadlocks).
CREATE SEQUENCE billing.receipt_seq
    START WITH 100000
    INCREMENT BY 1
    MINVALUE 100000
    MAXVALUE 999999999
    CACHE 20;

-- Использование в DDL таблицы
CREATE TABLE billing.receipts (
    receipt_id BIGINT PRIMARY KEY DEFAULT nextval('billing.receipt_seq'),
    account_number VARCHAR(32) NOT NULL,
    amount NUMERIC(12, 2) NOT NULL,
    created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
);

3.3. Пользовательские типы данных: ENUM и COMPOSITE TYPES

Для обеспечения чистоты доменной модели СУБД позволяет создавать строгие пользовательские типы:

-- Перечислимый тип для модальностей лучевой диагностики
CREATE TYPE imaging.modality_type AS ENUM ('CT', 'MRI', 'XRAY', 'ULTRASOUND', 'PET');

-- Составной тип адреса
CREATE TYPE logistics.geo_point AS (
    latitude NUMERIC(9, 6),
    longitude NUMERIC(9, 6)
);

3.4. Архитектурное сравнение: обычные VIEW против MATERIALIZED VIEW

Это центральная теоретическая развилка занятия 21. Преподаватель обязан сопоставить их по ключевым архитектурным факторам:

Характеристика Обычное представление (VIEW) Материализованное представление (MATERIALIZED VIEW)
Физическое хранение Не занимает дискового пространства (только текст запроса в системном каталоге). Занимает место на диске как полноценная таблица (данные материализованы в блоках).
Выполнение запроса Динамическое слияние: парсер подставляет тело VIEW в исходный SQL-запрос на лету. Чтение готового физического снапшота с диска/буферного кэша.
Актуальность данных 100% real-time (всегда отражает последние зафиксированные транзакции). Снапшот на момент последнего обновления (REFRESH). Допускает контролируемое устаревание.
Индексация Нельзя построить собственные индексы (индексируются только базовые таблицы). Можно строить любые индексы (B-Tree, GIN, Hash) прямо по полям витрины!
Нагрузка на СУБД Нагружает процессор и диск при каждом чтении тяжелых JOIN и агрегатов GROUP BY. Мгновенное чтение; тяжелая нагрузка перенесена на регламентное окно вызова REFRESH.
Типовое применение Безопасность (сокрытие столбцов), маскирование ПДн, стандартизация бизнес-логики. Дашборды, тяжелая аналитика OLAP, ежемесячные финансовые отчеты, витрины данных.
-- 1. Обычное представление (динамическое сокрытие персональных данных)
CREATE VIEW imaging.v_patient_studies_public AS
SELECT 
    study_id,
    study_uid,
    modality,
    study_date,
    regexp_replace(patient_name, '(?<=\S{2})\S+', '***', 'g') AS masked_patient_name,
    doctor_conclusion
FROM imaging.patient_studies;

-- 2. Материализованное представление (тяжелая витрина агрегатов)
CREATE MATERIALIZED VIEW billing.mv_monthly_debt_summary AS
SELECT 
    a.district_id,
    date_trunc('month', n.accrual_date) AS accrual_month,
    count(DISTINCT a.subscriber_id) AS total_subscribers,
    sum(n.accrual_amount) AS total_accrued,
    sum(n.paid_amount) AS total_paid,
    sum(n.accrual_amount - n.paid_amount) AS total_debt
FROM billing.subscribers a
JOIN billing.accruals n ON a.subscriber_id = n.subscriber_id
GROUP BY a.district_id, date_trunc('month', n.accrual_date);

-- Построение уникального индекса для обеспечения CONCURRENT обновления
CREATE UNIQUE INDEX idx_mv_monthly_debt_pk 
ON billing.mv_monthly_debt_summary (district_id, accrual_month);

-- Регламентное фоновое обновление без эксклюзивной блокировки чтения
REFRESH MATERIALIZED VIEW CONCURRENTLY billing.mv_monthly_debt_summary;

3.5. Роли, пользователи и дискреционное разграничение прав (DCL)

Объекты СУБД защищаются через модель ролей. В PostgreSQL роль (ROLE) объединяет концепции пользователя и группы.

4. CASE-инструменты визуального проектирования и DDL-инженерия

Промышленное проектирование редко ведется ручным написанием гигантских скриптов. Архитектор использует CASE-инструменты (Computer-Aided Software Engineering):

pgModeler (Open Source)

Специализированный инструмент для PostgreSQL. Поддерживает 100% нативных объектов: схемы, составные типы, диапазоны, MATERIALIZED VIEW, правила репликации и триггеры. Генерирует безупречный декларативный код.

DBeaver (CE / PRO)

Универсальный инструмент разработчика БД. Встроенный редактор ERD позволяет строить схемы связей на лету, редактировать объекты через GUI и автоматически генерировать скрипты миграций.

dbForge Studio

Мощная среда для визуального моделирования, сравнения схем (Schema Compare) и синхронизации баз данных на уровне DDL-различий.

ERwin Data Modeler

Корпоративный стандарт моделирования. Разделяет концептуальный, логический (Logical) и физический (Physical) уровни модели с трансляцией типов под целевую СУБД.

Двунаправленная DDL-инженерия:

5. Типовые ошибки обучающихся и методы их упреждения

Типовая ошибка студента Причина и ошибочное представление Педагогический прием и исправление
Смешение VIEW и MATERIALIZED VIEW Студент полагает, что обычный VIEW ускоряет запросы так же, как кэш. Демонстрация EXPLAIN ANALYZE: обычный VIEW выполняет сканирование таблиц каждый раз заново. Показать, что только MATERIALIZED VIEW сохраняет физические блоки.
Попытка вставить строку (INSERT) в сложный агрегатный VIEW Непонимание правил обновляемости представлений (Updatable Views). Объяснить математическую неоднозначность: если во VIEW выведена SUM(salary) GROUP BY dept, в какую конкретно строку базовой таблицы СУБД должна прибавить 5000 рублей?
Попытка выполнить REFRESH CONCURRENTLY без уникального индекса Пропуск создания UNIQUE INDEX по полям материализованного представления. Показать сообщение об ошибке PostgreSQL: "cannot refresh concurrently without at least one unique index". Объяснить алгоритм diff: СУБД сравнивает старые и новые строки по первичному ключу.
Ожидание строгой монотонности чисел без пропусков от SEQUENCE Студент путает идентификатор сущности с номером финансовой накладной строгой отчетности. Продемонстрировать ROLLBACK: счетчик увеличился, а строка удалилась. Номер утерян навсегда. Доказать, что SEQUENCE нужен для уникальности, а не непрерывности нумерации.
Сваливание всех объектов в схему public Привычка со школьного курса и базовых лабораторных работ. Ввести метафору: «Схема public в БД — это рабочий стол Windows, заваленный 5000 файлами». Разделить проект на бизнес-схемы (модули).

6. Педагогические приемы и интерактивные механики