Дисциплина: ОП.08 Основы проектирования баз данных (Семестр 4, старт семестра! Занятие №21)
Вид занятия: Урок с объяснением теории. Продолжительность: 2 академических часа (80 минут / 60 минут).
Цель занятия: Сформировать у обучающихся комплексное системное представление об объектном составе промышленной реляционной СУБД, назначении и жизненном цикле каждого класса объектов (таблицы, схемы, представления VIEW и MATERIALIZED VIEW, последовательности SEQUENCE, составные и перечислимые типы ENUM/COMPOSITE, индексы, роли и привилегии), а также развить практические навыки работы с CASE-инструментами визуального проектирования и генерации DDL-скриптов прямого (Forward) и обратного (Reverse) проектирования.
Задачи занятия:
CREATE VIEW) и материализованными витринами (CREATE MATERIALIZED VIEW, стратегия обновления REFRESH MATERIALIZED VIEW [CONCURRENTLY]). Изучить атомарные генераторы суррогатных ключей CREATE SEQUENCE, создание доменных типов (CREATE TYPE ... AS ENUM / AS (...)) и разграничение прав (ROLE, GRANT/REVOKE). Освоить принципы визуального моделирования и сопоставления графических нотаций с реальным DDL-кодом в CASE-системах (pgModeler, DBeaver, dbForge Studio, ERwin Data Modeler).public на изолированные предметные контексты (схемы/namespaces).Методический регламент разработан для двух режимов проведения: стандартного академического (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 мин | Резюме занятия, анонс следующего практического занятия по моделированию объектов, инструктаж по резервному ДЗ. |
Студенты часто воспринимают СУБД как одну плоскую папку с таблицами. Необходимо ввести строгую пятиуровневую модель:
hr.employees и finance.employees), разграничивает зоны ответственности микросервисов или модулей ERP.ROLES), табличные пространства (TABLESPACES).-- Создание изолированных схем
CREATE SCHEMA billing;
CREATE SCHEMA imaging;
CREATE SCHEMA logistics;
CREATE SCHEMA academic;
-- Управление путем поиска схем в сессии
SET search_path TO billing, public;
SHOW search_path;
SEQUENCE — это специальный служебный объект реляционной СУБД, спроектированный для высокопроизводительной непрерывной генерации уникальных числовых идентификаторов вне контекста пользовательских транзакций (без блокировок строк таблицы).
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
);
Для обеспечения чистоты доменной модели СУБД позволяет создавать строгие пользовательские типы:
-- Перечислимый тип для модальностей лучевой диагностики
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)
);
Это центральная теоретическая развилка занятия 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;
Объекты СУБД защищаются через модель ролей. В PostgreSQL роль (ROLE) объединяет концепции пользователя и группы.
CREATE ROLE analyst_read WITH LOGIN PASSWORD '***';GRANT USAGE ON SCHEMA billing TO analyst_read;GRANT SELECT ON billing.mv_monthly_debt_summary TO analyst_read;REVOKE ALL ON billing.subscribers FROM analyst_read; — запрет прямого доступа к чувствительным таблицам с предоставлением доступа только через проверенное представление!Промышленное проектирование редко ведется ручным написанием гигантских скриптов. Архитектор использует CASE-инструменты (Computer-Aided Software Engineering):
Специализированный инструмент для PostgreSQL. Поддерживает 100% нативных объектов: схемы, составные типы, диапазоны, MATERIALIZED VIEW, правила репликации и триггеры. Генерирует безупречный декларативный код.
Универсальный инструмент разработчика БД. Встроенный редактор ERD позволяет строить схемы связей на лету, редактировать объекты через GUI и автоматически генерировать скрипты миграций.
Мощная среда для визуального моделирования, сравнения схем (Schema Compare) и синхронизации баз данных на уровне DDL-различий.
Корпоративный стандарт моделирования. Разделяет концептуальный, логический (Logical) и физический (Physical) уровни модели с трансляцией типов под целевую СУБД.
schema.sql (команды CREATE SCHEMA, CREATE SEQUENCE, CREATE TABLE, CREATE VIEW).| Типовая ошибка студента | Причина и ошибочное представление | Педагогический прием и исправление |
|---|---|---|
Смешение 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 файлами». Разделить проект на бизнес-схемы (модули). |
MATERIALIZED VIEW».pg_class, pg_views, pg_sequences).