- •Содержание
- •Лекция 1. Эволюция устройств внешней памяти и программных систем управления данными
- •1.1. Введение
- •1.2. Устройства внешней памяти
- •1.3. Файловые системы
- •1.3.1. Структуры файлов
- •1.3.2. Логическая структура файловых систем и именование файлов
- •1.3.3. Авторизация доступа к файлам
- •1.3.4. Синхронизация многопользовательского доступа
- •1.3.5. Области разумного применения файлов
- •1.4. Потребности информационных систем
- •1.4.1. Структуры данных
- •1.4.2. Целостность данных
- •1.4.3. Языки запросов
- •1.4.4. Транзакции, журнализация и многопользовательский режим
- •1.4.5. Субд как независимый системный компонент
- •1.5. Заключение
- •Лекция 2. Понятие модели данных. Обзор разновидностей моделей данных
- •2.1. Введение
- •2.2. Модель данных
- •2.3. Ранние модели данных
- •2.3.1. Модель данных инвертированных таблиц
- •Структуры данных
- •Манипулирование данными
- •Ограничения целостности
- •2.3.2. Иерархическая модель данных
- •Иерархические структуры данных
- •Манипулирование данными
- •Ограничения целостности
- •2.3.3. Сетевая модель данных
- •Сетевые структуры данных
- •Манипулирование данными
- •Ограничения целостности
- •2.4. Неформальное введение в реляционную модель данных
- •2.4.1. Реляционные структуры данных
- •2.4.2. Манипулирование реляционными данными
- •2.4.3. Целостность в реляционной модели данных
- •2.5. Современные модели данных
- •2.5.1. Объектно-ориентированная модель данных
- •Типы и структуры данных объектной модели
- •Манипулирование данными в объектной модели
- •Ограничения целостности в объектной модели
- •2.5.2. Модель данных sql
- •Типы и структуры данных sql
- •Манипулирование данными в sql
- •Ограничения целостности в модели sql
- •2.5.3. Истинная реляционная модель
- •Типы и структуры данных истинной реляционной модели
- •Манипулирование данными в истинной реляционной модели
- •Ограничения целостности в истинной реляционной модели
- •2.6. Заключение
- •Лекция 3. Введение в реляционную модель данных
- •3.1. Введение
- •3.2. Основные понятия реляционных баз данных
- •3.2.1. Тип данных
- •3.2.2. Домен
- •3.2.3. Заголовок отношения, кортеж, тело отношения, значение отношения, переменная отношения
- •3.2.4. Первичный ключ и интуитивная интерпретация реляционных понятий
- •3.3. Фундаментальные свойства отношений
- •3.3.1. Отсутствие кортежей-дубликатов, первичный и возможные ключи отношений
- •3.3.2. Отсутствие упорядоченности кортежей
- •3.3.3. Отсутствие упорядоченности атрибутов
- •3.3.4. Атомарность значений атрибутов, первая нормальная форма отношения
- •3.4. Реляционная модель данных
- •3.4.1. Общая характеристика
- •3.4.2. Целостность сущности и ссылок
- •3.5. Заключение
- •Лекция 4. Базисные средства манипулирования реляционными данными: реляционная алгебра Кодда
- •4.1. Введение
- •4.2. Обзор реляционной алгебры Кодда
- •4.2.1. Общая интерпретация реляционных операций
- •4.2.2. Замкнутость реляционной алгебры и операция переименования
- •4.3. Особенности теоретико-множественных операций реляционной алгебры
- •4.3.1. Операции объединения, пересечения, взятия разности. Совместимость по объединению
- •4.3.2. Операция расширенного декартова произведения и совместимость отношений относительно этой операции
- •4.4. Специальные реляционные операции
- •4.4.1. Операция ограничения
- •4.4.2. Операция взятия проекции
- •4.4.3. Операция соединения отношений
- •4.4.4. Операция деления отношений
- •4.5. Заключение
- •Лекция 5. Базисные средства манипулирования реляционными данными: алгебра a Дейта и Дарвена
- •5.1. Введение
- •5.2. Базовые операции Алгебры a
- •5.2.1. Операция реляционного дополнения
- •5.2.2. Операция удаления атрибута
- •5.2.3. Операция переименования
- •5.2.4. Операция реляционной конъюнкции
- •5.2.5. Операция реляционной дизъюнкции
- •5.3. Полнота Алгебры a
- •5.3.1. Выводимость операции взятия разности
- •5.3.2. Интерпретация операции ограничения
- •5.3.3. Соединения общего вида
- •5.3.4. Реляционное деление
- •5.4. Избыточность Алгебры a
- •6.1. Введение
- •5.4.1. Реляционные аналоги штриха Шеффера и стрелки Пирса
- •5.4.2. Избыточность операции переименования
- •5.5. Заключение
- •Лекция 6. Базисные средства манипулирования реляционными данными: реляционное исчисление
- •6.2. Исчисление кортежей
- •6.2.1. Правильно построенные формулы
- •Простые условия
- •Кванторы, свободные и связанные переменные
- •6.2.2. Целевые списки и выражения реляционного исчисления
- •6.3. Исчисление доменов
- •6.3.1. Условия членства
- •6.3.2. Выражения исчисления доменов
- •6.4. Заключение
- •Лекция 7. Элементы теории реляционных баз данных: функциональные зависимости и декомпозиция без потерь
- •7.1. Введение
- •7.2. Функциональные зависимости
- •7.2.1. Общие определения
- •7.2.2. Замыкание множества функциональных зависимостей. Аксиомы Армстронга. Замыкание множества атрибутов
- •7.2.3. Минимальное покрытие множества функциональных зависимостей
- •7.3. Декомпозиция без потерь и функциональные зависимости
- •7.3.1. Корректные и некорректные декомпозиции отношений. Теорема Хита
- •7.3.2. Диаграммы функциональных зависимостей
- •7.4. Заключение
- •Лекция 8. Проектирование реляционных баз данных на основе принципов нормализации: первые шаги нормализации
- •8.1. Введение
- •8.2. Минимальные функциональные зависимости и вторая нормальная форма
- •8.2.1. Аномалии обновления, возникающие из-за наличия неминимальных функциональных зависимостей
- •8.2.2. Возможная декомпозиция
- •8.2.3. Вторая нормальная форма
- •8.3. Нетранзитивные функциональные зависимости и третья нормальная форма
- •8.3.1. Аномалии обновлений, возникающие из-за наличия транзитивных функциональных зависимостей
- •8.3.2. Возможная декомпозиция
- •8.3.3. Третья нормальная форма
- •8.3.4. Независимые проекции отношений. Теорема Риссанена
- •8.4. Перекрывающиеся возможные ключи и нормальная форма Бойса-Кодда
- •8.4.1. Аномалии обновлений, связанные с наличием перекрывающихся возможных ключей
- •8.4.2. Нормальная форма Бойса-Кодда
- •8.4.3. Всегда ли следует стремиться к bcnf?
- •8.5. Заключение
- •Лекция 9. Проектирование реляционных баз данных на основе принципов нормализации: дальнейшая нормализация
- •9.1. Введение
- •9.2. Многозначные зависимости и четвертая нормальная форма
- •9.2.1. Аномалии обновлений при наличии многозначных зависимостей и возможная декомпозиция
- •9.2.2. Многозначные зависимости. Теорема Фейджина. Четвертая нормальная форма
- •9.3. Зависимости проекции/соединения и пятая нормальная форма
- •9.3.2. Зависимость проекции/соединения
- •9.3.3. Аномалии, вызываемые наличием зависимости проекции/соединения
- •9.3.4. Устранение аномалий обновления в 3-декомпозиции
- •9.3.5. Пятая нормальная форма
- •9.4. Заключение
- •Лекция 10. Проектирование реляционных баз данных с использованием семантических моделей: er-диаграммы
- •10.1. Введение
- •10.1.1. Ограниченность реляционной модели при проектировании баз данных
- •10.1.2. Семантические модели данных
- •10.2. Семантическая модель Entity-Relationship (Сущность-Связь)
- •10.2.1. Основные понятия er-модели
- •10.2.2. Уникальные идентификаторы типов сущности
- •10.3. Нормальные формы er-диаграмм
- •10.3.1. Первая нормальная форма er-диаграммы
- •10.3.2. Вторая нормальная форма er-диаграммы
- •10.3.3. Третья нормальная форма er-диаграммы
- •10.4. Более сложные элементы er-модели
- •10.4.1. Наследование типов сущности и типов связи
- •10.4.2. Взаимно исключающие связи
- •10.5. Получение реляционной схемы из er-диаграммы
- •10.5.1. Базовые приемы
- •10.5.2. Представление в реляционной схеме супертипов и подтипов сущности
- •10.5.3. Представление в реляционной схеме взаимно исключающих связей
- •10.6. Заключение
- •Лекция 11. Проектирование реляционных баз данных с использованием семантических моделей: диаграммы классов языка uml
- •11.1. Введение
- •11.2. Основные понятия диаграмм классов uml
- •11.2.1. Классы, атрибуты, операции
- •11.2.2. Категории связей. Связь-зависимость
- •11.2.3. Связи-обобщения и механизм наследования классов в uml
- •11.2.4. Связи-ассоциации: роли, кратность, агрегация
- •11.3. Ограничения целостности и язык ocl
- •11.3.1. Общая характеристика языка ocl
- •11.3.2. Инвариант класса
- •Операции над значениями предопределенных типов данных
- •Операции над объектами
- •11.3.3. Операции над множествами, мультимножествами и последовательностями
- •Операция select
- •Операция collect
- •Операции exists, forAll, size
- •Операции union, intersect, symmetricDifference
- •11.3.4. Примеры инвариантов
- •11.3.5. Плюсы и минусы использования языка ocl при проектировании реляционных баз данных
- •11.4. Получение схемы реляционной базы данных из диаграммы классов uml
- •11.5. Заключение
- •Лекция 12. Пример общей организации субд. Физическое представление реляционных баз данных во внешней памяти. Индексные структуры
- •12.1. Введение
- •12.2. Основные понятия, цели и общая организация System r
- •12.2.1. Используемая терминология
- •12.2.2. Цели System r и их связь с общей организацией системы
- •12.2.3. Организация внешней памяти в базах данных System r
- •Страницы данных и идентификаторы кортежей
- •Индексы и кластеризация таблиц
- •12.2.4. Интерфейс rss
- •Операции сканирования таблиц и списков
- •Операции создания и уничтожения постоянных и временных объектов базы данных
- •Операции модификации таблиц и списков
- •Операция добавления поля к существующей таблице
- •Операции управления прохождением транзакций
- •Операция явной синхронизации
- •12.3. Общие принципы организации данных во внешней памяти в sql-ориентированных субд
- •12.3.1. Хранение таблиц
- •12.3.2. Индексы
- •Хэширование
- •12.3.3. Журнальная информация
- •12.3.4. Служебная информация
- •12.4. Заключение
- •Лекция 13. Методы управления транзакциями. Сихронизационные блокировки, временные метки и версии
- •13.1. Введение
- •13.2. Общее понятие транзакции и основные характеристики транзакций
- •13.2.1. Атомарность транзакций
- •13.2.2. Транзакции и целостность баз данных
- •13.2.3. Изолированность транзакций
- •Отсутствие потерянных изменений (первый уровень изолированности)
- •Отсутствие чтения «грязных» данных (второй уровень изолированности)
- •Отсутствие неповторяющихся чтений (третий уровень изоляции)
- •Проблема фантомов
- •13.2.4. Сериализация транзакций
- •13.3. Методы сериализации транзакций
- •13.3.1. Синхронизационные блокировки
- •Гранулированные синхронизационные блокировки
- •Предикатные синхронизационные блокировки
- •13.3.2. Синхронизационные тупики, их распознавание и разрушение
- •Обнаружение тупиковых ситуаций
- •Разрушение тупиков
- •13.3.3. Метод временных меток
- •13.3.4. Методы сериализации транзакций на основе поддержки версий объектов базы данных
- •Версионный вариант алгоритма временных меток
- •Версионный вариант двухфазного протокола синхронизационных блокировок
- •Версионно-блокировочный протокол сериализации транзакций для поддержки только читающих транзакций
- •13.4. Заключение
- •Лекция 14. Средства журнализации и восстановления баз данных
- •14.1. Введение
- •14.2. Буферизация блоков базы данных в основной памяти и ее связь с журнализацией
- •14.2.1. Управление буферным пулом базы данных
- •14.2.2. Физическая синхронизация
- •14.2.3. Протокол упреждающей записи в журнал и его связь с буферизацией
- •14.3. Индивидуальный откат транзакции
- •14.4. Восстановление после мягкого сбоя
- •14.4.1. Схема восстановления от точки физической согласованности
- •14.4.2. Восстановление физической согласованности базы данных
- •Теневой механизм
- •Журнализация постраничных изменений
- •14.5. Восстановление базы данных после жесткого сбоя
- •14.6. Заключение
- •Лекция 15. Общее введение в sql, типы данных и средства определения доменов
- •15.1. Введение
- •15.1.1. Краткая история языка sql
- •15.1.2. Структура языка sql
- •15.2. Типы данных sql
- •15.2.1. Tочные числовые типы
- •Истинно целые типы
- •Точные типы, допускающие наличие дробной части
- •15.2.2. Приближенные числовые типы
- •15.2.3. Типы символьных строк
- •15.2.4. Типы битовых строк
- •15.2.5. Типы даты и времени
- •Тип даты
- •Типы времени
- •Типы временной метки
- •Типы времени и временной метки с временной зоной
- •Типы временных интервалов
- •15.2.6. Булевский тип
- •15.2.7. Типы коллекций
- •Типы массивов
- •Типы мультимножеств
- •15.2.8. Анонимные строчные типы
- •15.2.9. Типы, определяемые пользователем
- •15.2.10. Ссылочные типы
- •15.3. Средства определения, изменения определения и отмены определения доменов
- •15.3.1. Определение домена
- •15.3.2. Примеры определений доменов
- •15.3.3. Изменение определения домена
- •15.3.4. Примеры изменения определения домена
- •15.3.5. Отмена определения домена
- •15.4. Неявные и явные преобразования типа или домена
- •15.4.1. Неявные преобразования типов в sql
- •15.4.2. Явные преобразования типов или доменов и оператор cast
- •15.5. Заключение
- •Лекция 16. Средства определения базовых таблиц и ограничений целостности
- •16.1. Введение
- •16.2. Средства определения, изменения и ликвидации базовых таблиц
- •16.2.1. Определение базовой таблицы
- •Определение столбца
- •Значения столбца по умолчанию
- •Ограничения целостности столбца
- •16.2.2. Определение табличного ограничения
- •Табличное ограничение первичного или возможного ключа
- •Проверочное табличное ограничение
- •Табличное ограничение внешнего ключа
- •Разновидности способов сопоставления значений внешнего и возможного ключей
- •Поддержка ссылочной целостности и ссылочные действия
- •Примеры определений базовых таблиц
- •Изменение определения базовой таблицы
- •Добавление, изменение или удаление определения столбца
- •Примеры изменения определения столбца
- •Изменение набора табличных ограничений
- •Примеры изменения набора табличных ограничений
- •Отмена определения (уничтожение) базовой таблицы
- •16.3. Средства определения и отмены общих ограничений целостности
- •16.3.1. Определение общих ограничений целостности
- •16.3.2. Отмена определения общего ограничения целостности
- •16.3.3. Немедленная и откладываемая проверка ограничений
- •16.4. Заключение
- •Лекция 17. Общая характеристика оператора select и организация списка ссылок на таблицы в разделе from
- •17.1. Введение
- •17.2. Скалярные выражения
- •17.2.1. Общие синтаксические правила построения скалярных выражений
- •17.2.2. Численные выражения
- •17.2.3. Выражения, значениями которых являются символьные или битовые строки
- •17.2.4. Выражения даты-времени
- •17.2.5. Булевские выражения
- •17.2.6. Выражения с переключателем
- •17.3. Общая структура оператора выборки в языке sql
- •17.3.1. Семантика оператора выборки
- •17.3.2. Ссылки на таблицы раздела from
- •17.3.3. Табличное выражение, спецификация запроса и выражение запросов
- •17.3.4. Раздел with выражения запросов
- •17.3.5. Конструкторы значения строки и таблицы
- •17.3.6. Ссылки на базовые, представляемые и порождаемые таблицы
- •17.3.7. Представляемые таблицы, или представления (view)
- •17.4. Заключение
- •Лекция 18. Предикаты раздела where оператора select
- •18.1. Введение
- •18.2. Логические выражения раздела where
- •18.2.1. Предикат сравнения
- •Примеры запросов с использованием предиката сравнения
- •18.2.2. Предикат between
- •Примеры запросов с использованием предиката between
- •18.2.3. Предикат is null
- •Примеры запросов с использованием предиката null
- •18.2.4. Предикат in
- •Примеры запросов с использованием предиката in
- •18.2.5. Предикат like
- •Примеры запросов с использованием предиката like
- •18.2.6. Предикат similar
- •Примеры запросов с использованием предиката similar
- •18.2.7. Предикат exists
- •Примеры запросов с использованием предиката exists
- •18.2.8. Предикат unique
- •Примеры запросов с использованием предиката unique
- •18.2.9. Предикат overlaps
- •Примеры запросов с использованием предиката overlaps
- •18.2.10. Предикат сравнения с квантором
- •Примеры запросов с использованием предиката сравнения с квантором
- •18.2.11. Предикат match
- •Примеры запросов с использованием предиката match
- •18.2.12. Предикат is distinct
- •Примеры запросов с использованием предиката distinct
- •18.3. Заключение
- •Лекция 19. Группировка и условия раздела having, порождаемые и соединенные таблицы
- •19.1. Введение
- •19.1.1. Внешние соединения
- •19.2. Агрегатные функции, группировка и условия раздела having
- •19.2.1. Семантика агрегатных функций
- •19.2.2. Результаты запросов и агрегатные функции
- •19.2.3. Логические выражения раздела having
- •Предикаты сравнения
- •Предикат between
- •Предикат null
- •Предикат in
- •Предикат like
- •Предикат exists
- •Предикат unique
- •Предикаты сравнения с квантором
- •Предикат distinct
- •19.3. Ссылки на порождаемые таблицы в разделе from
- •19.3.1. Еще один способ формулировки запросов
- •19.3.2. Случаи, в которых без порождаемых таблиц обойтись невозможно
- •19.4. Более сложные конструкции оператора выборки
- •19.4.1. Соединенные таблицы
- •Формальные определения
- •Примеры соединений разного вида
- •Примеры запросов с использованием соединенных таблиц
- •19.4.2. Порождаемые таблицы с горизонтальной связью (lateral_derived_table)
- •19.5. Заключение
- •Лекция 20. Средства формулировки аналитических и рекурсивных запросов
- •20.1. Введение
- •20.2. Возможности формулирования аналитических запросов
- •20.2.1. Раздел group by rollup
- •20.2.2. Агрегатная функция grouping
- •20.2.3. Раздел group by cube
- •20.3. Рекурсивные запросы
- •20.3.1. Определения, относящиеся к рекурсии
- •20.3.2. Рекурсивные запросы с разделом with
- •Раздел search
- •Раздел cyrcle
- •20.3.3. Рекурсивные представления
- •20.4. Заключение
- •Лекция 21. Средства манипулирования данными
- •21.1. Введение
- •21.2. Базовые средства манипулирования данными
- •21.2.1. Оператор insert для вставки строк в существующие таблицы
- •Вставка всех строк указанной таблицы
- •Вставка явно заданного набора строк
- •Вставка строк результата запроса
- •21.2.2. Оператор update для модификации существующих строк в существующих таблицах
- •21.2.3. Оператор delete для удаления строк в существующих таблицах
- •21.3. Представления, над которыми возможны операции обновления
- •21.3.1. Представления, допускающие применение операций обновления, в стандарте sql/92
- •21.3.2. Представления, допускающие применение операций обновления, в стандарте sql:1999
- •Критерии применимости операций обновления
- •Правила функциональных зависимостей
- •21.3.3. Раздел with check option определения представления
- •Режимы проверки cascaded и local
- •Примеры результатов действия раздела with check option
- •21.3.4. Исторический очерк
- •21.4. Операции обновления баз данных и механизм триггеров
- •21.4.1. Понятие триггера в sql:1999
- •21.4.2. Синтаксис определения триггеров и типы триггеров
- •Триггеры before и after
- •Триггеры insert, update и delete
- •Триггеры row и statement
- •Раздел when
- •Тело триггера
- •21.4.3. Выполнение триггеров
- •Возможности использования старых и новых значений
- •Обработка нескольких триггеров, связанных с одной предметной таблицей
- •21.4.4. Триггеры и ссылочные действия
- •21.5. Заключение
- •Лекция 22. Средства языка sql для обеспечения авторизации доступа к данным, управления транзакциями, сессиями и подключениями
- •22.1. Введение
- •22.2. Поддержка авторизации доступа к данным в языке sql
- •22.2.1. Пользователи и роли
- •22.2.2. Применение идентификаторов пользователей и имен ролей
- •22.2.3. Создание и ликвидация ролей
- •22.2.4. Передача привилегий и ролей
- •Передача привилегий
- •Привилегии и представления
- •Передача ролей
- •22.2.5. Изменение текущих идентификаторов пользователей и имен ролей
- •Оператор set session authorization
- •Оператор set role
- •22.2.6. Аннулирование привилегий и ролей
- •Аннулирование привилегий
- •Аннулирование ролей
- •22.3. Управление транзакциями в sql
- •22.3.1. Acid-транзакция
- •22.3.2. Порождение транзакций в sql:1999
- •Установка характеристик транзакции
- •Явная инициация транзакции
- •22.3.3. Уровни изоляции sql-транзакции
- •Феномен «грязного» чтения (dirty read)
- •Феномен неповторяемого чтения (unrepeatable read)
- •Феномен фантомов
- •22.3.4. Завершение транзакций
- •22.3.5. Транзакции и ограничения целостности
- •22.3.6. Точки сохранения
- •22.4. Подключения и сессии
- •22.4.1. Установление соединений
- •22.4.2. Операторы sql для управления соединениями
- •Оператор connect
- •Оператор set connection
- •Оператор disconnect
- •22.5. Заключение
- •Лекция 23. Объектные расширения
- •23.1. Введение
- •23.1.1. Истоки и краткая история объектно-реляционных баз данных
- •Первые орсубд
- •Внедрение объектных расширений в основные рсубд
- •23.1.2. Объектная модель sql
- •23.1.3. Цели лекции
- •23.2. Определяемые пользователями типы
- •23.2.1. Индивидуальные типы
- •23.2.2. Определение структурных типов
- •Определение атрибута структурного udt
- •Раздел спецификации ссылочного типа
- •Разделы спецификации функций явного преобразования типов
- •Раздел объявления сигнатур методов
- •23.3. Типизированные таблицы
- •23.3.1. Определение типизированной таблицы
- •Подтаблицы и супертаблицы
- •Определение элементов типизированной таблицы
- •23.3.2. Ссылочные значения и ref-типы
- •Механизмы генерации ссылочных значений
- •Преобразование задаваемых пользователем ссылочных значений к ссылочному типу
- •Спецификация ссылочного типа при объявлении столбцов и атрибутов
- •Поддержка согласованности ссылок
- •23.3.3. Выборка данных из типизированных таблиц
- •23.3.4. Типизированные представления
- •23.4. Заключение
- •Рекомендуемая литература
- •1. Книги на русском языке:
- •2. Классические статьи в русских переводах.
- •3. Неклассические статьи и другие материалы, доступные в Internet
- •4. Лучшие (в основном, не переведенные на русский язык) книги про sql, модель данных odmg и «истинную» реляционную модель
- •5. Статьи про System r, доступные в Internet
Отмена определения (уничтожение) базовой таблицы
Для отмены определения (уничтожения) базовой таблицы служит оператор DROP TABLE, задаваемый в следующем синтаксисе:
DROP TABLE base_table_name { RESTRICT | CADCADE }
Успешное выполнение оператора приводит к тому, что указанная базовая таблица перестает существовать. Уничтожаются все ее строки, определения столбцов и табличные определения целостности. При наличии спецификацииRESTRICTвыполнение оператораDROP TABLEотвергается, если имя таблицы используется в каком-либо определении представления или ограничения целостности108). При наличии спецификацииCASCADEоператор выполняется в любом случае, и все определения представлений и ограничений целостности, содержащие ссылки на данную таблицу, также отменяются.
![]()
107 Не следует расценивать эти рассуждения как руководство к действию. Мы привели их только для того, чтобы обосновать пример, хотя рассуждения, конечно, не лишены смысла.
108 Не считая те ограничения целостности, которые (a) определены в составе определения данной базовой таблицы и (b) не ссылаются на какие-либо другие базовые таблицы.
16.3. Средства определения и отмены общих ограничений целостности
Виды ограничений целостности, с которыми мы имели дело в предыдущих разделах этой лекции, образуют иерархию (рис. 16.2).
Рис.
16.2.Иерархия видов ограничений
целостности
Ограничения целостности, входящие в определение домена, наследуются всеми столбцами, определенными на этих доменах, и являются ограничениями этих столбцов. Кроме того, в определение столбца могут входить определения дополнительных ограничений. Ограничения целостности, входящие в определение столбца (включая ограничения, унаследованные из определения домена), являются ограничениями таблицы, в состав определения которой входит определение данного столбца. Кроме того, в определение таблицы могут входить определения дополнительных ограничений.
Но иерархия видов ограничений целостности этим не исчерпывается. Ограничения целостности, входящие в определение таблицы (включая явные и унаследованные от определения доменов ограничения столбцов), представляют собой ограничения базы данных, частью которой является данная таблица. Кроме того, могут определяться дополнительные ограничения базы данных. В стандарте SQL такие дополнительные ограничения базы данных называются ASSERTION, а мы их будем называтьобщими ограничениями целостности.
16.3.1. Определение общих ограничений целостности
Для определения общего ограничения целостности служит оператор CREATE ASSERTION, задаваемый в следующем синтаксисе:
CREATE ASSERTION constraint_name
CHECK (conditional_expression)
Заметим, что при создании общего ограничения целостности его имя всегда должно указываться явно. Хотя синтаксис определения общего ограничения совпадает с синтаксисом определений ограничений столбца и таблицы, в данном случае допускаются только специальные виды условных выражений. Мы не можем сейчас точно сформулировать свойства этих видов условий, поскольку отложили подробное рассмотрение разновидностей условных выражений до следующих лекций. Если говорить неформально, то особые свойства условий связаны с тем, что при определении общих ограничений целостности контекстом, в котором вычисляется условное выражение, является весь набор таблиц базы данных, а не набор строк таблицы, как это было при определении табличных ограничений. Продемонстрируем и прокомментируем несколько примеров определений общих ограничений целостности.
В определении таблицы EMPсодержалось ограничение столбцаEMP_BDATE:
CHECK (EMP_BDATE >= '1917-10-24')
(к работе на предприятии допускаются только те лица, которые родились после Октябрьского переворота). Вот каким образом можно определить такое же ограничение на уровне общих ограничений целостности:
CREATE ASSERTION MIN_EMP_BDATE CHECK
((SELECT MIN(EMP_BDATE)) FROM EMP) >= '1917-10-24')
В логическом условии этого общего ограничения выбирается минимальное значение столбца EMP_BDATE(дата рождения самого старого служащего). Значением условного выражения будетfalseв том и только в том случае, если среди служащих имеется хотя бы один, родившийся до указанной даты.
Теперь переформулируем в виде общего ограничения целостности ограничение таблицы EMP PRO_EMP_NO, которое определялось следующим образом:
CONSTRAINT PRO_EMP_NO CHECK
((SELECT COUNT (*) FROM EMP E
WHERE E.PRO_NO = PRO_NO) <= 50)
(над одним проектом не может работать более 50 служащих).
Вот формулировка эквивалентного общего ограничения целостности:
CREATE ASSERTION NEW_PRO_EMP_NO CHECK
( NOT EXISTS (SELECT PRO_NO FROM EMP GROUP BY PRO_NO
HAVING COUNT* > 50)).
Логическое выражение этого ограничения может принимать только значения trueиfalse. Внутренний оператор выборки группирует строки таблицыEMPтаким образом, что в одну группу попадают все строки с одинаковым значением столбцаPRO_NO. Затем эти группы фильтруются по условию разделаHAVING, и остаются только группы, включающие более 50 строк. В результирующей таблице содержатся строки из одного столбца, содержащего значениеPRO_NOоставшихся групп. ПредикатNOT EXISTSпринимает значениеtrueтогда и только тогда, когда эта результирующая таблица не содержит ни одной строки, т. е. нет ни одного проекта, в котором работает больше 50 служащих.
Покажем, как можно сформулировать в виде общего ограничения целостности ограничение внешнего ключа. Например, приведем такую эквивалентную формулировку для определения внешнего ключа PRO_NO, входящего в состав определения таблицыEMP:
FOREIGN KEY PRO_NO REFERENCES PRO (PRO_NO)
В виде общего ограничения целостности это может выглядеть следующим образом:
(1) CREATE ASSERTION FK_PRO_NO CHECK
(2) ( NOT EXISTS (SELECT * FROM EMP
WHERE PRO_NO IS NOT NULL AND
(3) NOT EXISTS (SELECT * FROM PRO
(4) WHERE PRO.PRO_NO = EMP.PRO_NO))).
Логическое выражение этого ограничения выглядит достаточно сложным и нуждается в пояснении. Условие выборки оператора SELECTна строке (2) состоит из двух частей, связанных черезAND. Первая часть отфильтровывает те строки таблицыEMP, у которых в столбцеPRO_NOсодержитсяNULL. Если этот столбец содержитNULLво всех строках таблицы, то результирующая таблица оператора выборки на строке (2) будет пустой, и значением предикатаNOT EXISTSбудетtrue, т. е. ограничение удовлетворяется.
Теперь предположим, что в таблицеEMPнашлась строкаemp, в столбцеPRO_NOкоторой содержится значение, отличное отNULL. Назовем это значениеcand_pro_no. Для него вычисляется вторая часть условия выборки оператораSELECTна строке (2). Оператор выборки на строке (3) выбирает все строки таблицыPRO, значение столбцаPRO_NOкоторых равняетсяcand_pro_no. Если для данного значенияcand_pro_noнашлась хотя бы одна такая строка, то результирующая таблица оператора выборки на строке (3) будет непустой, и значением предикатаNOT EXISTSна строке (3) будетfalse. Соответственно, все условие выборки первого оператораSELECTпримет значениеfalse, и строка со значениемcand_pro_noв столбцеPRO_NOбудет отфильтрована.109)
Если же найдется хотя бы одна строка таблицы EMPс таким значениемcand_pro_noстолбцаPRO_NO, что в таблицеPROне найдется ни одной строки, значение столбцаPRO_NOкоторой равнялось бы этомуcand_pro_no, то результирующая таблица оператора выборки на строке (3) будет пустой, и значением предикатаNOT EXISTSна строке (3) будетtrue. Тогда все условие выборки первого оператораSELECTпримет значениеtrue, и эта строка таблицыEMPбудет пропущена в результирующую таблицу. Значением предикатаNOT EXISTSбудетfalse, т. е. ограничение не удовлетворяется.
Мы сознательно привели такое подробное пояснение не только для того, чтобы прояснить смысл условного выражения общего ограничения целостности FK_PRO_NO, но и чтобы дать понять, во что реально вырождается простая синтаксическая конструкция определения внешнего ключа. Как показывает опыт, многие начинающие проектировщики SQL-ориентированных баз данных думают, что ссылочные ограничения так же легко поддерживать, как определять.
Наконец, сформулируем общее ограничение целостности, состоящее в том, что никакой менеджер проекта не должен иметь суммарный общий доход, больший суммарного дохода руководителя отдела, в котором работает этот менеджер.
(1) CREATE ASSERTION PRO_MNG_CONSTR CHECK
(2) NOT EXISTS (SELECT * FROM EMP EMP1, EMP EMP2,
DEPT, PRO WHERE
(3) EMP1.EMP_NO = PRO.PRO_MNG AND
(4) EMP1.DEPT_NO = DEPT.DEPT_NO AND
(5) DEPT.DEPT_MNG = EMP2.EMP_NO AND
(6) EMP1.EMP_SAL + COALESCE (EMP1.EMP_BONUS,0) >
(7) EMP2.EMP_SAL + COALESCE (EMP2.EMP_BONUS,0);
![]()
109 Это означает, что cand_pro_no является допустимым значением внешнего ключа.
В логическом выражении этого ограничения используется оператор выборки SELECT, в разделе перечня таблиц (FROM) впервые в этом курсе используется несколько таблиц. Такие запросы в SQL называются запросами с соединениями, и мы воспользуемся случаем, чтобы пояснить на примере (конечно, предварительно), как их следует понимать в соответствии со стандартом языка SQL.
Итак, в разделе FROMоператора выборки, используемого в логическом условии этого ограничения, через запятую перечислены четыре элемента –EMP EMP1,EMP EMP2,DEPTиPRO. Выражение видаEMP ANOTHER_NAMEозначает применение своего рода операции переименования. Внутри запроса столбцы этого «экземпляра»EMPимеют «квалифицированные» имена видаANOTHER_NAME.column_name, гдеcolumn_nameобозначает имя существующего столбца таблицыEMP.
Вычисление оператора выборки начинается с того, что формируется расширенное декартово произведение всех таблиц, указанных в разделеFROM. В данном случае схема результирующей таблицы разделаFROMбудет содержать следующие имена столбцов:EMP1.EMP_NO,EMP1.EMP_NAME,EMP1. EMP_BDATE, EMP1. EMP_SAL, EMP1.EMP_BONUS, EMP1. DEPT_NO, EMP1. PRO_NO, EMP2.EMP_NO, EMP2.EMP_NAME, EMP2. EMP_BDATE, EMP2. EMP_SAL, EMP2.EMP_BONUS, EMP2. DEPT_NO, EMP2. PRO_NO, DEPT.DEPT_NO, DEPT.DEPT_EMP_NO, DEPT.DEPT_TOTAL_SAL, DEPT.DEPT_MNG, PRO.PRO_NO, PRO.PRO_TITLE, PRO.PRO_SDATE, PRO.PRO_DURAT, PRO.PRO_MNG, PRO_DESC. Для удобства назовем эту «широкую» таблицуALL_TOGETHER.110)
Условие раздела WHEREсостоит из четырех частей, связанных черезAND. Обсудим их последовательно. После проверки условияEMP1.EMP_NO = PRO.PRO_MNGв таблицеALL_TOGETHERостанутся все служащие-менеджеры проектов вместе со своими проектами в комбинации со всеми возможными отделами и всеми возможными служащими (назовем эту отфильтрованную таблицуALL_TOGETHER_STEP1). После проверки условияEMP1.DEPT_NO = DEPT.DEPT_NOв таблицеALL_TOGETHER_STEP1останутся все служащие-менеджеры проектов вместе со своими проектами и вместе с описанием своих отделов в комбинации со всеми возможными служащими (назовем эту отфильтрованную таблицуALL_TOGETHER_STEP2). После проверки условияDEPT.DEPT_MNG = EMP2.EMP_NOв таблицеALL_TOGETHER_STEP2останутся все служащие-менеджеры проектов вместе со своими проектами, вместе с описанием своих отделов и вместе с руководителями этих отделов (по одной строке для каждого допустимого сочетания «проект-менеджер_проекта-отдел_менеджера_проекта-руководитель_отдела_менеджера_проекта»). Назовем эту отфильтрованную таблицуALL_TOGETHER_STEP3. Легко видеть, что после проверки условияEMP1.EMP_SAL + EMP1.EMP_BONUS > EMP2.EMP_SAL + EMP2.EMP_BONUSв таблицеALL_TOGETHER_STEP3могут остаться только строкипроект-менеджер_проекта-отдел_менеджера_проекта-руководитель_отдела_менеджера_проекта, в которых суммарный доход менеджера проекта превышает суммарный доход руководителя отдела, где работает менеджер проекта. Если хотя бы одна такая строка существует, то результат оператора выборки будет непустым, значением предикатаNOT EXISTSбудетfalse, и тем самым ограничение целостностиPRO_MNG_CONSTRбудет нарушено.
![]()
110 Не следует воспринимать этот и следующие абзацы как описание того, как на самом деле выполняются подобные запросы в SQL-серверах. Это наиболее прямолинейный и малоэффективный способ выполнения запроса (хотя, в принципе, его можно применять и на практике). Мы выбрали этот способ описания, поскольку он максимально соответствует подходу к описанию семантики языка SQL, применяемому в стандарте языка. Кстати, основным отличием более практичных способов выполнения запросов с соединением является стремление к тому, чтобы избежать явного декартова произведения.
