Реляционная модель данных Эта модель данных реализована во многих существующих СУБД, причем на сегодняшний день она является наиболее распространенной. Основные достоинства реляционного подхода: небольшой набор простых и точных понятий, которые позволяют моделировать разнообразные предметные области; теоретическая поддержка в виде мощного математического аппарата теории множеств и реляционной алгебры; при манипулировании данными не требуется знать физическую организацию БД во внешней памяти. При формальном рассмотрении этой модели, которая относится к низкоуровневым моделям данных, выделяют следующие основные аспекты: структурная организация данных – от этого зависит эффективность хранения данных и скорость их обработки; способы обеспечения целостности данных – для исключения противоречий между взаимосвязанными элементами данных; манипулирование данными, т.е. порядок выполнения конкретных операций при работе СУБД. Структурная организация данных в реляционной модели Основа реляционной модели – математическое понятие отношения (англ. – relation). Физическим представлением отношения является обычная двумерная таблица. В отдельной таблице обычно хранятся данные для некоторого информационного объекта (ИО). При таком способе структурирования данных БД называется реляционной. Примеры информационных объектов Название Реквизиты ИО Фамилия, имя, отчество, пол, Студент год рождения, факультет, курс, группа, оценки, … Фамилия, имя, отчество, пол, год рождения, кафедра, Преподаватель должность, стаж работы, научные труды, … Фамилия, имя, отчество, пол, Пациент год рождения, место работы (учебы), должность, …. В таблице реляционной БД столбцы называют полями и они соответствуют реквизитам ИО, для которого предназначена рассматриваемая таблица. Каждому полю обычно дают содержательное название, причем в отдельной таблице названия полей не должны повторяться. Строки таблицы для хранения данных называют записями (или кортежами). В полях отдельной записи хранятся значения реквизитов для конкретного экземпляра рассматриваемого ИО. Пример таблицы для хранения данных Поле1 Поле2 Фамилия Имя Иванов Василий Петрова Ольга .... .... .... .... ПолеN Возраст 21 19 Заголовок таблицы Запись1 Запись2 При формировании заголовка таблицы порядок расположения столбцов значения не имеет. Количество столбцов определяет степень отношения (таблицы). Унарное отношение имеет степень 1, а бинарное отношение – степень 2. Кардинальность отношения измеряется количеством записей (кортежей). Фундаментальные (базовые) свойства отношения (таблицы) 1. Каждая ячейка отношения содержит только одно элементарное (атомарное, неделимое) значение. 2. Каждая запись является уникальной, т.е. дублирование записей не допускается. Это следует из определения таблицы как множества записей, а каждое множество по определению состоит из различных элементов. 3. Порядок размещения записей не имеет никакого значения, что также вытекает из понятия «множество». При необходимости записи можно упорядочить с помощью операции сортировки, но это уже относится к манипулированию данными. Целостность данных в реляционной модели Эти требования, гарантирующие корректность данных, включают в себя два условия: целостность таблиц (отношений); целостность по ссылкам (ссылочная целостность). Требование целостности таблицы состоит в том, что любая запись в рассматриваемой таблице должна быть отличимой от любой другой записи. Минимальный набор атрибутов, позволяющий однозначно идентифицировать каждую запись рассматриваемого отношения, называется потенциальным ключом. Ключ называют простым, если он состоит из одного атрибута (поля). Например, по номеру налогоплательщика (ИНН) можно однозначно определить его адрес, фамилию и другие персональные данные. Ключ называется составным, если он образован из нескольких атрибутов. Отношение всегда имеет хотя бы один ключ, т.к. в крайнем случае для этой роли можно использовать все множество атрибутов. Тот потенциальный ключ, который выбран для однозначной идентификации записей таблицы, называют первичным ключом (Primary Key — PK). В составе первичного ключа ни один атрибут не может содержать пустых значений (NULL). Остальные потенциальные ключи становятся альтернативными ключами (Alternate Key — AK). Для первичного ключа лучше всего подходит простой ключ типа «целое число». Целостность по ссылкам Требование ссылочной целостности обусловлено тем, что очень часто данные для взаимосвязанных информационных объектов (ИО) хранятся в разных таблицах. Преподаватели (РК) Код_преп Фамилия Имя Отчество Должность (FК) Кафедра Кафедры Код_кафедры Название Телефон Комната (РК) Рассматриваемые таблицы полностью определяют ИО «Кафедра», включая перечень преподавателей по каждой кафедре. В данном случае необходимо, чтобы каждая запись из таблицы «Преподаватели» ссылалась на конкретную запись в таблице «Кафедры». Ссылки должны идти на первичный ключ таблицы «Кафедры», т.к. именно этот атрибут однозначно идентифицирует конкретную кафедру. При этом в таблице «Преподаватели» атрибут «Кафедра», содержащий адреса ссылок, выполняет роль внешнего ключа (Foreign Key — FK). В данной ситуации говорят, что две таблицы связаны по ссылкам. Одной записи из таблицы «Кафедры» обычно соответствует несколько записей в таблице «Преподаватели», поэтому первую таблицу называют главной, а вторую – подчиненной. Требование целостности по ссылкам заключается в следующем: для каждого значения FK в подчиненной таблице должна существовать запись с таким же значением РК в главной таблице. Если это требование не выполняется, то появляются «висячие» (или «дохлые») ссылки. Автоматическая поддержка целостности по ссылкам Ситуации, при которых возможно нарушение целостности связей 1. Обновление подчиненной таблицы, т.е. вставка новых записей или изменение значений внешнего ключа (FK) для существующих записей Действия СУБД Следить, чтобы не появлялись некорректные значения внешнего ключа (FK) и сообщать о таких ситуациях Автоматическая поддержка целостности по ссылкам (продолжение) Ситуации, при которых возможно нарушение целостности связей Действия СУБД 2. Изменение значений Автоматическое первичного ключа (РК) обновление значений в главной таблице внешнего ключа (FK) в связанных записях подчиненных таблиц (каскадное обновление) 3. Из главной таблицы требуется удалить запись, с которой связаны подчиненные записи Возможны три подхода: а) запретить такую операцию, т.е. предварительно нужно удалить подчиненные записи либо соответствующим образом изменить значения FK для этих записей б) во всех подчиненных записях, которые ссылаются на удаляемую запись, присвоить неопределенное значение внешнему ключу (FK) в) одновременно с удалением записи из главной таблицы удалить все подчиненные записи, которые ссылаются на удаляемую запись (каскадное удаление) Установка режимов поддержки целостности связей в СУБД MS Access Реляционная алгебра и реляционное исчисление Реляционная алгебра (РА) и реляционное исчисление (РИ) – это инструменты для манипулирования табличными данными в реляционных БД. В частности, любой запрос к БД можно записать в виде некоторой формулы РА или некоторого выражения (предиката) РИ. Средства РА и РИ эквивалентны между собой, однако отличаются уровнем (степенью) процедурности. РА – это теоретический язык операций, которые позволяют получить на основе одной или нескольких таблиц другую таблицу. Можно конструировать вложенные формулы, причем для любой глубины вложенности результатом всегда является таблица (свойство замкнутости на таблицы). Формулы РА, состоящие из отдельных операндов и операций, имеют четко выраженную процедурность, т.к. результат запроса, который записан в виде формулы РА, вычисляется при поочередном выполнении элементарных операций. В отличие от этого, выражение РИ только формулирует условия, которым должен удовлетворять результат запроса. Поэтому средства РИ являются непроцедурными или декларативными (описательными), т.к. они всего лишь описывают свойства желаемого результата. В совокупности РА и РИ составляют формальную основу реальных языков DML (Data Manipulation Language) для существующих СУБД. К примеру, язык SQL с точки зрения пользователя является непроцедурным языком, т.к. при записи запроса на этом языке в первую очередь указываются источники данных и условия, которым должен удовлетворять требуемый результат. С другой стороны, при выполнении запроса на уровне СУБД реализуется некоторая процедура с использованием операций РА. Операции реляционной алгебры Любая таблица (отношение) – это множество записей, а отдельная запись – это множество значений атрибутов. Следовательно, традиционные операции, которые применяются в теории множеств, пригодны для манипулирования табличными данными в реляционных БД. Дополнением к этому являются специальные операции, которые нужны для работы с базами данных. Теоретикомножественные операции 1. Объединение таблиц 2. Разность таблиц 3. Пересечение таблиц 4. Декартово произведение таблиц Специальные реляционные операции 1. Выборка из таблицы (селекция) 2. Проекция таблицы 3. Соединение таблиц 4. Деление таблиц Этот набор операций РА был предложен Коддом (Codd E.F.) в 1972 г. Среди перечисленных восьми операций основными являются следующие пять: выборка (selection); проекция (projection); декартово произведение (Cartesian product); объединение таблиц (union); разность таблиц (difference). Остальные операции – дополнительные: соединение (join); пересечение (intersection); деление (division). Каждую из дополнительных операций можно выразить в терминах пяти основных. Объединение таблиц: R=XY Результатом этой бинарной операции является таблица R, в которой каждая запись принадлежит либо таблице Х, либо таблице Y. Таблицы Х и Y должны быть совместимыми: одинаковое число атрибутов; соответствующие атрибуты имеют одинаковый домен. ID 123 Х= 124 125 ID ФИО 122 Иванов 124 Y= Петров 125 Смирнов 126 ФИО Васин Петров Смирнов Усов ID 122 R= 123 124 125 126 ФИО Васин Иванов Петров Смирнов Усов Разность таблиц: R=X–Y Результатом этой бинарной операции является таблица R, в которой каждая запись принадлежит таблице Х, но не принадлежит таблице Y. Таблицы Х и Y должны быть совместимыми. ID 222 223 Х= 224 226 228 ФИО Иванов Сидоров Пушкин Цветков Козлов ID 226 Y= 228 225 227 ФИО Цветков Козлов Петров Мухин ID ФИО 222 Иванов R= 223 Сидоров 224 Пушкин Пересечение таблиц: R = XY Результатом этой бинарной операции является таблица R, в которой каждая запись принадлежит как таблице Х, так и таблице Y. ID 122 123 Х= 124 125 126 ФИО Васин Иванов Петров Смирнов Усов ID 121 Y= 124 125 127 ФИО Акимов Петров Смирнов Федоров ID ФИО R= 124 Петров 125 Смирнов Выражение (X–Y) дает записи из Х, которых нет в Y. Тогда из тождества XY=X–(X–Y) вытекает, что операция пересечения является производной от операции разности. Декартово произведение: R=XY Результатом этой бинарной операции является таблица R, в которой все записи получены как неповторяющиеся сцепления одной записи из таблицы Х и одной записи из таблицы Y. Ограничений на структуру таблиц Х и Y нет. A B Х= 1 2 3 2 C 3 2 D E Y= 8 9 10 11 12 13 A B C D E 1 2 3 8 9 1 2 3 10 11 R= 1 2 3 12 13 3 2 2 8 9 3 2 2 10 11 3 2 2 12 13 Проекция таблицы: R=<список>(X) Эта унарная операция получает результирующую таблицу R путем удаления из таблицы Х всех атрибутов, которые не входят в заданный список. Повторяющиеся записи исключаются. ID ФИО Пол Группа 123 Иванов ФИО Группа Иванов С-86 Петрова С-87 378 Смирнов С-87 R=ФИО, Группа(Х)= муж С-87 Смирнов С-87 272 Усова жен Усова С-86 муж С-86 Х= 245 Петрова жен С-86 Выборка из таблицы: R=<условие>(X) Эта унарная операция включает в результирующую таблицу R только те записи из таблицы Х, которые удовлетворяют заданному условию. ID 123 Х= 245 378 272 ФИО Иванов Петрова Смирнов Усова Пол муж ID ФИО Пол жен R=Пол=муж(Х)= 123 Иванов муж муж 378 Смирнов муж жен Операция соединения (join) При этой операции соединяются записи, которые хранятся в разных таблицах и характеризуются определенными логическими связями. Операция соединения имеет несколько разновидностей. 1. Естественное соединение: R=X▷◁Y Из таблиц Х и Y связываются записи, которые имеют равные значения в общих (одноименных) столбцах. В таблице R каждый из общих столбцов остается в единственном экземпляре. Х= ID ФИО Группа 1 2 3 4 Иванов Петрова Смирнов Усова С-86 С-87 С-87 С-86 R=X▷◁Y= ID ФИО 2 3 4 Петрова Смирнов Усова ID Оценка Y= 2 4 3 5 4 5 3 4 Группа Оценка С-87 С-87 С-86 4 3 5 2. -соединение: R=X ▷◁ Y Из таблиц Х и Y связываются записи, в которых значения для определенных столбцов удовлетворяют заданному условию . Условие записывается в виде логического выражения, в котором могут присутствовать следующие операторы сравнения: =, <>, <, >, <=, >=. X ▷◁ Y = (X Y) Если в выражении используется только условие равенства (=), то -соединение называют эквисоединением. 3. Внешнее соединение (outer join) Для этой операции существует несколько разновидностей. Левое внешнее соединение: R=X ◁Y Выполняется как естественное соединение, но в таблицу R попадают даже те записи из таблицы Х, для которых не подходит ни одна из записей в таблице Y. Следовательно, в таблицу R включаются абсолютно все данные из таблицы Х. Х= ID ФИО Группа 1 2 3 4 Иванов Петрова Смирнов Усова С-86 С-87 С-87 С-86 ID R=X◁Y= 1 2 3 4 ФИО Иванов Петрова Смирнов Усова ID Оценка Y= 2 4 3 5 4 5 3 4 Группа Оценка С-86 С-87 С-87 С-86 NULL 4 3 5 Правое внешнее соединение: R=X▷ Y Выполняется как естественное соединение, но в таблицу R попадают даже те записи из таблицы Y, для которых не подходит ни одна из записей в таблице Х. Следовательно, в таблицу R включаются абсолютно все данные из таблицы Y. Полное внешнее соединение: R=X Y Формируется как объединение результатов левого и правого внешних соединений для таблиц Х и Y: X Y = (X ◁Y) (X▷ Y) Х= ID ФИО Группа 1 2 3 4 Иванов Петрова Смирнов Усова С-86 С-87 С-87 С-86 ID R=X▷Y= 2 4 3 5 ФИО Петрова Усова Смирнов NULL ID Оценка Y= 2 4 3 5 4 5 3 4 Группа Оценка С-87 С-86 С-87 NULL 4 5 3 4 Х= ID ФИО Группа 1 2 3 4 Иванов Петрова Смирнов Усова С-86 С-87 С-87 С-86 ID R=XY= 1 2 3 4 5 ID Оценка Y= 2 4 3 5 4 5 3 4 ФИО Группа Оценка Иванов Петрова Смирнов Усова NULL С-86 С-87 С-87 С-86 NULL NULL 4 5 3 4 Примеры запросов в виде формул РА Рассмотрим БД со следующей структурой: Запрос 1: вывести список клиентов, которые покупали товар с кодом 2518 Вариант 1 A := CUSTOMERS▷◁ SALES R := CUST_NAME( PROD_ID=2518(A) ) Вариант 2 A := PROD_ID=2518(SALES) R := CUST_NAME(CUSTOMERS▷◁ A) Для варианта 2 кардинальность таблицы А значительно меньше, чем у таблицы SALES. Следовательно, в этом случае операция соединения выполняется существенно быстрее. Запрос 2: вывести список клиентов, которые покупали товар ХХХХХ A := PROD_NAME=“XXXXX”(PRODUCTS) B := SALES ▷◁ A R := CUST_NAME(CUSTOMERS▷◁ B )