
- •1. Введение в бд
- •2. Теоретические основы бд
- •2.1 Базы данных
- •2.2. Архитектуры обработки информации
- •Ошибка! Ошибка связи.
- •Ошибка! Ошибка связи.
- •2.3 Модели баз данных
- •2.3.1 Иерархическая модель данных
- •Ошибка! Ошибка связи.
- •Ошибка! Ошибка связи.
- •2.3.2 Сетевая модель данных
- •Ошибка! Ошибка связи.
- •2.3.3 Реляционная модель данных
- •3. Реляционный подход к организации бд
- •3.1 Базовые понятия реляционных баз данных
- •Ошибка! Ошибка связи.
- •3.2 Фундаментальные свойства отношений
- •3.3 Взаимосвязь отношений
- •4. Реляционная алгебра
- •4.1 Обзор реляционной алгебры
- •Замкнутость реляционной алгебры
- •Отношения, совместимые по типу
- •4.2 Теоретико-множественные операторы
- •4.3 Специальные реляционные операторы
- •4.4 Зависимые реляционные операторы
- •4.5 Примитивные реляционные операторы
- •4.6 Запросы, невыразимые средствами реляционной алгебры
- •4.7 Кросс-таблицы
- •5. Проектирование бд
- •5.1. Цели и этапы проектирования
- •5.2 Уровни моделирования (проектирования) бд
- •5.3 Критерии оценки качества логической модели данных
- •5.4 Нормализация и ее необходимость
- •5.5 Теория нормализации
- •5.6 Элементы модели "сущность-связь"
- •Основные понятия er-диаграмм
- •Ошибка! Ошибка связи.
- •6. Элементы языка sql
- •6.1 Типы данных
- •6.2 Операторы dml (определения объектов базы данных)
- •6.2.1 Операторы работы с таблицами
- •6.3 Операторы dml (операторы манипулирования данными)
- •6.3.1 Примеры использования операторов манипулирования данными
- •Insert - вставка строк в таблицу
- •6.3.2 Update - обновление строк в таблице
- •6.3.3 Delete - удаление строк в таблице
- •6.3.4 Выбор данных из таблицы select
- •6.3.4.1 Общий синтаксис команды select
- •6.3.4.2 Примеры работы с использованием оператора select
- •Использование агрегатных функций в запросах
- •Использование агрегатных функций с группировками
- •Использование подзапросов
- •Использование объединения, пересечения и разности
- •6.3.4.3 Порядок выполнения оператора select
- •6.3.4.4 Реализация реляционной алгебры средствами оператора select (Реляционная полнота sql)
- •6.4 Объекты и концепции базы данных
- •6.4.1 Таблицы (Tables)
- •6.4.2 Столбцы (Columns)
- •6.4.3 Типы данных (Data types)
- •Тип данных blob
- •6.4.4 Домены (Domains)
- •6.4.5 Справочные ограничения целостности (Referential integrity constraints)
- •6.4.6 Индексы (Indexes)
- •6.4.7 Представления (Views)
- •6.4.8. Хранимые процедуры (Stored procedures)
- •6.4.9 Триггеры (Triggers)
- •6.4.10 Генераторы (Generators)
- •6.4.11 Защита (Security)
- •6.5 Операторы sql для работы с объектами бд
- •6.5.1 Представления
- •6.5.2 Хранимые процедуры
- •6.5.3 Генераторы
- •6.5.4 Триггеры
- •6.5.5 Индексы
- •6.6 Инструкции sql
- •7. Физическая организация и работа субд
- •7.1 Хранение данных
- •Ошибка! Ошибка связи.
3.3 Взаимосвязь отношений
Взаимосвязь отношений является важнейшим элементом реляционной модели данных. Она поддерживается внешними ключами (foreign key). Рассмотрим пример. В БД содержатся сведения: по университету (таблица Университет), о различных кафедрах университета (таблица Кафедры), а также сведения о сотрудниках этих кафедр (таблица Сотрудники). Первичным ключом таблицы Университет является поле ИД_Универ, ИД_Сотр и ИД_Каф. Сотрудники является поле ИД_Сотр, а таблицы Кафедры – поле ИД_Каф. Таким образом, поля ИД_Сотр и ИД_Каф таблицы Университет являются внешними ключами для связи с таблицами Кафедры и Сотрудники.
Когда поле одной таблицы является внешним ключом другой таблицы, то такие таблицы называются связанными. А процедуру установления внешних ключей между таблицами называют связывание таблиц. Рис. 8 показывает связанные таблицы для рассмотренного примера.
Рис. 8. Связывание таблиц
Когда пользователю необходимо найти информацию о всех сотрудников, принадлежащих определенной кафедре, он сначала находит кафедру (по значению поля ИД_Каф) в таблице Кафедры, затем в таблице Универистет находятся все строки, у которых значение в столбце ИД_Каф равно найденному идентификационному номеру кафедры. Будет получено несколько записей, в которых значение ИД_Каф будет то, которое ищем. Последним этапом будет получение информации о сотрудниках, полученных для нужной кафедры в таблице Сотрудники.
В нашем примере в качестве первичного ключа везде использовались специализированные поля (ИД_???), которые добавляются в качестве первичного (по умолчанию) всеми СУБД. Однако это можно изменить, и использовать, скажем, название кафедры, или Фамилию сотрудника, но в этом случае возникли бы проблемы с изменением информации. Кроме того, размер первичного ключа, который необходимо хранить как в головной, так и в зависимой таблице, при этом получается довольно большим.
Таким образом, в теории реляционных БД для внешнего ключа характерны следующие свойства:
1. Каждое значение атрибута внешнего ключа должно являться значением соответствующего потенциального ключа. Причем обратная ситуация необязательно.
2. Количество атрибутов внешнего ключа должно в точности соответствовать количеству атрибутов первичного ключа. Следствием является то, что внешний ключ будет составным (т.е. состоять более чем из одного атрибута) только тогда, когда соответствующий первичный ключ так же является составным. Соответственно, внешний ключ будет простым только в том случае, если соответствующий первичный ключ является простым.
3. Для внешнего ключа не требуется, чтобы он был компонентом первичного ключа в отношении, к которому он принадлежит. Т.о. значение во внешнем ключе могут повторяться, что не возможно для первичного ключа. Например, в одной и той же …
4. Каждый атрибут, входящий в данный внешний ключ, должен быть определен на том же домене, что и соответствующий атрибут соответствующего первичного ключа.
5. Для атрибутов внешнего ключа разрешается иметь значения NULL
Правило ссылочной целостности
БД не должна содержать значений внешних ключей, для которых не существует соответствующих значений первичных ключей. Действительно, если что-либо ссылается на что-то, то это что-то по-хорошему должно существовать.
Любое состояние БД, не удовлетворяющее правилу ссылочной целостности, считается некорректным. Как избежать нарушения этого правила
1. Ограничить (RESTRICT) операции, приводящие к нарушению этого правила;
2. Допустить выполнение таких операций, но при этом выполнять дополнительные действия, исправляющие эту ситуацию (каскадирование CASCADE);
3. Давать пользователю выбирать либо 1, либо 2.
Дополнительными стратегиями поддержания ссылочной целостности являются:
4. Установить в состояние не определено (SET NULL);
5. Установить в состояние по умолчанию (SET DEFAULT).
В реальных СУБД можно также отказаться от использования какой-либо стратегии поддержания ссылочной целостности:
6. Игнорировать (IGNORE) - выполнять операции, не обращая внимания на нарушения ссылочной целостности.
7. Пользователь может разработать свою уникальную стратегию поддержания ссылочной целостности.
Для примера рассмотрим случай, когда пользователь пытается удалить строки таблицы Кафедры (рис 9) со значением К3125 первичного ключа. На это значение ссылается строка таблицы Университеты. Т.о. во-первых, можно вообще запретить удаление этой строки, до тех пор, пока на нее есть ссылки из других таблиц. Удалив все строки со ссылками из таблицы Университеты, можно после этого удалять соответствующую строку из таблицы Кафедры.
|
Университеты |
||||
1 |
У34 |
К3125 |
С1708 |
ВлГУ |
Горького… |
2 |
У35 |
К1729 |
С1471 |
ВлГУ |
Горького… |
3 |
У36 |
К0271 |
С1281 |
МГУ |
Воробьевы |
… |
… |
… |
… |
… |
… |
|
Кафедры |
|
|
Сотрудники |
|||
1 |
К3125 |
ИВТ |
... |
|
1 |
С001 |
Иванов |
2 |
К9128 |
ИСИМ |
... |
|
2 |
С1708 |
Щербинко |
3 |
К0271 |
ИЗИ |
... |
|
3 |
С1281 |
Вершинин |
Рис.9. Пример наполнения таблиц данными
Во-вторых, можно разрешить системе при удалении значения из таблицы Кафедры строки со значением К3125 автоматически удалять из таблицы Университеты все строки, ссылающиеся на это значение строки. Такая операция называется операцией каскадного удаления.
К аналогичным рассуждениям можно придти, если рассматривать операции изменения первичных ключей в таблице, на которые есть ссылки внешних ключей. В этом случае
1) запрещать редактировать строки с первичным ключом, пока есть внешние ссылки;
2) разрешать изменять, но при этом выполнять операции каскадного изменения;
3) соответствующие значения внешних ключей принимают значения NULL.