- •Содержание
- •Лекция 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
Примеры определений базовых таблиц
Определим таблицы служащих (EMP), отделов (DEPT) и проектов (PRO). Эти таблицы имеют заголовки, показанные нарис. 16.1.
Столбцы EMP_NO, EMP_SAL, DEPT_NO, PRO_NO, DEPT_TOTAL_SAL, DEPT_MNG и PRO_MNG определяются на ранее определенных доменах (определения доменов EMP_NO и SALARY приведены в предыдущей лекции). Первичными ключами отношенийEMP,DEPTи проектовPROявляются столбцыEMP_NO,DEPT_NOиPRO_NOсоответственно. В таблицеEMPстолбцыDEPT_NOиPRO_NOявляются внешними ключами, указывающими на отдел, в котором работает служащий, и на выполняемый им проект соответственно. В таблицеDEPTвнешним ключом является столбецDEPT_NO, указывающий на служащего, являющегося руководителем соответствующего отдела, а в таблицеPROвнешним ключом является столбецPRO_MNG, указывающий на служащего, являющегося менеджером соответствующего проекта. Другие ограничения целостности мы обсудим позже.
![]()
101 Как можно видеть из приведенных объяснений, ссылочные действия служат тому, чтобы автоматически поддерживать ссылочную целостность при обновлениях таблиц, к строкам которых ведут ссылки. Довольно часто ссылочные действия, являющиеся частью определения внешнего ключа, называют декларативными триггерами.
Рис.
16.1. Заголовки
таблиц EMP, DEPT и
PRO
Определим таблицу EMP:
(1) CREATE TABLE EMP (
(2) EMP_NO EMP_NO PRIMARY KEY,
(3) EMP_NAME VARCHAR(20) DEFAULT 'Incognito' NOT NULL,
(4) EMP_BDATE DATE DEFAULT NULL CHECK (
VALUE >= DATE '1917-10-24'),
(5) EMP_SAL SALARY,
(6) DEPT_NO DEPT_NO DEFAULT NULL REFERENCES
DEPT ON DELETE SET NULL,
(7) PRO_NO PRO_NO DEFAULT NULL,
(8) FOREIGN KEY PRO_NO REFERENCES PRO (PRO_NO)
ON DELETE SET NULL,
(9) CONSTRAINT PRO_EMP_NO CHECK
((SELECT COUNT (*) FROM EMP E
WHERE E.PRO_NO = PRO_NO) <= 50));
Последовательно обсудим части этого определения. В части (1) указывается, что создается таблица с именем EMP. В части (2) определяется столбецEMP_NOна доменеEMP_NO. У этого столбца не определено значение по умолчанию, и он объявлен первичным ключом таблицы (это ограничение целостности добавляется черезANDк ограничениям, унаследованным столбцом от определения домена). Помимо прочего, это означает неявное указание запрета для данного столбца неопределенных значений. В части (3) определен столбецEMP_NAMEна базовом типе данных символьных строк переменной длины с максимальной длиной 20. Для столбца указано значение по умолчанию – строка'Incognito', и в качестве ограничения целостности запрещены неопределенные значения. В части (4) определяется столбецEMP_BDATE(дата рождения служащего). Он имеет тип данныхDATE, значением по умолчанию являетсяNULL(даты рождения некоторых служащих неизвестны). Кроме того, ограничение столбца запрещает принимать на работу лиц, о которых известно, что они родились до Октябрьского переворота. В части (5) определен столбецEMP_SALна доменеSALARY. Значение по умолчанию и ограничения целостности наследуются из определения домена. В части (6) столбецDEPT_NOопределяется на одноименном домене (для наших целей его определение несущественно), но явно объявляется, что значением по умолчанию этого столбца будетNULL(некоторые служащие не приписаны ни к какому отделу). Кроме того, добавляется ограничение внешнего ключа: столбецDEPT_NOссылается на первичный ключ таблицыDEPT. Определено ссылочное действие: при удалении строки из таблицыDEPTво всех строках таблицыEMP, ссылавшихся на эту строку, столбцуDEPT_NOдолжно быть присвоено неопределенное значение. В части (7) определяется столбецPRO_NO. Его определение аналогично определению столбцаDEPT_NO, но ограничение внешнего ключа вынесено в часть (8), где оно определяется в полной форме как табличное ограничение. Наконец, в части (9) определяется табличное проверочное ограничение с именемPRO_EMP_NO, которое требует, чтобы ни в одном проекте не участвовало больше 50 служащих (правила построения соответствующего условного выражения поясняются в лекции 18).
Определим таблицу DEPT:
(1) CREATE TABLE DEPT (
(2) DEPT_NO DEPT_NO PRIMARY KEY,
(3) DEPT_EMP_NO INTEGER NO NULL CHECK (
VALUE BETWEEN 1 AND 100),
(4) DEPT_NAME VARCHAR(200) DEFAULT 'Nameless' NOT NULL,
(5) DEPT_TOTAL_SAL SALARY DEFAULT 1000000.00
NO NULL CHECK (VALUE > = 100000.00),
(6) DEPT_MNG EMP_NO DEFAULT NULL
REFERENCES EMP ON DELETE SET NULL
CHECK (IF (VALUE IS NOT NULL) THEN
((SELECT COUNT(*) FROM DEPT
WHERE DEPT.DEPT_MNG = VALUE) = 1),
(7) CHECK (DEPT_EMP_NO =
(SELECT COUNT(*) FROM EMP
WHERE DEPT_NO = EMP.DEPT_NO)),
(8) CHECK (DEPT_TOTAL_SAL >=
(SELECT SUM(EMP_SAL) FROM EMP
WHERE DEPT_NO = EMP.DEPT_NO)));
Это определение мы обсудим в менее
систематической манере, чем предыдущее.
Отметим только наиболее интересные
моменты. В части (3) столбецDEPT_EMP_NO(число служащих в отделе) определен на
базовом типеINTEGERбез значения по умолчанию, с запретом
неопределенного значения и с проверочным
ограничением, устанавливающем допустимый
диапазон значений числа служащих в
отделе. Еще одно проверочное ограничение
этого столбца – (7) – вынесено на уровень
определения табличного ограничения.
Это ограничение устанавливает, что в
каждой строке таблицыDEPTзначение столбцаDEPT_EMP_NOдолжно равняться общему числу строк
таблицыEMP,
в которых значение столбцаDEPT_NOравно значению одноименного столбца
данной строки таблицыDEPT.102)В части (5) для определения столбцаDEPT_TOTAL_SAL(объем фонда заработной платы отдела)
используется доменSALARY103).
Но при этом явно установлено значение
столбца по умолчанию (отличное от
значения по умолчанию домена), запрещено
наличие неопределенных значений и
введено дополнительное проверочное
ограничение,![]()
102 Другими словами, это естественное ограничение требует, чтобы значения столбца DEPT_EMP_NO были «правильными», т.е. действительно соответствовали числу служащих, работающих в данном отделе.
103 По этой причине мы ввели в предыдущей лекции такую большую верхнюю границу – 20000000.00 – значений домена SALARY.
определяющее нижний порог объема фонда заработной платы отдела. Еще одно проверочное ограничение – (8) – вынесено на уровень определения табличного ограничения. Это ограничение устанавливает, что в каждой строке таблицыDEPTзначение столбцаDEPT_TOTAL_SALдолжно быть не меньше суммы значений столбцаEMP_SALво всех строках таблицыEMP, в которых значение столбцаDEPT_NOравно значению одноименного столбца данной строки таблицыDEPT.104)Обратите внимание на определение столбцаDEPT_MNG– часть (6). Этот столбец объявляется внешним ключом таблицыDEPT. Но мы хотим сказать больше. У отдела могут временно отсутствовать руководители, поэтому в столбце допускаются неопределенные значения. Но если у отдела имеется руководитель, то он должен являться руководителем только этого отдела. На первый взгляд можно было бы воспользоваться ограничением столбцаUNIQUE. Но такое ограничение допускало бы наличие неопределенного столбцаDEPT_MNGтолько в одной строке таблицыDEPT, а мы хотим допустить отсутствие руководителя у нескольких отделов. Поэтому потребовалось ввести более громоздкое проверочное ограничение столбца.
По поводу двух приведенных определений базовых таблиц у читателей могут возникнуть два вопроса:
(a) почему проверочное ограничение (9) в первом определении и проверочные ограничения (7) и (8) во втором определении вынесены из определений соответствующих столбцов, хотя формально являются именно ограничениями столбцов?
(b) почему ограничению (9) в первом определении присвоено явное имя, а ограничения (7) и (8) во втором определении оставлены безымянными?
На первый вопрос можно ответить следующим образом. Да, эти ограничения можно было бы включить в определения столбцов. Это дело вкуса. Но все три ограничения являются очень важными с точки зрения организации таблиц в целом. Поэтому лучше показывать их на уровне определения табличных ограничений.
Вот ответ на второй вопрос. Ограничение (9) в первом определении и ограничения (7) и (8) во втором определении внешне похожи, но сильно отличаются по своей сути. Ограничения (7) и (8) связаны с агрегатной семантикой столбцов DEPT_EMP_NOиDEPT_TOTAL_SALтаблицыDEPT. Отмена ограничений изменила бы смысл этих столбцов. Ограничение (9) является текущим административным ограничением. Если руководство предприятия примет решение разрешить использовать в одном проекте более 50 служащих, ограничение можно отменить без изменения смысла столбцов таблицыEMP. Имея это в виду, мы ввели явное имя ограничения (9), чтобы при необходимости имелась простая возможность отменить это ограничение с помощью оператораALTER TABLE.
Наконец, определим таблицу PRO.
(1) CREATE TABLE PRO (
(2) PRO_NO PRO_NO PRIMARY KEY,
(3) PRO_TITLE VARCHAR(200)DEFAULT 'No title' NOT NULL,
(4) PRO_SDATE DATE DEFAULT CURRENT_DATE NOT NULL,
(5) PRO_DURAT INTERVAL YEAR DEFAUL INTERVAL '1'
YEAR NOT NULL,
(6) PRO_MNG EMP_NO UNIQUE NOT NULL
REFERENCES EMP ON DELETE NO ACTION,
(7) PRO_DESC CLOB(10M));
![]()
104 Другими словами, это естественное ограничение требует, чтобы размер фонда заработной платы отдела никогда не был меньше суммарной зарплаты, получаемой служащими этого отдела.
Столбец PRO_SDATEсодержит дату начала проекта, а столбецPRO_DURAT– продолжительность проекта в годах. В этом определении имеет смысл прокомментировать часть (6). Мы считаем, что если отдел, по крайней мере временно, может существовать без руководителя, то у проекта всегда должен быть менеджер. Поэтому определение столбцаPRO_MNGявляется гораздо более строгим, чем определение столбцаDEPT_MNGв таблицеDEPT. Сочетание ограниченийUNIQUEиNOT NULLпри отсутствии значений по умолчанию приводит к абсолютной уникальности значений столбцаPRO_MNG. Другими словами, этот столбец обладает всеми характеристиками первичного ключа, хотя объявлен только как возможный ключ. Кроме того, он объявлен как внешний ключ с действием при удалении строки таблицыEMPс соответствующим значением первичного ключаNO ACTION, запрещающим такие удаления. В совокупности это гарантирует, что у любого проекта будет существовать менеджер, являющийся служащим предприятия. В части (5) столбецPRO_DESC(описание проекта) определен как большой символьный объект с максимальным размером 10 Мбайт.
