Практическая работа: Логическая и физическая независимость данных

Индивидуальный рабочий лист обучающегося по дисциплине «ОП.08 Основы проектирования баз данных». Анализ архитектурных уровней ANSI/SPARC, классификация сценариев независимости данных и проектирование механизмов изоляции схемы от клиентского ПО.

Данные обучающегося

Вариант 1: Декомпозиция таблицы Клиенты на ЮрЛица и ФизЛица

Инженерная ситуация:

В ходе рефакторинга монолитная таблица Clients разделена на две независимые таблицы: Legal_Entities (Юридические лица: ИНН, КПП, ОГРН, название) и Individuals (Физические лица: ФИО, ИНН, паспорт). С базой работает старая бухгалтерская программа 2012 года, выполняющая запрос SELECT client_id, name, inn FROM Clients;, исходный код которой изменить невозможно.

Задание 1.1. Классификация уровня и типа независимости (1 балл)

Какой тип независимости иллюстрирует данная ситуация (логическая или физическая)? На какой границе трехуровневой модели ANSI/SPARC возникает данная изоляция?

Задание 1.2. Механизм реализации через VIEW (1 балл)

Напишите SQL DDL-запрос создания экранирующего представления Clients с объединением (UNION ALL), обеспечивающего полную работоспособность старого бухгалтерского софта.

Задание 1.3. Обработка вставок данных через триггеры INSTEAD OF (1 балл)

Что произойдет, если старая программа выполнит INSERT INTO Clients ...? Какой механизм СУБД (триггер INSTEAD OF) необходим для маршрутизации новых записей?

Задание 1.4. Инженерный вывод и самопроверка (1 балл)

Сформулируйте доказательство: почему в данном случае исходный программный код клиентского приложения остался работоспособным? При каких условиях эта независимость может быть нарушена?

Вариант 2: Перенос архива заказов на HDD-массив и секционирование

Инженерная ситуация:

Таблица Orders насчитывает 50 миллионов записей. Для экономии места администратор БД переносит архивные заказы старше 3 лет на медленный HDD-массив с созданием отдельного tablespace archive_hdd и разбивает таблицу на секции (partitions) по годам. Пользователи продолжают запрашивать данные через привычный веб-интерфейс.

Задание 2.1. Классификация уровня и типа независимости (1 балл)

Какой тип независимости данных реализуется при переносе данных между дисками и секционировании таблицы? Какая граница ANSI/SPARC задействована?

Задание 2.2. Механизм прозрачного секционирования (Partitioning) (1 балл)

Как при секционировании по годам работает механизм Partition Pruning? Должен ли прикладной программист писать в запросе имя партиции orders_2023 вместо мастер-таблицы Orders?

Задание 2.3. Роль табличных пространств (Tablespaces) (1 балл)

Какую роль играют Tablespaces в изоляции концептуальной схемы от физических накопителей (SSD vs HDD)? Поясните принцип многоуровневого хранения (Tiered Storage).

Задание 2.4. Доказательство физической независимости (1 балл)

Докажите, почему выполнение клиентом запроса SELECT * FROM Orders WHERE order_date = '2022-04-12'; не требует модификации после переноса на HDD-массив.

Вариант 3: Оптимизация поиска по миллиону записей (B-Tree vs Hash, EXPLAIN)

Инженерная ситуация:

Запрос фильтрации товаров SELECT * FROM Products WHERE category_id = 42 AND price BETWEEN 1000 AND 5000; на таблице из 1 000 000 строк выполняется за 2.5 секунды, перегружая CPU полным сканированием (Seq Scan). Требуется оптимизировать доступ без правки кода сервиса каталога.

Задание 3.1. Классификация уровня и типа независимости (1 балл)

К какому типу независимости относится добавление индекса к таблице? Изменяется ли при этом логическая структура таблицы (состав колонок, типы данных)?

Задание 3.2. Выбор типа индекса: B-Tree vs Hash (1 балл)

Сравните применимость B-Tree индекса и Hash индекса для данного запроса с условием BETWEEN. Почему Hash-индекс категорически не подходит для диапазонных фильтров?

Задание 3.3. Анализ плана запроса EXPLAIN (1 балл)

Как изменится план выполнения команды EXPLAIN до и после построения индекса (сравните Seq Scan и Index Scan / Bitmap Index Scan)? Что доказывает физическую независимость?

Задание 3.4. Инженерный вывод и самопроверка (1 балл)

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

Вариант 4: Добавление поля «Статус_лояльности» и экранирование касс

Инженерная ситуация:

В таблицу Customers добавлено новое поле loyalty_tier VARCHAR(20). В сети супермаркетов эксплуатируются 500 старых кассовых аппаратов, ПО которых при выполнении запроса SELECT * FROM Customers WHERE card_code = ?; аварийно завершает работу при обнаружении неожиданной лишней колонки.

Задание 4.1. Классификация проблемы независимости (1 балл)

К какому уровню архитектуры ANSI/SPARC относится добавление нового поля в концептуальную таблицу? Нарушение какой независимости произошло для кассовых терминалов?

Задание 4.2. Экранирование схемы через специализированное представление (1 балл)

Предложите решение с созданием представления v_pos_customers для кассовых аппаратов. Приведите SQL-запрос создания VIEW с жестко фиксированным списком разрешенных колонок.

Задание 4.3. Разграничение прав доступа (GRANT) (1 балл)

Как с помощью команд GRANT и REVOKE запретить кассовым аппаратам прямой доступ к базовой таблице Customers, оставив права только на чтение представления?

Задание 4.4. Инженерный вывод и самопроверка (1 балл)

Сформулируйте вывод: почему практика использования представлений (VIEW) вместо прямого доступа к таблицам является базовым правилом архитектуры корпоративных баз данных?

Данные сохранены в браузере!