Раздел 3 / 5 · 09.04.01.02

Информационное обеспечение систем автоматизации

Тема 3.1

Банки данных, СУБД, уровни представления

Назначение и компоненты систем баз данных — по методичке Дьякова «Базы данных: язык SQL».

Основные понятия

База данных (БД) — именованная совокупность структурированных данных, отражающая состояние объектов предметной области и их связей и организованная так, чтобы данные были независимы от прикладных программ.
СУБД — комплекс программных и языковых средств для создания, ведения и совместного использования баз данных. Банк данных = база данных + СУБД + технические средства + администратор + словарь данных.

БД — это библиотека: сами книги, расставленные по строгой системе. СУБД — библиотекарь: принимает запросы, знает, где что стоит, не пускает посторонних в хранилище и следит, чтобы две «правки» одной книги не столкнулись. Банк данных — вся библиотека как учреждение: фонд + библиотекарь + здание + каталог + директор (администратор).

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

Функции СУБД: определение данных (DDL), манипулирование данными (DML), управление транзакциями и параллельным доступом, восстановление после сбоев (журнализация), контроль целостности, разграничение доступа, оптимизация запросов, ведение словаря данных.

Обзор современных СУБД: реляционные — PostgreSQL, MySQL, Oracle Database, Microsoft SQL Server, SQLite, встраиваемые (Interbase/Firebird — на них построен практикум ТГТУ); нереляционные (NoSQL) — документные (MongoDB), «ключ–значение» (Redis), графовые (Neo4j).

За пределами реляционной модели (NoSQL) — для задач, где жёсткая схема и джойны мешают масштабированию: документные (MongoDB — JSON-документы), ключ-значение (Redis — кэш в памяти), колоночные (ClickHouse — аналитика), графовые (Neo4j — связи как первичная сущность). Плата за горизонтальное масштабирование — ослабленные гарантии согласованности (BASE вместо ACID). Для профиля «анализ данных» уместно сказать: рабочие данные — в реляционной СУБД, аналитические витрины — в колоночных.

Уровни представления. Схема и подсхема

Трёхуровневая архитектура ANSI/SPARC обеспечивает независимость данных:

  • внешний уровень — представления отдельных пользователей и приложений (подсхемы);
  • концептуальный уровень — обобщённая логическая модель всей предметной области (схема БД);
  • внутренний (физический) уровень — организация хранения: файлы, индексы, кластеры.
Схема — описание логической структуры всей БД (отношения, атрибуты, типы, ограничения); подсхема — описание части БД, видимой конкретному приложению или пользователю (в SQL — представления, view). Логическая независимость: изменение схемы не ломает подсхемы; физическая независимость: смена способа хранения не затрагивает схему.

Университетская БД на трёх уровнях:

  • внешний: деканат видит только «студент – группа – успеваемость», бухгалтерия — только «студент – стипендия»; ни те ни другие не знают о существовании чужих полей;
  • концептуальный: полная схема — таблицы СТУДЕНТ, ГРУППА, ВЕДОМОСТЬ, ПРИКАЗ со всеми связями;
  • внутренний: файлы данных, B-деревья индексов, страницы по 8 КБ на диске.

Добавили таблицу для военкомата — представления деканата не изменились (логическая независимость). Перенесли файлы на SSD и перестроили индекс — не изменилась даже схема (физическая независимость).

Вопросы к собеседованию

Что такое база данных, СУБД и банк данных?

БД — именованная совокупность структурированных данных предметной области, независимая от прикладных программ. СУБД — программные и языковые средства создания, ведения и совместного использования БД. Банк данных — система в целом: БД + СУБД + технические и организационно-методические средства + администратор.

Перечислите основные функции СУБД.

Определение данных (DDL), манипулирование (DML — поиск, вставка, обновление, удаление), управление транзакциями и параллельным доступом, журнализация и восстановление, контроль целостности, разграничение доступа, оптимизация запросов, словарь данных.

Опишите три уровня представления баз данных. Что такое схема и подсхема?

Внешний уровень — представления пользователей (подсхемы); концептуальный — логическая модель всей предметной области (схема); внутренний — физическое хранение (файлы, индексы). Архитектура даёт логическую (изменение схемы не затрагивает приложения) и физическую (смена хранения не затрагивает схему) независимость данных.

Тема 3.2

Модели данных

Иерархическая, сетевая и реляционная модели; отношение, ключи.

Три классические модели

  • Иерархическая — данные в виде дерева «предок–потомок»; у записи один родитель. Быстрая навигация вдоль иерархии, но связи «многие-ко-многим» требуют дублирования (IMS).
  • Сетевая — граф: запись может иметь много владельцев (модель CODASYL). Гибче иерархической, но сложна в сопровождении, доступ навигационный.
  • Реляционная (Э. Кодд, 1970) — данные в виде отношений (таблиц); доступ декларативный: указывается, что найти, а не как. Господствующая модель.
Иерархическая (дерево) Сетевая (граф) Факультет Кафедра А Кафедра Б Группа у записи один «родитель» Поставщик 1 Деталь 2 Поставка 1 Поставка 2 у записи много «владельцев»: M:N без дублирования
Дерево против графа: иерархическая модель дублирует данные при связях M:N, сетевая — нет, но её обработка навигационная.

Реляционная модель: термины

Отношение — множество кортежей одинаковой структуры (таблица). Схема отношения — имя отношения и набор атрибутов с доменами: R(A₁, A₂, …, An). Кортеж — строка, атрибут — столбец, домен — множество допустимых значений атрибута, степень — число атрибутов, мощность — число кортежей.

Свойства отношений: нет одинаковых кортежей; порядок кортежей и атрибутов не важен; значения атрибутов атомарны (нормализованность).

Ключи: потенциальный ключ — минимальный набор атрибутов, однозначно определяющий кортеж (уникальность + неизбыточность); один из потенциальных выбирается первичным (PRIMARY KEY, не допускает NULL); внешний ключ (FOREIGN KEY) — атрибут, ссылающийся на первичный ключ другого отношения — механизм связи таблиц и ссылочной целостности.

Вопросы к собеседованию

Сравните иерархическую, сетевую и реляционную модели данных.

Иерархическая — дерево, у записи один предок: быстрый доступ вдоль иерархии, но «многие-ко-многим» требует дублирования. Сетевая — граф с многими владельцами записи: гибче, но сложная навигационная обработка. Реляционная — таблицы-отношения с декларативным доступом (SQL), строгая математическая основа; вытеснила первые две.

Что такое схема отношения, кортеж, атрибут, домен?

Схема отношения — имя и перечень атрибутов с доменами R(A₁…An). Кортеж — строка (набор значений атрибутов), атрибут — именованный столбец, домен — множество допустимых значений атрибута. Степень — число атрибутов, мощность — число кортежей.

Что такое потенциальный, первичный и внешний ключи?

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

Назовите свойства отношения в реляционной модели.

Отсутствие одинаковых кортежей (отношение — множество); порядок кортежей и порядок атрибутов несущественны; атомарность значений (в клетке — одно неделимое значение — первая нормальная форма).

Тема 3.3

Реляционная алгебра

Стандартные и специальные операции над отношениями.

Стандартные (теоретико-множественные) операции — над совместимыми отношениями: объединение (все кортежи обоих), пересечение, разность (кортежи первого, отсутствующие во втором), декартово произведение (все сочетания кортежей). Специальные: выборка σ (строки по условию), проекция π (заданные столбцы без дубликатов), соединение ⋈ (произведение + условие равенства атрибутов — естественное соединение), деление.

демоОперации на живых таблицах

Реляционная алгебра на бумаге. СТУДЕНТ(id, имя, группа): {(1, Иванов, ИВТ), (2, Петров, ПИ), (3, Сидоров, ИВТ)}.

σгруппа='ИВТ'(СТУДЕНТ) = {(1, Иванов, ИВТ), (3, Сидоров, ИВТ)} строки по условию πгруппа(СТУДЕНТ) = {(ИВТ), (ПИ)} столбец, дубликат ИВТ исчез

Комбинация операций — уже запрос: «имена студентов ИВТ» = πимягруппа='ИВТ'(СТУДЕНТ)) — ровно то, что делает SELECT имя FROM СТУДЕНТ WHERE группа='ИВТ'.

Деление — самая хитрая операция: СДАЛ(студент, предмет) ÷ ПРЕДМЕТ(предмет) = студенты, сдавшие все предметы из второго отношения. Если СДАЛ = {(Иванов, БД), (Иванов, ИИ), (Петров, БД)} и ПРЕДМЕТ = {(БД), (ИИ)}, то результат — {Иванов}: только у него есть пара с каждым предметом делителя. В SQL деление выражается через двойное NOT EXISTS — потому его и спрашивают «на понимание».

Вопросы к собеседованию

Перечислите операции реляционной алгебры.

Стандартные (теоретико-множественные): объединение, пересечение, разность, декартово произведение. Специальные: выборка σ (фильтр строк по условию), проекция π (выбор столбцов с удалением дубликатов), соединение ⋈ (декартово произведение + условие на атрибуты; частный случай — естественное по равенству одноимённых атрибутов), деление. SQL-запрос SELECT реализует комбинацию этих операций.

Чем выборка отличается от проекции?

Выборка σ работает по строкам: оставляет кортежи, удовлетворяющие условию (WHERE). Проекция π — по столбцам: оставляет указанные атрибуты и устраняет дубликаты кортежей (SELECT DISTINCT списка столбцов).

Что такое естественное соединение?

Соединение двух отношений по равенству всех одноимённых атрибутов, при котором повторяющийся атрибут в результат входит один раз. Общий случай — θ-соединение: декартово произведение с произвольным условием сравнения атрибутов. В SQL — JOIN … ON/USING.

Тема 3.4

Язык SQL

Язык манипулирования данными реляционной модели. Создание и модификация БД, поиск, сортировка, индексирование, формы и отчёты.

SQL — декларативный язык; группы операторов: DDL (CREATE, ALTER, DROP), DML (SELECT, INSERT, UPDATE, DELETE), DCL (GRANT, REVOKE), управление транзакциями (COMMIT, ROLLBACK). Бывает интерактивным и вложенным (встроенным в прикладную программу).

-- создание и модификация
CREATE TABLE student (
  id      INTEGER PRIMARY KEY,
  name    VARCHAR(60) NOT NULL,
  group_id INTEGER REFERENCES sgroup(id),
  rating  NUMERIC(4,2) DEFAULT 0
);
ALTER TABLE student ADD COLUMN email VARCHAR(80);
CREATE INDEX idx_student_group ON student(group_id);

-- манипулирование
INSERT INTO student(id, name, group_id) VALUES (1, 'Иванов', 3);
UPDATE student SET rating = 4.5 WHERE id = 1;
DELETE FROM student WHERE rating < 2;

-- поиск, сортировка, агрегаты
SELECT g.name, COUNT(*) AS n, AVG(s.rating) AS avg_r
FROM student s
JOIN sgroup g ON g.id = s.group_id
WHERE s.rating >= 3
GROUP BY g.name
HAVING COUNT(*) > 5
ORDER BY avg_r DESC;

Порядок логического выполнения SELECT: FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY. Индекс ускоряет поиск и сортировку по столбцу ценой замедления вставок и дополнительной памяти. Представление (CREATE VIEW) — сохранённый запрос-«виртуальная таблица» — механизм подсхем. Формы — экранный интерфейс ввода и просмотра записей; отчёты — форматированный вывод выборок для печати (строятся средствами конкретной СУБД — практикум ТГТУ использует Interbase/Delphi).

демоSELECT по шагам: что происходит с таблицей

LEFT JOIN против INNER JOIN — группы: ИВТ-41, ПИ-42 и новая пустая АСУ-43.

  • INNER JOIN групп со студентами вернёт строки только для ИВТ-41 и ПИ-42 — у АСУ-43 нет пары;
  • LEFT JOIN вернёт и АСУ-43 со значением NULL в столбцах студента — «все группы, даже пустые».

Подзапрос — тот же смысл другой записью: «студенты групп 3-го курса»:

SELECT name FROM student
WHERE group_id IN (SELECT id FROM sgroup WHERE course = 3);
демоЧетыре вида JOIN на живых таблицах

Агрегаты и HAVING на числах. Оценки: Иванов — 5, 4; Петров — 3; Сидоров — 5, 5, 4 (все из ИВТ, Петров из ПИ).

SELECT группа, COUNT(*) AS оценок, AVG(оценка) AS средний
FROM ведомость GROUP BY группа HAVING AVG(оценка) >= 4;
группаоценоксредний
ИВТ5(5+4+5+5+4)/5 = 4,6

Группа ПИ (средний 3) отсечена HAVING после агрегирования — WHERE так не смог бы: он работает до группировки и агрегатов ещё не знает. Частая ошибка на собеседовании — WHERE AVG(...) — как раз про это.

Коррелированный подзапрос — «студенты с оценкой выше средней по своей группе»:

SELECT s.name FROM student s
WHERE s.rating > (SELECT AVG(s2.rating) FROM student s2
                  WHERE s2.group_id = s.group_id);

Подзапрос выполняется для каждой строки внешнего запроса, ссылаясь на неё (s.group_id), — в отличие от независимого подзапроса, который вычисляется один раз.

Вопросы к собеседованию

Какие группы операторов входят в SQL?

DDL — определение данных (CREATE, ALTER, DROP); DML — манипулирование (SELECT, INSERT, UPDATE, DELETE); DCL — управление доступом (GRANT, REVOKE); TCL — транзакции (COMMIT, ROLLBACK, SAVEPOINT). SQL может быть интерактивным и вложенным в прикладную программу.

Опишите структуру оператора SELECT и порядок его выполнения.

SELECT списка выражений FROM таблиц [JOIN … ON] [WHERE условие] [GROUP BY группировка] [HAVING условие на группы] [ORDER BY сортировка]. Логический порядок: FROM/JOIN → WHERE (фильтр строк) → GROUP BY → HAVING (фильтр групп) → SELECT (проекция, агрегаты) → ORDER BY. WHERE отбирает строки до группировки, HAVING — группы после агрегирования.

Что такое индекс и когда его создают?

Дополнительная структура (обычно B-дерево), хранящая значения столбца со ссылками на записи, — ускоряет поиск, соединения и сортировку с O(n) до O(log n). Цена: память и замедление INSERT/UPDATE (индекс надо поддерживать). Создают по столбцам частых условий поиска и соединений; первичный ключ индексируется автоматически.

Что такое представление (VIEW), формы и отчёты?

Представление — именованный сохранённый запрос, ведущий себя как виртуальная таблица; реализует подсхемы и разграничение доступа. Формы — экранный интерфейс ввода/редактирования записей; отчёты — форматированный вывод данных для печати с группировками и итогами. Формы и отчёты строятся инструментами конкретной СУБД или средой разработки.

Чем JOIN отличается от вложенного подзапроса? Какие бывают соединения?

JOIN соединяет строки таблиц по условию: INNER — только совпавшие пары; LEFT/RIGHT OUTER — плюс непарные строки одной из сторон (с NULL); FULL — с обеих; CROSS — декартово произведение. Подзапрос возвращает значение или множество для условия (IN, EXISTS). Многие запросы записываются обоими способами; оптимизатор часто сводит их к одному плану.

Тема 3.5

Проектирование реляционной БД

Функциональные зависимости, декомпозиция, нормальные формы, метод «сущность–связь».

Функциональные зависимости и нормализация

Функциональная зависимость X → Y: каждому значению набора атрибутов X соответствует ровно одно значение Y. Полная ФЗ — Y зависит от всего составного ключа, а не от его части; транзитивная — X → Z через посредника: X → Y и Y → Z.

Функциональные зависимости в таблице ВЕДОМОСТЬ(студент, группа, куратор, предмет, оценка):

{студент, предмет} → оценка полная (нужен весь ключ) студент → группа от части ключа — нарушает 2НФ студент → группа → куратор транзитивная — нарушает 3НФ

Каждая «неправильная» зависимость — готовый рецепт декомпозиции: её левую часть делаем ключом новой таблицы (смотрите демо нормализации ниже).

Плохо спроектированное отношение страдает аномалиями: избыточность (дублирование данных), аномалии обновления, вставки и удаления. Лекарство — декомпозиция: разбиение отношения на проекции без потерь (соединение проекций восстанавливает исходное отношение — теорема Хита) и без потери ФЗ.

Вся нормализация — одно правило: каждый факт хранится ровно один раз. «Куратор группы ИВТ-41 — Дьяков» — это факт о группе, а не о каждом её студенте; значит, ему место в таблице групп, одной строкой. Тогда смена куратора — правка одной клетки, и рассогласование невозможно в принципе.

  • 1НФ — все значения атомарны, нет повторяющихся групп.
  • 2НФ — 1НФ + каждый неключевой атрибут полностью зависит от составного ключа (нет зависимостей от части ключа).
  • 3НФ — 2НФ + нет транзитивных зависимостей неключевых атрибутов от ключа.
  • НФБК — каждый детерминант ФЗ является потенциальным ключом (усиление 3НФ).

Когда 3НФ мало: пример на НФБК. РАСПИСАНИЕ(студент, предмет, преподаватель): каждый преподаватель ведёт один предмет; у студента по каждому предмету один преподаватель. ФЗ: {студент, предмет} → преподаватель и преподаватель → предмет.

Отношение в 3НФ (неключевых транзитивных зависимостей нет), но детерминант «преподаватель» — не потенциальный ключ ⇒ НФБК нарушена: предмет преподавателя дублируется в каждой его строке, со всеми аномалиями. Декомпозиция: ПРЕПОД(преподаватель, предмет) + СЛУШАЕТ(студент, преподаватель).

демоНормализация на сквозном примере

Метод «сущность–связь» (ER)

Инфологическое проектирование: предметная область описывается сущностями (объекты с атрибутами), связями между ними (1:1, 1:M, M:N) и ключами. Затем — даталогическое проектирование: ER-диаграмма отображается в реляционную схему: сущность → таблица, атрибут → столбец, связь 1:M → внешний ключ на стороне «многих», связь M:N → отдельная таблица-связка из двух внешних ключей.

ГРУППА id (PK) название СТУДЕНТ id (PK) имя группа_id (FK) КУРС id (PK) название 1 : M M : N СТУДЕНТ_КУРС студент_id + курс_id связь M:N реализуется таблицей-связкой из двух FK
ER-модель и её отображение в реляционную схему: 1:M — внешний ключ у «многих», M:N — таблица-связка.

Вопросы к собеседованию

Что такое функциональная, полная и транзитивная зависимости?

ФЗ X → Y: значению X соответствует ровно одно значение Y. Полная — Y зависит от всего составного ключа и не зависит от его части. Транзитивная — X → Z через посредника (X → Y, Y → Z, где Y не ключ). Полные и транзитивные зависимости — критерии 2НФ и 3НФ соответственно.

Какие аномалии возникают в ненормализованных отношениях?

Избыточность — многократное дублирование одних данных; аномалия обновления — при изменении факта нужно править много строк, рискуя рассогласованием; аномалия вставки — нельзя записать факт без «лишних» данных (например, преподавателя без группы); аномалия удаления — удаляя строку, теряем последнюю копию независимого факта.

Дайте определения 1НФ, 2НФ и 3НФ.

1НФ: значения атомарны, нет повторяющихся групп. 2НФ: 1НФ + каждый неключевой атрибут полностью функционально зависит от всего составного ключа. 3НФ: 2НФ + нет транзитивных зависимостей неключевых атрибутов от ключа (неключевые атрибуты не зависят друг от друга). НФБК: всякий детерминант — потенциальный ключ.

Что значит «декомпозиция без потерь»?

Разбиение отношения на проекции, естественное соединение которых в точности восстанавливает исходное отношение — ни потери, ни появления ложных кортежей. По теореме Хита декомпозиция R(X, Y, Z) на (X, Y) и (X, Z) без потерь, если X → Y или X → Z. Также стремятся сохранить все функциональные зависимости.

Опишите проектирование БД методом «сущность–связь».

Инфологический этап: выделяются сущности с атрибутами и ключами, связи типов 1:1, 1:M, M:N — строится ER-диаграмма, независимая от СУБД. Даталогический этап: сущность → таблица, атрибут → столбец, 1:M → внешний ключ у стороны «многих», M:N → таблица-связка из внешних ключей. Далее проверка нормальных форм и физическое проектирование (индексы).

Тема 3.6

Физическая организация, защита и целостность

Хешированные и индексированные файлы, защита БД, транзакции.

Физическая организация данных

  • Последовательные файлы — записи подряд; поиск O(n), вставка в конец.
  • Хешированные файлы — адрес записи вычисляется хеш-функцией от ключа h(K); поиск по ключу O(1). Проблема — коллизии (разным ключам — один адрес): разрешаются цепочками переполнения или открытой адресацией. Диапазонный поиск неэффективен.
  • Индексированные файлы — отдельная структура «значение ключа → адрес записи». Индекс может быть плотным (на каждую запись) и неплотным (на блок); первичным и вторичным. Основная структура — B-дерево/B⁺-дерево: сбалансированное многоветвистое дерево, все листья на одной глубине, поиск/вставка O(log n), листья B⁺-дерева связаны списком — быстрый диапазонный поиск.
демоПоиск записи: полный перебор против индекса
Одна и та же таблица из 32 записей. Верхняя строка — поиск без индекса: читаем подряд, пока не наткнёмся. Нижняя — двоичный поиск по отсортированному индексу: прыжок в середину, отбрасываем половину, снова. На 32 записях это 5 сравнений против ~16; на миллионе — 20 против 500 000.
демоХеш-файл: раскладываем записи по корзинам
Адрес корзины = ключ mod 7. Запись падает сразу в свою корзину — поиск по ключу за одно обращение. Но когда два ключа дают один адрес (подсветка), возникает коллизия — запись уходит в цепочку переполнения, и поиск в этой корзине замедляется.
демоB-дерево: поиск и вставка с расщеплением
Ползунок подсвечивает путь поиска: любой ключ — за «высоту дерева» обращений. А кнопка вставки показывает, откуда берётся сбалансированность: добавляйте ключи, пока какой-нибудь лист не переполнится — он расщепится, медиана уйдёт вверх; переполнится корень — расщепится и он, и дерево подрастёт в высоту целиком, оставаясь идеально ровным. Именно поэтому B-дерево никогда не вырождается в список.
30 | 60 5 | 12 | 21 34 | 47 | 55 68 | 77 | 90 ключи < 30 · 30 ≤ ключи < 60 · ключи ≥ 60 все листья на одной глубине; в B⁺-дереве листья связаны списком для диапазонного поиска
B⁺-дерево — основа индексов реляционных СУБД.

Почему хватает 3–4 уровней. Узел B-дерева подгоняют под дисковый блок 8 Кбайт: помещается ~200 пар «ключ + ссылка».

1 уровень: 200 записей;  2 уровня: 200² = 40 000;  3 уровня: 200³ = 8·10⁶;  4 уровня: 1,6·10⁹

Таблица на миллиард строк — 4 чтения с диска до любой записи (а верхние уровни ещё и постоянно сидят в кэше — фактически 1–2 чтения). Двоичному дереву понадобилось бы log₂ 10⁹ ≈ 30 уровней-обращений: вся сила B-дерева — в «ширине» узла, согласованной с блоком диска.

Защита, целостность и сохранность БД

  • Защита: идентификация и аутентификация пользователей; привилегии GRANT/REVOKE на таблицы и операции; представления, скрывающие часть данных; шифрование; аудит.
  • Целостность — соответствие данных ограничениям предметной области: целостность сущностей (первичный ключ уникален и не NULL), ссылочная целостность (внешние ключи ссылаются на существующие записи; ON DELETE CASCADE/RESTRICT), ограничения CHECK, NOT NULL, UNIQUE, триггеры.
  • Сохранность — восстановление после сбоев: транзакции со свойствами ACID (атомарность, согласованность, изоляция, долговечность), журнал изменений (упреждающая запись), контрольные точки, резервное копирование.
демоТранзакция: перевод денег

Перевод 100 ₽ со счёта А на счёт Б — это два UPDATE. Если между ними выключат свет, без транзакций деньги «испарятся»: с А списано, на Б не зачислено. Транзакция делает пару операций неделимой: либо обе (COMMIT), либо ни одной (ROLLBACK — СУБД откатит по журналу). Попробуйте в демо нажать «сбой» в середине. А кнопка «второй клиент» показывает изоляцию: остановитесь между двумя UPDATE и прочитайте сумму на READ UNCOMMITTED — увидите несуществующие 700 ₽ (грязное чтение); на READ COMMITTED читатель видит только зафиксированные 800.

Изоляция параллельных транзакций. Без изоляции возникают аномалии: грязное чтение (видны незафиксированные чужие изменения), неповторяющееся чтение (два чтения одной строки дают разное — её успели изменить), фантомы (повторный запрос по условию возвращает новые строки). Стандарт SQL задаёт уровни изоляции — компромисс строгости и параллелизма:

УровеньГрязное чтениеНеповтор. чтениеФантомы
READ UNCOMMITTEDвозможновозможновозможно
READ COMMITTEDвозможновозможно
REPEATABLE READвозможно
SERIALIZABLE

Реализация — блокировки (чтения/записи, строк/таблиц; риск взаимоблокировок) или многоверсионность MVCC: читатели видят «снимок» данных и не блокируют писателей.

Как журнал спасает данные (WAL — упреждающая запись). Правило: сначала запись о изменении попадает в журнал на диске, и только потом меняются сами страницы данных. В журнале хранятся до-образ (старое значение) и после-образ (новое).

  1. Транзакция уменьшила счёт А на 100 ₽ → в журнал пишется «А: было 500, стало 400», затем COMMIT-отметка.
  2. 💥 Сбой питания до записи страницы данных на диск.
  3. Восстановление при старте: СУБД читает журнал. Транзакции с COMMIT-отметкой повторяются по после-образам (redo), незавершённые — откатываются по до-образам (undo).

Плюс периодические контрольные точки: все грязные страницы сбрасываются на диск, журнал усечается — восстановление начинается с последней контрольной точки, а не с начала времён. Резервные копии + журнал = восстановление на любой момент времени.

Вопросы к собеседованию

Как устроен хешированный файл? Что такое коллизии и как их разрешают?

Адрес записи вычисляется хеш-функцией от значения ключа — поиск по ключу почти O(1) без индекса. Коллизия — разные ключи дают один адрес; разрешение: цепочки (область переполнения со списками) или открытая адресация (поиск следующего свободного места). Недостатки: неэффективный диапазонный поиск и деградация при заполнении.

Почему индексы СУБД строят на B-деревьях (B⁺-деревьях)?

B-дерево — сбалансированное многоветвистое дерево: узел содержит десятки–сотни ключей и подгоняется под размер дискового блока, поэтому поиск требует лишь нескольких обращений к диску (O(log n) с большим основанием); все листья на одной глубине, дерево само балансируется при вставках. В B⁺-дереве данные в листьях, связанных списком, — эффективен и точечный, и диапазонный поиск.

Какими средствами обеспечивается целостность базы данных?

Целостность сущностей — PRIMARY KEY (уникальность, не NULL); ссылочная — FOREIGN KEY с правилами ON DELETE/UPDATE (RESTRICT, CASCADE, SET NULL); доменные ограничения — типы, NOT NULL, CHECK, UNIQUE; триггеры для сложных правил. Ограничения проверяет сама СУБД, а не приложение.

Что такое транзакция и свойства ACID?

Транзакция — неделимая последовательность операций, переводящая БД из одного согласованного состояния в другое (COMMIT/ROLLBACK). ACID: атомарность — всё или ничего; согласованность — ограничения не нарушаются; изоляция — параллельные транзакции не видят промежуточных состояний друг друга; долговечность — зафиксированные изменения переживают сбой (журнал с упреждающей записью, контрольные точки).

Как защищают базы данных от несанкционированного доступа?

Аутентификация пользователей СУБД; система привилегий GRANT/REVOKE на объекты и операции; представления и хранимые процедуры, скрывающие лишние данные; шифрование хранимых данных и соединений; аудит действий; резервное копирование как защита от потери. Дополняется мерами уровня ОС и сети.