ОБЩИЕ ПОНЯТИЯ РЕЛЯЦИОННОГО ПОДХОДА К ОРГАНИЗАЦИИ БД. ОСНОВНЫЕ КОНЦЕПЦИИ И ТЕРМИНЫ
Реляционная модель данных в некоторой предметной области представляет собой набор отношений, изменяющихся во времени. При создании ИС совокупность отношений позволяет хранить данные об объектах предметной области и моделировать связи между ними.
На примере отношения «Сотрудники» рассмотрим основные понятия реляционного подхода к организации БД (рис. 4).
Рис. 4. Отношение «Сотрудники»
Сущность есть объект любой природы, данные о котором хранятся в БД. Данные о сущности хранятся в отношении. Отношение является важнейшим понятием и представляет собой двумерную таблицу, содержащую некоторые данные.
Атрибут — свойство, характеризующее сущность. В структуре таблицы каждый атрибут именуется и ему в соответствие ставится заголовок некоторого столбца таблицы.
Домен — множество всех возможных значений определенного атрибута отношений.
Схема отношений — список имен атрибутов. Множество кортежей отношений часто называют содержимым отношения.
Кортеж — строка таблицы.
Степень (-арность) отношения — количество столбцов таблицы.
Мощность отношения — количество строк таблицы.
Наглядным способом представления отношения является таблица. Однако не каждая таблица может считаться отношением. Отношения обладают определенными свойствами, которыми и отличаются от таблиц.
Основные свойства отношений:
1. В отношении нет одинаковых кортежей. Действительно, тело отношения есть множество кортежей и, как всякое множество, оно не может содержать неразличимые элементы. Таблицы, в отличие от отношений, могут содержать одинаковые строки.
- 2. Кортежи не упорядочены (сверху вниз). Действительно, несмотря на то, что отношение «Сотрудники» изображено в виде таблицы, нельзя сказать, что сотрудник Иванов «предшествует» сотруднику Петрову. Причина та же — тело отношения есть множество, а множество не упорядочено. Это вторая причина, по которой нельзя отождествить отношения и таблицы - строки в таблицах упорядочены. Одно и то же отношение может быть изображено разными таблицами, в которых строки идут в различном порядке.
- 3. Атрибуты не упорядочены (слева направо). Так как каждый атрибут имеет уникальное имя в пределах отношения, то порядок атрибутов не имеет значения. Данное свойство несколько отличает отношение от математического определения отношения. Это также третья причина, по которой нельзя отождествить отношения и таблицы: столбцы в таблице упорядочены. Одно и то же отношение может быть изображено разными таблицами, в которых столбцы идут в различном порядке.
- 4. Все значения атрибутов атомарны. Это следует из того, что лежащие в их основе атрибуты имеют атомарные значения. Это четвертое отличие отношений от таблиц: в ячейки таблиц можно поместить что угодно — массивы, структуры и даже другие таблицы.
Замечание. Из свойств отношения следует, что не каждая таблица может задавать отношение. Для того, чтобы некоторая таблица задавала отношение, необходимо, чтобы она имела простую структуру (содержала бы только строки и столбцы, причем, в каждой строке было бы одинаковое количество полей), в ней не должно быть одинаковых строк, любой столбец должен содержать данные только одного типа, все используемые типы данных должны быть простыми.
Важнейшими понятиями реляционной модели являются первичный ключ и внешний ключ.
Первичным ключом (ключом отношения, ключевым атрибутом) называются атрибуты отношения, однозначно идентифицирующие каждый из его кортежей. Ключ может быть составным (сложным), т. е. состоять из нескольких атрибутов. Каждое отношение обязательно имеет комбинацию атрибутов, которая может служить ключом. Возможны случаи, когда отношение имеет несколько комбинаций атрибутов, каждая из которых однозначно определяет все кортежи отношения. Все эти комбинации атрибутов являются возможными ключами отношений. Любой из возможных ключей может быть выбран как первичный. Если выбранный первичный ключ состоит из минимально необходимого набора атрибутов, то говорят, что он является неизбыточным.
Ключи обычно используются:
- — для исключения дублирования значений ключевых атрибутов;
- — упорядочения кортежей;
- — ускорения работы с кортежами отношений;
- — организации связывания таблиц.
Пусть в отношении R имеется неключевой атрибут А, значение которого является значением ключевого атрибута В другого отношения R2. Тогда говорят, что атрибут А отношения RI есть внешний ключ. С помощью внешних ключей устанавливаются связи между отношениями.
Определение ключа для таблицы означает автоматическую сортировку записей, контроль отсутствия повторений значений в ключевых полях записей и повышение скорости выполнения операций поиска в таблице. Для реализации этих функций в СУБД применяют индексирование.
Термин индекс тесно связан с понятием ключ, хотя между ними есть и некоторое отличие.
Под индексом понимают средство ускорения операций поиска записей в таблице и других операций, использующих поиск: выборка, модификация, сортировка. Таблицу, для которой используется индекс, называют индексированной.
Индекс выполняет роль оглавления таблицы, просмотр которого предшествует обращению к записям в ней. В некоторых системах индексы хранятся в индексных файлах, отдельно от табличных файлов.
Ключевые поля таблицы во многих СУБД, как правило, индексируются автоматически. Индексные файлы, создаваемые по ключевым полям таблицы, часто называют файлами первичных индексов.
Индексы, создаваемые пользователем для не ключевых полей, иногда называют вторичными или пользовательскими индексами. Введение таких индексов не изменяет физического расположения записей, но влияет на последовательность просмотра записей. Индексные файлы, создаваемые для поддержания вторичных индексов таблицы, называются файлами вторичных индексов.
Главная причина повышения скорости выполнения различных операций в индексных таблицах состоит в том, что основная часть работы производится с небольшими индексными файлами, а не с самими таблицами.
Необходимое качество реляционной БД заключается в отсутствии в любом ее отношении внешних ключей, ссылающихся на несуществующие кортежи. Такое свойство реляционной БД называется ссылочная целостность (referential integrity).
Связи между данными, хранимыми в разных отношениях, в реляционной БД устанавливаются с помощью использования внешних ключей.
Таким образом, всегда имеется возможность выполнить две операции:
- — определить, с каким кортежем в отношении В связан определенный кортеж отношения А;
- — найти все кортежи отношения А, имеющие связи с определенным кортежем отношения В.
БД обладает свойством ссылочной целостности, когда для любой пары связанных внешним ключом отношений в ней условие ссылочной целостности выполняется.
Если вышеприведенное условие не выполняется, то говорят, что в БД нарушена ссылочная целостность. Такая БД не может нормально эксплуатироваться, так как в ней разорваны логические связи между зависимыми друг от друга фактами.
Непосредственным результатом нарушения ссылочной целостности становится то, что корректным запросом не всегда удается получить корректный результат.
Рассмотрим пример. Основная таблица «Адрес» содержит непосредственно номер дома и квартиры, а вместо имени улицы в поле «улица» имеет внешний ключ, ссылающийся на таблицу «Улицы» — справочник улиц (рис. 5).
Рис. 5. Ссылочная целостность и ее нарушение
Очевидно, что полноценный адрес должен быть представлен двумя связанными записями в обеих названных таблицах.
Две записи таблицы «Адрес» (id = 887 и id = 994) имеют в поле «улица» так называемые «висящие ссылки» — значения, которым не соответствуют записи в таблице «Улицы».
Из-за этого результат запроса, выбирающего адреса (полные, по равенству полей), не будет содержать этих двух записей — для них условие запроса не выполнится. И еще одна запись не будет выбрана таким запросом (id = 85).
Это вариант намеренного (и, в некоторых случаях, легального) нарушения ссылочной целостности — в поле внешнего ключа записан NULL.
Правильно спроектированная и поддерживаемая БД не допускает возможности нарушения ссылочной целостности.
Пустые внешние ключи. Возможна ситуация, когда внешний ключ вместо ссылки на существующую запись в таблице БД содержит «отсутствующее значение» NULL.
Такое положение можно трактовать как отсутствие какой- то части объекта. Хотя с точки зрения чистой теории это недопустимо, на практике иногда бывает удобно разрешить использование пустых внешних ключей.
Чтобы корректно работать с группами связанных таблиц, допускающих пустые внешние ключи, используется специфическая операция языка SQL — открытое соединение (внешнее соединение, outer join).
Обязательным (хотя и не достаточным) условием сохранения ссылочной целостности БД является поддержка транзакций. Если программное обеспечение выполняет группу связанных между собой операций, которые по отдельности могут приводить к нарушению целостности ссылок, СУБД должна предоставлять возможность выполнения всей этой группы в одной транзакции, т. е. так, чтобы при любом сбое производилась автоматическая отмена всех операций группы, в том числе уже полностью завершенных.
Возможно поддержание ссылочной целостности БД с использованием механизма триггеров. В этом случае для любой потенциально опасной операции над таблицей создается триггер, который производит необходимые проверки или даже изменяет данные в связанных таблицах, чтобы исключить потерю ссылок.
Так, для обеспечения каскадных изменений триггер может быть установлен на операцию изменения записи в таблице.
Если окажется, что при редактировании изменилось значение ключевого поля, триггер должен произвести согласованные изменения во всех таблицах, связанных с данной, поменяв старое значение внешних ключей на новое.
СУБД может иметь механизм автоматического поддержания ссылочной целостности, основанный на явном описании ссылок при создании БД.
При описании таблиц БД программист явно описывает, какие поля таблиц являются внешними ключами и на какие таблицы они ссылаются.
Любая операция, изменяющая данные в таблице, вызывает автоматическую проверку ссылочной целостности.
При этом:
1) в случае операции добавления или редактирования записи автоматически проверяется, ссылаются ли внешние ключи в этой записи на существующие записи в заявленных при описании связанных таблицах; если выясняется, что операция приведет к появлению некорректных ссылок, она не выполняется;
- 2) в случае операции редактирования записи проверяется, не изменяется ли ее первичный ключ и нет ли на нее ссылок; если первичный ключ изменяется, и при этом на данную запись имеются ссылки, операция редактирования завершается с ошибкой;
- 3) в случае операции удаления записи проверяется, нет ли на нее ссылок; если ссылки имеются, то возможно три варианта дальнейших действий:
- — запрет — удаление блокируется и возвращается ошибка;
- — каскадное удаление — в одной транзакции производится удаление данной записи и всех записей, ссылающихся на данную;
- — обнуление внешних ключей — во все внешние ключи записей, ссылающихся на данную, записывается значение NULL.
С понятием «ссылочной целостности» тесно связано понятие «консистентности данных».
Консистентность данных (data consistency, data validity) — согласованность данных друг с другом, целостность данных, а также внутренняя непротиворечивость.
Множество всех условий, налагаемых на данные, определяется моделью (структурой) данных.
Данные представляют собой связанные отношениями узлы различного типа, и в модели данных могут быть оговорены условия: какие именно данные там могут храниться и узлы каких типов могут быть связаны заданными в модели отношениями (связями).
Например, в БД людей связь «Родитель—Ребенок», направленная от узла «Родитель» к узлу «Ребенок», подразумевает, что узел «Ребенок» связан с «Родитель» либо как «дочь», либо как «сын», причем это непосредственно зависит от значения атрибута «пол» узла «Ребенок».
Условия консистентности могут включать в себя указание того, какие значения могут принимать атрибуты узлов, какие отношения могут устанавливаться между узлами, каково минимальное и максимальное число отношений определенного типа, в котором может участвовать один узел, а также другие типы условий.
Условия целостности данных (integrity constraints) стали записывать в виде правил и ввели триггеры — процедуры, которые вызываются до и/или после выполнения запроса.
До запроса (триггер типа BEFORE) проходит проверка того, что данные имеют состояние, которое позволяет осуществить данный тип запроса.
После выполнения запроса (триггер типа AFTER) проверяется, что состояние БД удовлетворяет условиям целостности.
Если один из триггеров не срабатывает (или срабатывает с ошибкой), то транзакция откатывается (roll-back) (отменяется). Если же все триггеры сработали успешно, то транзакция подтверждается (commit) (завершается).
При решении проблемы поддержки консистентности данных необходим разумный баланс между скоростью (сложностью алгоритмов) извлечения данных и скоростью (сложностью алгоритмов) хранения и модификации данных.
Более подробно вопрос формирования таблиц, связей, триггеров и т. п. мы рассмотрим, когда будем говорить о языке SQL.
- Ш ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ
- 1. Дайте определения основным понятиям реляционного подхода.
- 2. Перечислите свойства, которыми должно обладать реляционное отношение.
- 3. Что такое первичный ключ отношения?
- 4. Назовите назначение индексов.
- 5. Для чего используется внешний ключ в таблице?
- 6. Перечислите способы поддержания ссылочной целостности.