Реляционная модель важна по двум причинам. Во-первых, поскольку конструкции реляционной модели имеют широкий и общий характер, она позволяет описывать структуры баз данных независимым от СУБД образом Во-вторых, реляционная модель является основой почти всех СУБД Таким образом, понимание принципов этой модели существенно
В этой лекции даются основы реляционной модели (relational model) и объясняются фундаментальные принципы нормализации (normalization) Мы начнем с того факта, что не все отношения одинаковы некоторые из них более предпочтительны, чем другие Нормализация - это процесс преобразования отношения, имеющего некоторые недостатки, в отношение, которое этих недостатков не имеет Что еще более важно, нормализацию можно использовать как критерий для определения желательности и правильности отношений. Вопрос о том, что такое хорошо структурированное отношение, был предметом многочисленных теоретических исследований Термин нормализация обязан своим появлением одному из пионеров технологии баз данных, Э. Ф Кодду (Е F Codd), который определил различные нормальные формы (normal forms) отношений. В этой лекции мы обсудим нормализацию. Формальное, более тщательное исследование данного вопроса можно найти в работе Дейта и Ульмана (С J. Date и J D Ullman)[1]
Отношение (relation) — это двумерная таблица. Каждая строка в таблице содержит данные, относящиеся к некоторой вещи или какой-то ее части. Каждый столбец таблицы описывает какой-либо атрибут этой вещи. Иногда строки называются кортежами (tuples), а столбцы — атрибутами (attributes).
Термины отношение, кортеж и атрибут пришли из реляционной математики, которая является теоретическим источником этой модели. Профессионалы MIS предпочитают употреблять аналогичные термины файл (file), запись (record) и поле (field), а большинство пользователей находят более удобными термины таблица (table), строка (row) и столбец (column). Все эти термины сведены в таблицу 13.1.
Таблица 13.1. Эквивалентная терминология реляционной модели
Реляционная модель |
Программист |
Пользователь |
Отношение |
Файл |
Таблица |
Кортеж (строка) |
Запись |
Строка |
Атрибут |
Поле |
Столбец |
Чтобы таблица была отношением, она должна удовлетворять определенным ограничениям[2]. Во-первых, значения в ячейках таблицы должны быть одиночными - ни повторяющиеся группы, ни массивы не допускаются[3]. Все записи в столбце должны быть одного типа. Например, если третий столбец первой строки таблицы содержит номер сотрудника, то и во всех остальных строках таблицы третий столбец также должен содержать номер сотрудника. Каждый столбец имеет уникальное имя; порядок столбцов в таблице несуществен. Наконец, в отношении не может быть двух одинаковых строк, и порядок строк не имеет значения.
В таблице 13.2 представлен пример отношения. Отношение имеет семь строк, в каждой из которых четыре столбца. Если бы мы расположили столбцы в ином порядке (скажем, поместив ТабельныйНомер в крайний левый столбец) или переставили бы строки (например, по возрастанию значения столбца Возраст), мы получили бы эквивалентное отношение.
Таблица 13.2. Отношение СОТРУДНИК
|
Атрибут1 Имя |
Атрибут 2 Возраст |
Атрибут 3 Пол |
Атрибут 4 ТабельныйНомер |
Кортеж 1 |
Андерсон |
21 |
Ж |
010110 |
Кортеж 2 |
Деккер |
22 |
М |
010100 |
|
Джексон |
22 |
М |
101000 |
|
Гловер |
21 |
Ж |
201100 |
|
Мур |
19 |
М |
111100 |
|
Наката |
20 |
Ж |
111101 |
Кортеж 7 |
Смит |
19 |
М |
111111 |
Таблица 13.2 представляет отдельный экземпляр отношения. Обобщенный формат отношения - СОТРУДНИК (Имя, Возраст, Пол, ТабельныйНомер) - называется структурой отношения, и именно это большинство людей имеет в виду, используя термин отношение.
Чтобы понять, что такое нормализация, мы должны определить два важных термина: функциональная зависимость и ключ.
Функциональная зависимость (functional dependency) — это связь между атрибутами. Предположим, что если мы знаем значение одного атрибута, то можем вычислить (или найти) значение другого атрибута. Например, если нам известен номер счета клиента, то мы можем определить состояние его счета. В таком случае мы можем сказать, что атрибут СостояниеСчетаКлиента функционально зависит от атрибута НомерСчетаКлиента.
Говоря более общим языком, атрибут Y функционально зависит от атрибута X, если значение X определяет значение Y. Другими словами, если нам известно значение X, мы можем определить значение Y.
Уравнения выражают функциональные зависимости. Например, если мы знаем цену и количество приобретенного товара, мы можем определить стоимость покупки по следующей формуле:
Стоимость = Цена * Количество
В этом случае мы могли бы сказать, что атрибут Стоимость функционально зависит от атрибутов Цена и Количество.
Функциональные зависимости между атрибутами в отношении обычно не выражаются уравнениями. Пусть, например, каждому студенту присвоен уникальный идентификационный номер, и у каждого студента есть одна и только одна специальность. Имея номер студента, мы можем узнать его специальность, поэтому атрибут Специальность функционально зависит от атрибута НомерСтудента. Или рассмотрим компьютеры в вычислительной лаборатории. Каждый компьютер имеет конкретный размер основной памяти, поэтому атрибут Объем Памяти функционально зависит от атрибута СерийныйНомерКомпьютера.
В отличие от случая с уравнением, такие функциональные зависимости нельзя разрешить при помощи арифметики; вместо этого они хранятся в базе данных. Фактически, можно утверждать, что базу данных стоит иметь только ради хранения и выдачи функциональных зависимостей.
Функциональные зависимости обозначаются следующим образом:
НомерСтудента > Специальность
СерийныйНомерКомпьютера > ОбъемПамяти
Первое выражение читается так: «атрибут НомерСтудента функционально определяет атрибут Специальность», «атрибут НомерСтудента определяет атрибут Специальность» или «атрибут Специальность зависит от атрибута НомерСтудента». Атрибуты по левую сторону от стрелки называются детерминантами (determinants).
Как уже говорилось, если номер студента определяет специальность, то каждому номеру студента соответствует только одна специальность. Между тем, одной и той же специальности может соответствовать более одного номера студента. Пусть студент под номером 123 специализируется на бухгалтерском учете. Тогда для любого отношения, где присутствуют столбцы НомерСтудента и Специальность, выполнится условие: если НомерСтудента = 123, то Специальность - Бух-галтерскийУчет. Обратное, однако, неверно: если Специальность = БухгалтерскийУчет, то атрибут НомерСтудента может принимать различные значения, так как на бухгалтерском учете может специализироваться много студентов. Следовательно, мы можем сказать, что связь атрибутов НомерСтудента и Специальность имеет вид N:l. В общем случае можно утверждать, что если А определяет В, связь между значениями А и В имеет вид N:l.
В функциональные зависимости могут быть вовлечены группы атрибутов. Рассмотрим отношение ОЦЕНКИ (НомерСтудента, Дисциплина, Оценка). Комбинация номера студента и дисциплины определяет оценку. Такая функциональная зависимость записывается следующим образом:
(НомерСтудента, Дисциплина) > Оценка
Заметьте, что для определения оценки требуется как номер студента, так и дисциплина. Мы не можем разделить эту функциональную зависимость, поскольку ни номер студента, ни дисциплина не определяют оценку сами по себе.
Обратите внимание на следующее различие. Если X > (Y, Z), то X > Y и X > Z. Например, если НомерСтудента > (ИмяСтудента, Специальность), то НомерСтудента > ИмяСтудента и НомерСтудента > Специальность. Но если (X, Y) > Z, то в общем случае неверно, что X > Y или X > Z. Следовательно, если (НомерСтудента, Дисциплина) > Оценка, то ни номер студента, ни дисциплина как таковые оценку не определяют.
Ключ (key) — это группа из одного или более атрибутов, которая уникальным образом идентифицирует строку. Рассмотрим отношение СЕКЦИЯ (рис. 5.3), имеющее атрибуты НомерСтудента, Секция и Плата. Строка этого отношения содержит информацию о том, что студент посещает определенную секцию за определенную плату. Предположим, что студент одновременно не может посещать более одной секции. В этом случае значение атрибута НомерСтудента идентифицирует единственную строку, поэтому данный атрибут является ключом.
СЕКЦИЯ (НомерСтудента, Секция, Плата)
Ключ: НомерСтудента Sample Data
НомерСтудента Секция Плата
100 Лыжи 200
150 Плавание 50
175 Теннис 50
200 Плавание 50
Рис. 5.3. Отношение СЕКЦИЯ
Ключи могут также составляться из нескольких атрибутов. Например, если студентам разрешено одновременно посещать более одной секции, то один и тот же номер студента может появиться в разных строках таблицы, поэтому атрибут НомерСтудента не будет уникальным образом определять строку. Для этого потребуется какое-то сочетание атрибутов; возможно, это будет комбинация (НомерСтудента, Секция).
Попутно отметим, что в предыдущем абзаце затронут тонкий, но весьма важный аспект, Являются ли атрибуты ключами и являются ли они функционально зависимыми - это определяется не абстрактным набором правил, а моделями, присутствующими в воображении пользователей, а также деловым регламентом организации, использующей базу данных. Что в приведенном выше примере является ключом - НомерСтудента, комбинация (НомерСтудента, Секция) или какое-то еще сочетание атрибутов, - целиком и полностью определяется тем, как представляют себе ситуацию люди, работающие в организации, которая использует базу данных. Ответы на эти вопросы мы должны получить от пользователей По ходу дальнейшего изложения имейте в виду, что все наши предположения о функциональных зависимостях, ключах, ограничениях и тому подобных вещах определяются моделями в воображении пользователей.
Допустим, в ходе опроса пользователей мы выяснили, что студентам разрешено одновременно быть записанными в несколько спортивных секций. Эта ситуация отражена в отношении СЕКЦИИ (рис. 5.4). Как мы отметили, НомерСтудента не является ключом этого отношения. В самом деле, студент с номером 100 посещает секцию гольфа и секцию лыж, и атрибут НомерСтудента со значением 100 появляется в двух различных строках. Фактически, для этого отношения ни один атрибут сам по себе не является ключом, то есть ключ должен состоять из двух или более атрибутов.
НомерСтудента Секция Плата
100 Лыжи 200
100 Гольф 65
150 Плавание 50
175 Сквош 50
175 Плавание 50
200 Плавание 50
200 Гольф 65
Рис. 5.4. Отношение СЕКЦИИ
Рассмотрим, какие комбинации из двух атрибутов возможны для данной таблицы. Таких комбинаций имеется три: (НомерСтудента, Секция), (НомерСтудента, Плата) и (Секция, Плата). Является ли какая-либо из этих комбинаций ключом? Чтобы быть ключом, группа атрибутов должна уникальным образом идентифицировать строку. Опять-таки, ответы на подобные вопросы мы должны получить от пользователей. Наше решение не должно основываться на выборочных данных, подобных тем, которые приведены на рис. 5.4, или на наших собственных предположениях.
Допустим, поговорив с пользователями, мы пришли к выводу, что плата за абонемент в различных секциях может совпадать. Поскольку это так, комбинация (НомерСтудента, Плата) не может уникальным образом определить строку. Например, студент с номером 100 может посещать две различных секции, каждая из которых стоит $200. Это означает, что комбинация (100, $200) возникла бы в таблице дважды, поэтому такая комбинация не может быть ключом.
Может ли быть ключом сочетание (Секция, Плата)? Может ли комбинация (Лыжи, $200) уникальным образом определить строку? Нет, не может, поскольку секцию лыж может посещать много студентов. А как насчет сочетания (Номер-Студента, Секция)? Имея те сведения, которые мы получили от пользователей, можно ли сказать, что комбинация значения атрибутов НомерСтудента и Секция уникальным образом определяет строку таблицы? Да, можно, пока от нас не требуется вести записи об истории посещения секций студентом. Иными словами, должна ли эта таблица содержать сведения только о тех секциях, которые студент посещает на данный момент, или же в ней должны быть записи о секциях, которые студент посещал ранее?
И снова, чтобы ответить на этот вопрос, мы должны обратиться к пользователям. Предположим, мы выяснили, что необходимо хранить сведения только о посещаемых в настоящий момент секциях. Тогда комбинация (НомерСтудента, Секция) может уникальным образом определить строку отношения и, следовательно, эта комбинация является ключом данного отношения. Если бы пользователи указали, что должны также храниться записи о секциях, которые посещались в прошлом, то отношение на рис. 5.3 имело бы дублирующиеся строки. Поскольку это недопустимо по определению отношения, нам пришлось бы добавить другие атрибуты, например атрибут Дата.
Это приводит нас к важному заключению. Каждое отношение имеет минимум один ключ. Это утверждение должно быть верным, поскольку ни одно отношение не может иметь одинаковых строк, и, следовательно, в крайнем случае ключ будет состоять из всех атрибутов отношения.
Реляционная модель важна по двум причинам: во-первых, с ее помощью можно описывать структуры баз данных независимым от СУБД образом, а во-вторых, эта модель лежит в основе значительной части современных СУБД. Критерием правильности и желательности отношений может служить нормализация.
Отношение — это двумерная таблица, в ячейках которой записаны одиночные значения. Все значения в одном столбце принадлежат к одному и тому же типу; каждый столбец имеет уникальное имя; порядок следования столбцов несуществен. Столбцы называются также атрибутами. В отношении не может быть двух одинаковых строк, а порядок следования строк несуществен. Строки называются также кортежами. Термины таблица, файл и отношение являются синонимами; то же самое можно сказать о терминах столбец, поле и атрибут; термины строка, запись и кортеж также синонимичны.
Функциональная зависимость — это связь между атрибутами. Y функционально зависит от X, если значение X определяет значение Y. Детерминантом называется группа из одного или нескольких атрибутов, находящаяся с левой стороны функциональной зависимости. Например, если X определяет Y, то X является детерминантом. Ключ — это группа из одного или нескольких атрибутов, которая однозначно определяет кортеж. Каждое отношение имеет минимум один ключ; поскольку каждая строка уникальна, в самом крайнем случае ключом является совокупность всех атрибутов отношения. Хотя ключ всегда уникален, детерминант функциональной зависимости может таковым и не быть. Являются ли атрибуты ключами и являются ли они функционально зависимыми — это определяется не абстрактным набором правил, а тем смыслом, который вкладывают пользователи в эти атрибуты.
В некоторых отношениях в результате обновления данных возникают нежелательные последствия, называемые аномалиями модификации. Аномалия удаления — это ситуация, когда удаление одной строки из отношения вызывает потерю информации о двух или более фактах. Аномалией вставки называется ситуация, когда реляционная структура вынуждает добавлять информацию одновременно о двух фактах. Аномалии могут быть устранены путем разбиения исходного отношения на два.
Существует много типов аномалий модификации. Отношения можно классифицировать по типам аномалий, которые ими ликвидируются. Типы, на которые подразделяются отношения в рамках этой классификации, называются нормальными формами.
По определению каждое отношение находится в первой нормальной форме. Отношение находится во второй нормальной форме, если каждый из его неключевых атрибутов зависит от всего ключа. Отношение находится в третьей нормальной форме, если оно находится во второй нормальной форме и не имеет транзитивных зависимостей. Отношение находится в нормальной форме Бойса-Кодда, если каждый его детерминант является ключом-кандидатом. Отношение находится в четвертой нормальной форме, если оно находится в нормальной форме Бойса-Кодда и не имеет многозначных зависимостей. Определение пятой нормальной формы не имеет интуитивной интерпретации, и поэтому мы его не приводили.
Отношение находится в доменно-ключевой нормальной форме, если каждое ограничение, накладываемое на отношение, является логическим следствием определения доменов и ключей. Под ограничением здесь понимается любое условие, определяющее возможные статические значения атрибутов, истинность которого может быть проверена. Домены, как они определены нами, имеют физическую и семантическую составляющие. В контексте ДКНФ, однако, под доменом подразумевается только физическое описание.
Неформальная интерпретация ДКНФ заключается в том, что каждое отношение должно иметь только одну тему. Например, в отношении может содержаться информация о профессорах или о студентах, но не о тех и других одновременно.
Нормализация - это процесс анализа отношений. Отношения можно также строить синтетическим путем, рассматривая связи между атрибутами. Если два атрибута функционально определяют друг друга, между ними имеется связь вида «один к одному». Если один из двух атрибутов функционально определяет второй, между этими атрибутами имеется связь «многие к одному». Если ни один из двух атрибутов не определяет другой, между этими атрибутами имеется связь «многие ко многим».
В некоторых случаях нормализация нежелательна. Всякий раз, когда исходная таблица разбивается на две или более новых, возникают ограничения ссылочной целостности. Если расходы на дополнительную обработку двух таблиц И обеспечение ссылочной целостности превышают выгоду от устранения аномалий модификации, нормализация не рекомендуется. Вдобавок в некоторых случаях создание повторяющихся столбцов предпочтительнее обычных способов нормализации, а в других случаях для повышения производительности вводится преднамеренная избыточность
Скачано с www.znanio.ru
[1] С J Date, An Introduction to Database Systems, Sixth Edition (Reading, MA Addison-Wesley, 1994), и J D Ullman and Jennifer Widom, A First Course in Database Systems (Upper Saddle River, NJ Prentice Hall, 1997)
[2] E. F. Codd, «A relational Model of Data for Large Shared Databanks», Communications of the ACM, июнь , ШО, с 377-387
[3] Это не означает, что значения должны быть фиксированной длины. Текстовое поле с записью переменной длины, например, является вполне допустимым значением. Однако ячейка может содержать лишь одно такое значение.
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.