- •Глава 1. Базы данных и системы управления 9
- •Глава 2. Организация доступа к данным 45
- •Глава 3. Реляционная алгебра 60
- •Глава 4. Основы sql 67
- •Глава 5. Проектирование реляционных баз данных 89
- •Глава 6. Взаимодействие sql с приложениями 116
- •Глава 7. Некоторые проблемы администрирования баз данных 154
- •Базы данных и системы управления
- •Файловые системы
- •Концепция баз данных
- •Основные функции субд
- •Непосредственное управление данными во внешней памяти
- •Управление буферами оперативной памяти
- •Управление транзакциями
- •Журнализация
- •Поддержка языков баз данных
- •Трехуровневая модель архитектуры систем баз данных
- •Модели данных
- •Характеристика связей
- •Компьютерно-ориентированные модели данных
- •Реляционный подход
- •Ключи и целостность реляционных данных
- •Моделирование концептуальной схемы базы данных
- •Организация доступа к данным
- •Страницы и файлы
- •Индексирование
- •Структуры типа б-дерева
- •Хеширование
- •Методы сжатия
- •Метод дифференциального сжатия
- •Иерархические методы сжатия
- •Кодирование по методу Хаффмена
- •Реляционная алгебра
- •Традиционные реляционные операции
- •Специальные реляционные операции
- •Дополнительные реляционные операции
- •Примеры использования реляционной алгебры для выражения словесных запросов в виде формул
- •Основы sql
- •Типы данных
- •Строковые типы данных
- •Битовые типы данных
- •Точные числовые типы данных
- •Вещественные числовые типы данных
- •Календарные типы данных
- •Значения null
- •Создание и обслуживание таблиц
- •Запрос на выборку
- •Статистические функции
- •Создание соединений
- •Вложенные запросы
- •Запрос на объединение
- •Запросы, выполняющие реляционные операции вычитания, пересечения и деления
- •Запросы на изменение
- •Перекрестные запросы
- •Проектирование реляционных баз данных
- •Нормализация отношений
- •Функциональные зависимости
- •Н ормальные формы, обоснованные функциональными зависимостями
- •Нормальная форма Бойса–Кодда
- •Нормальные формы, обоснованные более сложными зависимостями
- •Процедура нормализации и проектирования
- •Пример проектирования базы данных
- •Назначение и предметная область
- •Проектирование базы данных
- •Взаимодействие sql с приложениями
- •Встраивание sql-операторов в программный код
- •Тип курсора
- •Триггеры
- •Хранимые процедуры
- •Стандартные интерфейсы для доступа к данным
- •Информационное окружение веб-сервера
- •Стандарт odbc
- •Уровни соответствия
- •Уровень соответствия odbc
- •Задание имени источника данных odbc
- •Расширяемый язык разметки xml
- •Xml как язык разметки
- •Материализация хмl-документов с помощью xslt
- •Создание хмl-документов на основе информации из базы данных
- •Некоторые проблемы администрирования баз данных
- •Оптимизация запросов
- •Параллельная обработка данных
- •Потеря обновления
- •Зависимость от незафиксированных обновлений
- •Несогласованный анализ
- •Блокировки транзакций
- •Согласованность и уровень изоляции транзакций
- •Распределенные системы баз данных
- •Фрагментация
- •Репликация
- •Распространение обновлений
- •Управление каталогом
- •Распределенная обработка запросов
- •Типы распределенных систем баз данных
- •Нераспределенные мультибазовые субд
- •Клиент-серверные системы
- •Системы с общими ресурсами
- •Технические аспекты администрирования базы данных
- •Восстановление базы данных
- •Безопасность баз данных
- •Шифрование данных
- •Производительность баз данных
- •Администрирование данных
- •Литература
Н ормальные формы, обоснованные функциональными зависимостями
В п. 5.1 мы упоминали о первой нормальной форме (1НФ). Приведем более строгое ее определение, а также определения других нормальных форм.
Таблица находится в первой нормальной форме (1НФ) тогда и только тогда, когда ни одна из ее строк не содержит в любом своем поле более одного значения и ни одно из ее ключевых полей не пусто.
Например, этим требованиям не удовлетворяет таблица, изображенная на рис. 5.3.1 (данные в поле Д№ не атомарные):
П№ |
Гор |
Д№ |
Кол |
П4 |
Минск |
Д2,Д4,Д5 |
400 |
Рис. 5.3.1. Пример таблицы, которая не является реляционным отношением
Такие таблицы даже не рассматриваются в реляционных моделях.
Если мы разрабатываем реляционную базу данных, то на первом этапе может быть создана таблица, объединяющая все рассматриваемые данные, например, Поставщики, Детали, Поставки. Таблица на рис. 5.3.2 представляет собой корректное реляционное отношение. Его называют универсальным отношением проектируемой базы данных. В одно универсальное отношение включаются все представляющие интерес атрибуты и оно может содержать все данные, которые предполагается размещать в базе данных в будущем. Для малых баз данных универсальное отношение может использоваться в качестве отправной точки при их проектировании. Первичным ключом таблицы является комбинация полей П№ и Д№. Эта таблица удовлетворяет всем требованиям 1НФ.
П№ |
Статус |
Гор_П |
Д№ |
Имя_Д |
Цв |
Вес |
Гор_Д |
Кол |
П1 |
20 |
Брест |
Д1 |
Тестер |
Черный |
250 |
Борисов |
300 |
П1 |
20 |
Брест |
Д2 |
Дозиметр |
Серый |
700 |
Минск |
200 |
П1 |
20 |
Брест |
Д3 |
Радиометр |
Черный |
1400 |
Минск |
400 |
П1 |
20 |
Брест |
Д4 |
Часы |
Желтый |
140 |
Брест |
200 |
П1 |
20 |
Брест |
Д5 |
Рулетка |
Красный |
200 |
Пинск |
100 |
П1 |
20 |
Брест |
Д6 |
Лом |
Черный |
5000 |
Могилев |
100 |
П2 |
10 |
Минск |
Д1 |
Тестер |
Черный |
250 |
Борисов |
300 |
П2 |
10 |
Минск |
Д2 |
Дозиметр |
Серый |
700 |
Минск |
400 |
П3 |
30 |
Гродно |
Д2 |
Дозиметр |
Серый |
700 |
Минск |
200 |
П4 |
10 |
Минск |
Д2 |
Дозиметр |
Серый |
700 |
Минск |
200 |
П4 |
10 |
Минск |
Д4 |
Часы |
Желтый |
140 |
Брест |
300 |
Рис. 5.3.2. Отношение в первой нормальной форме
Д иаграмма функциональных зависимостей такого отношения имеет вид, изображенный на рис. 5.3.3 (будем предполагать, что статус поставщика определяется городом).
Рассматриваемое отношение, которое находится в 1НФ, обладает структурой, которая по некоторым причинам не совсем желательна. Например, очевидна избыточность информации. Это приводит не только к увеличению размера базы данных, но и к разным аномалиям:
Вставка (Insert). Нельзя вставить данные о поставщике (П5), не указав деталь (Null-значение в ключевом поле недопустимо).
Удаление (Delete). При удалении некоторого кортежа приходится удалять слишком много другой информации (удаление информации о поставке удаляет информацию о поставщике).
Обновление (Update). Избыточная информация может привести к несовместимым результатам. Если поставщик П1 переехал в другой город, а обновление сделано не во всех кортежах, то база данных будет содержать противоречивую информацию.
Эти аномалии могут быть устранены путем приведения отношения ко второй нормальной форме, разбив его на два.
Таблица находится во второй нормальной форме (2НФ), если она удовлетворяет определению 1НФ и все ее поля, не входящие в первичный ключ, связаны неприводимой зависимостью с первичным ключом (или находятся в полной функциональной зависимости с первичным ключом).
Ф ункциональные зависимости отношений нашей базы данных, приведенных ко 2НФ, показаны на рис. 5.3.4, а соответствующие таблицы – на рис. 5.3.5.
Сейчас в базу данных можно вводить сведения о поставщиках без сведений об их товаре, при удалении сведений о товаре остаются остальные данные (о поставщиках, например), сведения о городе встречаются один раз и это снимает проблему, связанную с избыточностью информации. Т.е., благодаря декомпозиции мы избавились от многих проблем, присутствовавших в отношении в 1НФ. В то же время, отношения, приведенные на рис. 5.3.5, могут быть объединены и тогда мы вернемся к отношению, изображенному на рис. 5.3.3 – значит декомпозиция проведена без потери данных.
Таким образом, первым этапом процедуры нормализации отношения является создание проекций для исключения «приводимых» функциональных зависимостей.
П№ |
Статус |
Гор_П |
П1 |
20 |
Брест |
П2 |
10 |
Минск |
П3 |
30 |
Гродно |
П4 |
10 |
Минск |
П5 |
20 |
Брест |
П№ |
Д№ |
Кол |
П1 |
Д1 |
300 |
П1 |
Д2 |
200 |
П1 |
Д3 |
400 |
П1 |
Д4 |
200 |
П1 |
Д5 |
100 |
П1 |
Д6 |
100 |
П2 |
Д1 |
300 |
П2 |
Д2 |
400 |
П3 |
Д2 |
200 |
П4 |
Д2 |
200 |
П4 |
Д4 |
300 |
Д№ |
Имя_Д |
Цв |
Вес |
Гор_Д |
Д1 |
Тестер |
Черный |
250 |
Борисов |
Д2 |
Дозиметр |
Серый |
700 |
Минск |
Д3 |
Радиометр |
Черный |
1400 |
Минск |
Д4 |
Часы |
Желтый |
140 |
Брест |
Д5 |
Рулетка |
Красный |
200 |
Пинск |
Д6 |
Лом |
Черный |
5000 |
Могилев |
Рис. 5.3.5. Отношения в 2НФ
Однако структура отношений, показанных на рис. 5.3.5, может создать некоторые проблемы, связанные с отношением Поставщик, в котором неключевые атрибуты не являются взаимно независимыми. Зависимость атрибута Статус от атрибута П№ является функциональной и неприводимой, но эта зависимость также транзитивна через атрибут Город – каждое значение П№ определяет значение Город, а каждое значение Город определяет значение Статус. Но если выполняются зависимости АВ и ВС, то выполняется также зависимость АС. Транзитивные зависимости могут опять привести к аномалиям обновления:
Вставка – нельзя включить данные о некотором городе и его статусе, пока в нем нет поставщика.
Удаление – при удалении поставщика теряется информация о статусе города (очевидно, что причиной такой проблемы является совместная информация – в таблице содержится информация и о поставщиках, и о городе).
Обновление – статус городов повторяется несколько раз. При изменении статуса города приходится просматривать множество строк, чтобы исключить получение противоречивого результата, но вероятность ошибки остается.
П роблема решается приведением отношения Поставщик к третьей нормальной форме через его декомпозицию:
Эта процедура исключает транзитивную зависимость и разрешает все трудности.
Отношение находится в третьей нормальной форме (3НФ) тогда и только тогда, когда оно находится в 2НФ и каждый неключевой атрибут нетранзитивно зависит от первичного ключа.
Другими словами: таблица находится в третьей нормальной форме (3НФ), если она находится в 2НФ и ни одно из ее неключевых полей не зависит функционально от любого другого неключевого поля.
Таким образом, вторым этапом нормализации является создание проекций для исключения транзитивных зависимостей.
В процессе выполнения процедуры нормализации часто возникают ситуации, когда отношение может быть подвергнуто операции декомпозиции несколькими способами. Например, отношение Поставщик (рис. 5.3.5) с функциональными зависимостями П№Город и ГородСтатус и, следовательно, транзитивной зависимостью П№ Статус. Возможны варианты декомпозиции этого отношения на две проекции, находящиеся в 3НФ:
А: (П№, Город) и (Город, Статус) (так было предложено ранее) и В: (П№, Город) и (П№, Статус)
Третий вариант декомпозиции на проекции (П№, Статус) и (Город, Статус) не может быть применен, поскольку выполняется с потерей информации – несколько городов могут иметь одинаковый статус, тогда будет потеряна информация о городе, где находится поставщик.
По некоторым причинам декомпозиция В менее желательна, чем декомпозиция А. Например, после выполнения декомпозиции В невозможно вставить информацию о том, что некоторый город имеет некоторый статус, без указания поставщика из этого города.
В декомпозиции А обе проекции независимы друг от друга в том смысле, что обновления в каждой из проекций могут быть выполнены совершенно независимо друг от друга. В декомпозиции В обновление любой из двух проекций должно контролироваться, чтобы не нарушить исходную зависимость ГородСтатус. Т.е., проекции декомпозиции В не являются независимыми друг от друга.
Концепция независимости проекций обеспечивает критерий выбора одной из нескольких возможных декомпозиций. Проекции R1 и R2 отношения R независимы в упомянутом выше смысле тогда и только тогда, когда
каждая функциональная зависимость в отношении R является логическим следствием функциональных зависимостей в проекциях R1 и R2;
общие атрибуты проекций R1 и R2 образуют потенциальный ключ, по крайней мере, для одной из них.
В рассматриваемом примере в декомпозиции А две проекции независимы, поскольку их общий атрибут Город является потенциальным ключом для второй проекции и каждая функциональная зависимость исходного отношения сохраняется в проекциях. Наоборот, в декомпозиции В две проекции не являются независимыми, т.к. зависимость ГородСтатус не может быть получена из функциональных зависимостей этих проекций, хотя их общий атрибут П№ является потенциальным ключом для обеих проекций.
Идея нормализации с декомпозицией на независимые проекции предложена Риссаненом (Rissanen) и называется декомпозицией с сохранением зависимости.