- •Информация и данные
- •Основные понятия систем с базами данных
- •Пользователи информационной системы с БД
- •Требования к информационным системам с базами данных
- •Основные компоненты ИС с базами данных
- •Архитектура систем с базами данных. Понятие модели данных
- •Сущности и их свойства
- •Связи (отношения) между сущностями
- •Виды связей между сущностями
- •Еще о сущностях, их свойствах и связях между ними
- •Модели данных. Ранние подходы к организации баз данных
- •Основные понятия реляционной модели данных
- •Структуры данных реляционной модели. Реляционные отношения
- •Свойства отношений
- •Отсутствие в отношении одинаковых кортежей
- •Кортежи отношения не упорядочены (сверху вниз)
- •Атрибуты отношения не упорядочены (слева направо)
- •Значения всех атрибутов являются атомарными
- •Виды отношений
- •Реляционная база данных
- •Реляционная модель. Операции над данными
- •Реляционная алгебра
- •Пересечение отношений
- •Вычитание отношений
- •Декартово произведение отношений
- •Проекция
- •Выборка (ограничение)
- •Естественное соединение отношений
- •Деление
- •Реляционное исчисление
- •Примеры правильно построенных формул
- •Язык SQL
- •Отличие SQL от процедурных языков программирования
- •Формы и составные части SQL
- •Условия и терминология
- •Простейшие SELECT-запросы
- •Ограничения целостности в реляционной модели
- •Ограничения целостности уровня атрибута
- •Домены отношений
- •Отсутствующая информация или NULL-значения.
- •Ограничения целостности уровня кортежа
- •Ограничения целостности уровня отношения
- •Потенциальные, первичные, альтернативные ключи отношения
- •Потенциальные ключи и NULL-значения
- •Ограничения целостности уровня базы данных
- •Внешние ключи и NULL-значения
- •Правила ссылочной целостности
- •При обновлении кортежа в родительском отношении
- •При удалении кортежа в родительском отношении
- •При вставке кортежа в дочернее отношение
- •При обновлении кортежа в дочернем отношении
- •Средства обеспечения целостности данных в СУБД
- •Поддержка декларативных ограничений целостности в языке SQL
- •Проектирование базы данных
- •Функциональная зависимость
- •Нормализация отношений базы данных
- •Нормальные формы
- •Декомпозиция без потерь и функциональные зависимости
- •Первая и вторая нормальные формы.
- •Третья нормальная форма.
- •Многозначные зависимости и четвертая нормальная форма
- •Зависимости соединения и пятая нормальная форма
- •Итоговая схема процедуры нормализации
- •Структуры хранения данных и методы доступа
- •Хранение отношений и доступ к хранимым данным
- •Индексирование
- •Управление транзакциями и целостность баз данных
- •Транзакции и параллелизм
- •Проблемы, возникающие при параллельном выполнении транзакций
- •Проблема потери результатов обновления
- •Проблемы несовместимого анализа
- •Несовместимый анализ – неповторяемое считывание
- •Несовместимый анализ – фиктивные элементы (фантомы)
- •Собственно несовместимый анализ
- •Конфликты между транзакциями
- •Методы сериализации транзакций
- •Решение проблем параллелизма при помощи блокировок
- •Проблема потери результатов обновления
- •Проблема несовместимого анализа. Неповторяемое считывание
- •Фиктивные элементы (фантомы)
- •Собственно несовместимый анализ
- •Уровни изоляции. Объекты синхронизационных блокировок
- •Предикатные синхронизационные блокировки
- •Метод временных меток
- •Уровни изоляции.
- •Синтаксис операторов SQL, определяющих уровни изоляции
92
9.4.Ограничения целостности уровня базы данных
Внешние и родительские ключи отношения. Ссылочная целостность
Ограничения целостности уровня базы данных представляют собой ограничения, накладываемые на значения двух или более связанных между собой отношений, включая случай, когда отношение связано само с собой. К этому типу ограничений относятся ограничения, накладываемые на значения так называемого внешнего ключа, и определяющего целостность базы данных по ссылкам.
Рассмотрим в качестве примера приведенные ниже на рис.9.2 отношения
СТУДЕНТЫ, ДИСЦИПЛИНЫ, УСПЕВАЕМОСТЬ и ФАКУЛЬТЕТЫ. Первое из них представляет персональную информацию о конкретных студентах. Его кортежи содержат данные о конкретных экземплярах сущности СТУДЕНТ. В отношении ДИСЦИПЛИНЫ содержится информация об изучаемых дисциплинах. Отношение УСПЕВАЕМОСТЬ представляет уже информацию о связи между сущностями СТУДЕНТ и ДИСЦИПЛИНА. Это связь многие-ко-многим – студент может иметь оценки по многим дисциплинам, и по конкретной дисциплине имеют оценки многие студенты. В отношении ФАКУЛЬТЕТЫ представлена информация о факультетах. Первичным ключом отношения СТУДЕНТЫ является атрибут КОД_СТУД (личный код студента), в отношении ДИСЦИПЛИНЫ первичным ключом является атрибут КОД_ДИСЦ, в отношения ФАКУЛЬТЕТЫ первичный ключ это атрибут ФАКУЛЬТЕТ, у отношения УСПЕВАЕМОСТЬ первичный ключ составной, это – {КОД_СТУД, КОД_ДИСЦ}.
СТУДЕНТЫ |
|
|
|
УСПЕВАЕМОСТЬ |
|
||
КОД_СТУД |
ИМЯ |
ФАКУЛЬТЕТ |
СТАРОСТА |
|
КОД_СТУД |
КОД_ДИСЦ |
ОЦЕНКА |
С2 |
Иванов |
Физический |
С2 |
|
С9 |
Д2 |
5 |
С5 |
Петров |
Химический |
С9 |
|
С9 |
Д4 |
4 |
С4 |
Сидоров |
Физический |
С2 |
|
С9 |
Д1 |
4 |
С9 |
Орлов |
Химический |
С9 |
|
С9 |
Д6 |
5 |
С6 |
Смирнов |
Физический |
С2 |
|
С6 |
Д2 |
3 |
С1 |
Попова |
Исторический |
NULL |
|
С6 |
Д4 |
4 |
С8 |
Поляков |
NULL |
NULL |
|
С6 |
Д6 |
3 |
|
|
|
|
|
С1 |
Д4 |
5 |
|
|
|
|
|
С1 |
Д6 |
5 |
|
|
|
|
|
С1 |
Д8 |
4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
93 |
|
ДИСЦИПЛИНЫ |
|
|
|
ФАКУЛЬТЕТЫ |
|
|
|
|
КОД_ДИСЦ |
ДИСЦИПЛИНА |
ЧАСЫ |
СЕМЕСТР |
|
ФАКУЛЬТЕТ |
ДЕКАН |
ТЕЛЕФОН |
|
Д2 |
Физика |
32 |
2 |
|
Физический |
Климов |
123778 |
|
Д4 |
Математика |
54 |
1 |
|
Химический |
Боев |
123556 |
|
Д1 |
История |
32 |
3 |
|
Исторический |
Зуев |
123367 |
|
Д6 |
Информатика |
108 |
1 |
|
Математический |
Ковалев |
123876 |
|
Д8 |
Химия |
17 |
4 |
|
|
|
|
|
Рис. 9.2. Примеры отношений базы данных для иллюстрации ограничений ссылочной целостности базы данных
При внимательном рассмотрении приведенных отношений можно увидеть, что значения некоторых атрибутов одного отношения оказываются связанными со значениями атрибутов в другом отношении. Рассмотрим характер связи между отношениями СТУДЕНТЫ и УСПЕВАЕМОСТЬ. В отношении УСПЕВАЕМОСТЬ не должно быть кортежей с записями, касающимися студентов, о которых отсутствует информация в отношении СТУДЕНТЫ (информация об оценках «неизвестно кого» не имеет смысла). Отсюда следует, что на значения атрибута КОД_СТУД отношения УСПЕВАЕМОСТЬ должно быть наложено соответствующее ограничение, а именно, – в качестве его значений могут использоваться только коды студентов фактически присутствующие в отношении СТУДЕНТЫ. Атрибут КОД_СТУД отношений является фактически средством связи этих отношений. При этом, как мы уже говорили, атрибут КОД_СТУД отношения СТУДЕНТЫ является первичным ключом этого отношения. В отношении же УСПЕВАЕМОСТЬ атрибут КОД_СТУД является так называемым внешним ключом, ссылающимся на соответствующий первичный ключ отношения СТУДЕНТЫ. Аналогично, в этом же отношении атрибут КОД_ДИСЦ является внешним ключом, ссылающимся на одноименный атрибут отношения ДИСЦИПЛИНЫ, а в отношении СТУДЕНТЫ атрибут ФАКУЛЬТЕТ является внешним ключом, ссылающимся на одноименный атрибут отношения
ФАКУЛЬТЕТЫ.
Определение понятия внешний ключ имеет следующий вид.
Пусть R2 – базовое отношение. Тогда внешний ключ (foreign key), FK в отношении R2 – это подмножество множества атрибутов R2, такое что:
•существует базовое отношение R1 (отношения R1 и R2 не обязательно различные) с потенциальным ключом PK;
•каждое значение внешнего ключа FK в текущем значении R2 всегда совпадает со значением потенциального ключа PK некоторого кортежа в текущем значении R1.
94
Потенциальный ключ, на который ссылается внешний ключ, называют
родительским ключом.
Значения внешнего ключа называют ссылкой (reference) к кортежу, содержащему соответствующее значение родительского потенциального ключа. Этот кортеж называют ссылочным (referenced) или целевым
(target) кортежем.
Проблема необходимости обеспечения соответствия значений внешнего ключа значениям определенного потенциального ключа известна как проблема
ссылочной целостности (referential integrity problem), а само ограничение,
накладываемое на допустимые значения внешнего ключа, называют
ссылочным ограничением (referential constraint).
Прокомментируем приведенное выше определение внешнего ключа.
1.Из определения следует, что каждое значение внешнего ключа должно являться значением соответствующего родительского потенциального ключа. Однако надо обратить внимание на то, что обратное не требуется, потенциальный ключ, выступающий в качестве родительского, может содержать значения, которые в данный момент не являются значением внешнего ключа. Например, в отношении СТУДЕНТЫ могут быть записи о студентах, не имеющих оценок ни по одной из дисциплин, и поэтому в отношении УСПЕВАЕМОСТЬ записи о них и, следовательно, соответствующие значения внешнего ключа будут отсутствовать.
2.Внешний ключ будет составным тогда и только тогда, когда соответствующий родительский потенциальный ключ является составным. Он будет простым тогда и только тогда, когда соответствующий родительский ключ также будет простым.
3.Каждый атрибут, входящий в данный внешний ключ, должен быть определен на том же самом домене, что и соответствующий атрибут соответствующего родительского ключа.
4.Следует иметь в виду, что целевое отношение может само ссылаться на другое отношение, которое в свою очередь может ссылаться на следующее отношение, образуя, таким образом, цепь или каскад из отношений, последовательно ссылающихся друг на друга. (В приведенном примере отношение УСПЕВАЕМОСТЬ ссылается на отношение СТУДЕНТЫ, которое, в свою очередь ссылается на отношение ФАКУЛЬТЕТЫ).
5.Из определения внешнего ключа также следует, что отношение может ссылаться само на себя. (В отношении СТУДЕНТЫ атрибут СТАРОСТА в качестве внешнего ключа ссылается на атрибут КОД_СТУД этого же отношения, являющийся для него родительским ключом).
95
Внешние ключи и NULL-значения
Допущение возможности использования в реляционной базе данных NULL-значений требует уточнения рассмотренных выше вопросов, связанных с внешними ключами отношений и правилами обеспечения ссылочной целостности.
Как уже говорилось выше, NULL-значения являются недопустимыми для первичных ключей. Появление же NULL-значений в позициях внешних ключей в общем случае не запрещено. Эта ситуация означает лишь то, что для конкретного кортежа ссылающегося отношения значение соответствующего родительского ключа не известно. Например, в отношении СТУДЕНТЫ атрибут ФАКУЛЬТЕТ является внешним ключом, ссылающимся на одноименный атрибут отношения ФАКУЛЬТЕТЫ, в котором этот атрибут является первичным ключом. Тот факт, что в отношении СТУДЕНТЫ в кортеже студента по фамилии Поляков вместо значения конкретного факультета установлен маркер NULL, означает то, что для этого студента в данный момент времени не известно на каком факультете он учится.
В связи с вышесказанным, приведенное в предыдущем разделе определение внешнего ключа необходимо уточнить следующим образом.
Пусть R2 – базовое отношение. Тогда внешний ключ, скажем FK в отношении R2 – это подмножество множества атрибутов R2, такое что:
•существует базовое отношение R1 (отношения R1 и R2 не обязательно различные) с потенциальным ключом PK;
•каждое значение внешнего ключа FK в текущем значении R2 или является NULL-значением, или совпадает со значением потенциального ключа PK некоторого кортежа в текущем значении R1.
Решение вопроса о допустимости или недопустимости использования для внешнего ключа NULL-значений зависит от конкретной ситуации. Например, должно быть понятно, что в рассматриваемом выше примере для внешнего ключа, представленный атрибутом КОД_СТУД отношения УСПЕВАЕМОСТЬ, запрещено использование NULL-значений из-за того, что сам этот атрибут является частью составного первичного ключа {КОД_СТУД, ДИСЦИПЛИНА}
отношения УСПЕВАЕМОСТЬ. Для атрибутов СТАРОСТА и ФАКУЛЬТЕТ,
являющихся внешними ключами отношения СТУДЕНТЫ, NULL-значения в принципе допустимы. Их наличие будет отражать тот факт, что для конкретного студента не известно, кто является его старостой, или не известно, на каком факультете он учится. Допускать или не допускать использование