- •Установочный модуль
- •Введение
- •Модуль 1
- •Реляционная алгебра
- •Отсутствующие данные
- •Пустые значения
- •Неопределенные значения
- •Интерпретации
- •Правила вычисления выражений
- •Следствия
- •Проверка условий
- •Реляционные объекты данных
- •Формальные определения
- •Домены и атрибуты
- •Схема отношения
- •Именованное значение атрибута
- •Кортеж
- •Отношение
- •Схема базы данных
- •База данных
- •Операции реляционной алгебры
- •Унарные операции
- •Бинарные операции
- •Варианты операции соединения
- •Производные операции
- •Пример построения выражения реляционной алгебры
- •Понятие базовых и виртуальных отношений
- •Понятие полноты реляционной алгебры
- •Формирование запросов на языке SQL
- •Металингвистические символы
- •Реализация операций реляционной алгебры
- •Пример использования подзапросов
- •Группирующие запросы
- •Упорядочение результатов
- •Вопросы для самоконтроля
- •Упражнения
- •Построение выражений реляционной алгебры
- •Модуль 2
- •Базовые и виртуальные отношения
- •Типы данных
- •Базовые типы данных
- •Типы данных, определяемые пользователем
- •Первичные и кандидатные ключи
- •Создание базовых отношений
- •Индексы
- •Модификация базовых отношений
- •Вставка строк
- •Обновление строк
- •Удаление строк
- •Целостность
- •Декларативная поддержка
- •Пример декларативной поддержки целостности
- •Транзакции и блокировки
- •Триггеры
- •Виртуальные отношения
- •Вопросы для самоконтроля
- •Упражнения
- •Декларативная поддержка целостности
- •Модуль 3
- •Нормальные формы
- •Функциональные зависимости (ФЗ)
- •Правила вывода Армстронга
- •Производные правила вывода
- •Независимость правил Армстронга
- •Полнота системы правил Армстронга
- •Нормальные формы
- •Первая нормальная форма (1NF)
- •Вторая нормальная форма (2NF)
- •Третья нормальная форма (3NF)
- •Нормальная форма Бойса-Кодда (Boyce, Codd; NFBC)
- •Пример построения нормализованных схем отношений
- •Вопросы для самоконтроля
- •Модуль 4
- •Проектирование схем баз данных
- •Уровни логической модели
- •Миграция ключей и виды связей
- •Классификация кластеров
- •Иерархическая рекурсия
- •Абстрактная схема
- •Обобщения
- •Пример реализации иерархической рекурсии
- •Сетевая рекурсия
- •Абстрактная схема
- •Сетевая реализация иерархической рекурсии
- •Обобщения
- •Пример реализации сетевой рекурсии
- •Ассоциация
- •Детализация связей многие-ко-многим
- •Обобщения
- •Пример реализации ассоциации
- •Обобщение
- •Абстрактная схема
- •Пример реализации обобщения
- •Композиция
- •Абстрактная схема
- •Пример реализации композиции
- •Агрегация
- •Абстрактная схема
- •Пример реализации агрегации
- •Унификация атрибутов
- •Вопросы для самоконтроля
- •Упражнения
- •Иерархическая рекурсия
- •Сетевая рекурсия
- •Ассоциация
- •Обобщение
- •Композиция
- •Агрегация
- •Дополнительные главы
- •Технологии баз данных
- •Информационные системы
- •Жизненный цикл ИС
- •СУБД и БД
- •Жизненный цикл БД и средства проектирования
- •Модели данных
- •Иерархическая модель данных
- •Сетевая модель данных
- •Реляционная модель данных
- •Постреляционная модель данных
- •Объектно-ориентированные модели данных
- •XML как модель данных
- •Многомерная модель данных (OLAP)
- •Основные функции СУБД
- •Управление данными во внешней памяти
- •Управление буферами оперативной памяти
- •Управление транзакциями
- •Журнализация и восстановление БД после сбоев
- •Поддержка языков баз данных
- •Типовая организация СУБД
- •Модели взаимодействия с БД
- •Модель с централизованной архитектурой
- •Модель с автономными персональными компьютерами
- •Архитектура «файл-сервер»
- •Архитектура «клиент-сервер»
- •Архитектура «клиент-сервер» трехзвенная
- •Распределенные базы данных
- •Технология тиражирования данных
- •Понятие «фрактал»
- •Геометрические фракталы
- •Алгебраические фракталы
- •Стохастические фракталы
- •Системы итерируемых функций
- •Вопросы для самоконтроля
- •Литература
- •Список иллюстраций
- •Список таблиц
2.3.3. Следствия
К каким следствиям приводят правила? Следствием является нарушение привычных законов вычислений. В частности, для операций арифметических, логических, строковых и сравнения имеем при null-значении операнда x следующую табл. 2.3.
Таблица 2.3.: Примеры значений выражений при null-значении операнда x
Операции |
Выражение |
Значение |
|
арифметические |
x 0 |
null |
|
|
x x |
|
|
логические |
x or not x |
null |
|
строковые |
0Иванов0+0 0 + x |
null |
|
|
x < x |
|
|
сравнения |
x = x |
null |
|
x 6= x |
|||
|
|
||
|
x > x |
|
|
|
|
|
Следовательно, число нуль уже не является поглощающим элементов для операции умножения, закон исключенного третьего уже не имеет места, отношение равенства не рефлексивно и нельзя сказать, равно или нет null-значение самому себе.
Таким образом, null-значение не является значением в обычном смысле этого слова и непосредственное сравнение выражения с null-значением невозможно, так как при любых значениях операнда x в результате сравнения x = null будет получено null-значение.
Как проверить значение переменной или выражения на null-значение? Следует использовать специальный встроенный предикат IsNull(выражение) – «есть null». Предикат возвращает значение false или true (но не null) и может применяться к выражению любого типа (примеры приведены в табл. 2.4).
Таблица 2.4.: Примеры значений предиката IsNull
IsNull(Выражение) |
Значение |
IsNull(0) |
false |
IsNull(x+0abc0 + null) |
true |
IsNull(2 null) |
true |
Ясно, что применительно к пустым значениям предикат IsNull всегда возвращает значение false.
2.3.4. Проверка условий
Как null-значения влияют на проверку условий в условных операторах и операторах цикла? В контексте возможных логических значений false, null и true null-значение имеет смысл как бы третьего логического значения, и потому на него часто ссылаются как на значение unknown – «неизвестный».
Однако в СУБД реализуется двухзначная логика. Поэтому неопределенное условие, то есть условие с результирующим null-значением, должно быть проинтерпретировано либо как false, либо как true.
В условных операторах и операторах цикла неопределенное условие по умолчанию интерпретируется как false:
if P then A else B – |
при IsNull(P) выполнится B |
|
if not P then |
B else |
A – при IsNull(P) выполнится A |
while P do A; |
B – при IsNull(P) выполнится B |
Неожиданным следствием является неэквивалентность условных операторов, один из которых получен из другого отрицанием условия и перестановкой ветвей. Различие в том, что null-значению условия P в первом случае соответствует оператор B, а во втором – оператор A. Действительно, если во втором случае условие P имеет null-значение, то его отрицание not P также имеет null-значение,
исогласно общему правилу будет выполняться ветвь else, соответствующая оператору A.
Как null-значения влияют на проверку условий в ограничениях целостности? В ограничениях
целостности, представляющих собой условия корректности вводимых данных, неопределенное условие интерпретируется как true, поскольку отвергнуть нужно лишь заведомо некорректные данные. Например, проверочное условие check(x > 0) позволит ввести и положительные значения x, и null- значение.
Как переопределить правила вычислений с null-значениями, действующими по умолчанию? С помощью встроенной функции подмены null-значения IfNull(выражение1, выражение2). Функция возвращает значение 1-го выражения, если оно не является null-значением, и значение 2-го выражения в противном случае (примеры приведены в табл. 2.5). Выражения 1 и 2 могут быть любого, но, понятно, совместимого типа.
С помощью функции подмены интерпретацию неопределенных условий по умолчанию можно представить в явном виде:
if IfNull(P, false) then A else B while IfNull(P, false) do A; B