
- •Часть 3 Проектирование базы данных
- •Глава 9. Функциональные зависимости.
- •9.1. Введение
- •9.2. Основные определения
- •9.3. Тривиальные и нетривиальные зависимости
- •9.4. Замыкание множества зависимостей
- •9.5. Замыкание множества атрибутов
- •9.6. Неприводимое множество зависимостей
- •9.7. Резюме
- •Глава 10 Дальнейшая нормализация:
- •1Нф, 2нф, 3нф, нфбк
- •10.1. Введение
- •10.2. Декомпозиция без потерь и функциональные зависимости
- •10.3. Первая, вторая и третья нормальные формы
- •10.4. Сохранение зависимости
- •10.5. Нормальная форма Бойса-Кодда
- •10.6. Резюме
- •Глава 12 Модель типа объект/отношение
- •12.1. Введение
- •12.2. Общий подход
- •12.3. Обзор модели объект/отношение
- •12.4. Диаграммы объект/отношение
- •12.5. Проектирование базы данных на основе модели типа объект/отношение
- •12.6. Краткий анализ
- •12.7. Резюме
10.2. Декомпозиция без потерь и функциональные зависимости
Прежде чем приступить к рассмотрению подробностей процедуры нормализации, следует обсудить один существенный аспект этой процедуры, а именно концепцию декомпозиции без потерь. Как уже упоминалось, процедура нормализации включает разбиение, или декомпозицию данного отношения на другие отношения, причем декомпозиция должна быть обратимой, т.е. выполняться без потерь информации. Иначе говоря, интерес представляют только те операции, которые выполняются без потерь информации. Вопрос о том, происходит ли утрата информации при декомпозиции, тесно связан с концепцией функциональной зависимости.
В качестве примера рассмотрим уже знакомое отношение поставщиков S с атрибутами {S#, STATUS, CITY} (для упрощения задачи атрибут SNAME в данном случае игнорируется). На рис. 10.3 показан пример записей этого отношения (некоторое подмножество, приводимых ранее значений этого примера) с указанием двух его возможных декомпозиции: (а) и (б).
Внимательно ознакомившись с этими декомпозициями, можно заметить две особенности.
В случае (а) информация не утрачивается, поскольку отношения SST и SC все еще содержат данные о том, что поставщик S3 имеет статус 30 и находится в Париже (Paris), а поставщик S5 имеет статус 30 и находится в Афинах (Athens). Иначе говоря, первая декомпозиция действительно является декомпозицией без потерь.
В случае (б), наоборот, некоторая информация утрачивается, поскольку оба поставщика имеют статус 30, но при этом нельзя сказать, какой из них в каком городе находится. Иначе говоря, вторая декомпозиция не является декомпозицией без потерь.
S
-
S#
STATUS
CITY
S3
S5
30
30
Paris
Athens
а) SST
-
S#
STATUS
S3
S5
30
30
SC
-
S#
CITY
S3
S5
Paris
Athens
б) SST
-
S#
STATUS
S3
S5
30
30
STC
-
STATUS
CITY
30
30
Paris
Athens
Рис. 10.3. Отношение S и две его возможные декомпозиции
Почему получилось так, что одна декомпозиция происходит без потерь, а другая - с потерей информации? Прежде всего, следует отметить, что процесс, который до сих пор назывался "декомпозицией", на самом деле является проектированием, т. е. каждое из показанных на рис. 10.3 отношений — SST, SC и STC — в действительности является проекцией исходного отношения S. Таким образом, оператор декомпозиции в процедуре нормализации фактически является оператором проектирования.
Обратите внимание, что в случае (а) сохранение информации в полном объеме означает, что при обратном соединении отношений SST и SC будет получено исходное отношение S. В случае (б), наоборот, при обратном соединении отношений SST и SC не будет получено исходное отношение S, а это значит, что некоторая информация будет утрачена. (Точнее, в исходном отношении S вместе со всеми кортежами будут содержаться "ложные" кортежи. Поскольку не существует общего метода для различения ложных и подлинных кортежей, информация в этом случае будет утеряна.) Иначе говоря, "обратимость" означает, что исходное отношение равно соединению его проекций. Если оператором декомпозиции в процедуре нормализации является операция проектирования, то обратной операцией должна быть операция соединения (конечно, в смысле естественного соединения по атрибутам с общими именами).
Исходя из сказанного выше, можно задать следующий вопрос. Пусть R1 и R2 - проекции некоторого отношения R, содержащие все атрибуты отношения R. Какие условия должны быть соблюдены для того, чтобы при обратном соединении R1 и R2 гарантировать получение исходного отношения R? Именно для ответа на этот вопрос и возникает необходимость использования функциональных зависимостей. В рассматриваемом примере отношение S удовлетворяет представленному ниже неприводимому множеству ФЗ. (Далее в этой главе будет считаться, что ФЗ независимы от времени, т.е. выполняются для всех допустимых значений соответствующего отношения. Подробнее неприводимые множества ФЗ описаны в главе 9.)
S# STATUS
S# CITY
При условии, что данное отношение удовлетворяет приведенным ФЗ, можно предположить, что отношение S равно соединению его проекций {S#, STATUS} и {S#, CITY}. И это действительно так, что подтверждается теоремой Хеза (Неаth) [ 10.4].
Теорема Хеза. Пусть R {A, B, C} является отношением, где А, В, С –атрибуты этого отношения. Если R удовлетворяет зависимости А В, то R равно соединению его проекций {A,B} и {A, C}.
Если обозначить А как S#, В как STATUS, С как CITY, то эта теорема утверждает, как уже отмечалось выше, что отношение S может быть разбито с помощью операции декомпозиции на проекции {S#, STATUS} и {S#, CITY} без утраты информации.
В то же время уже известно, что отношение S не может быть разбито без потери информации на проекции {S#, STATUS} и {STATUS, CITY}. Теорема Хеза не дает объяснения, почему так происходит. (Дело в том, что она формулируется как "если..., то...", а не "тогда и только тогда, когда...". Об этом также идет речь в упражнениях в конце главы. Более строгая формулировка теоремы Хеза будет представлена в главе 11.) Однако интуитивно можно предположить, что при такой декомпозиции утрачивается одна из функциональных зависимостей, т.е. зависимость S# STATUS еще будет присутствовать (благодаря проекции {S#, STATUS}), а зависимость S# CITY будет утрачена.
Еще о функциональных зависимостях
В завершение перечислим некоторые дополнительные замечания, касающиеся ФЗ.
1. Неприводимые слева ФЗ. Согласно главе 9 функциональная зависимость называется неприводимой слева, если ее левая часть "не очень велика". Рассмотрим, например, отношение SCP, приведенное выше в этой главе, которое удовлетворяет следующей ФЗ:
{ S#, Р# } CITY
Однако атрибут Р# в левой части является избыточным для этой ФЗ, и она может быть переписана:
S# CITY
(Атрибут CITY функционально зависит от S#.) Эта последняя ФЗ является неприводимой слева. Таким образом, можно сказать, что атрибут CITY неприводимо зависим от S#, но не неприводимо зависим от {S#,P#}. (Здесь термины "неприводимо зависим" и "неприводимая слева ФЗ" используются вместо терминов "полная ФЗ" и "полностью зависимая", которые часто можно встретить в литературе и прежних изданиях этой книги. Хотя последние термины отличаются краткостью, они менее информативны и потому не очень удобны.)
Неприводимые слева ФЗ и неприводимые зависимости играют важную роль для определения второй и третьей нормальной формы (подробнее это обсуждается в разделе 10.3).
P#
QTY
2. Диаграммы ФЗ (также называются схемами ФЗ). Пусть дано отношение R и некоторое неприводимое множество зависимостей I для этого отношения, которое можно представить в виде диаграммы функциональных зависимостей (диаграммы ФЗ). На рис. 10.4 показаны достаточно понятные по построению диаграммы ФЗ для отношений S, SP и Р соответственно. Такие диаграммы будут часто использоваться далее в этой главе.
Как видно из рис. 10.4 каждая стрелка начинается с потенциального ключа ( на самом деле с первичного ключа) соответствующего отношения. По определению стрелки должны начинаться с каждого потенциального ключа, поскольку одному значению такого ключа всегда соответствует, по крайней мере, еще одно какое-то значение. Некоторые стрелки следовало бы исключить ввиду того, что они вызывают определенные трудности, но стрелки, начинающиеся с потенциальных ключей, никогда не могут быть исключены. Таким образом, процедуру нормализации можно было бы неформально охарактеризовать как процедуру исключения стрелок, которые не начинаются с потенциальных ключей.
3. ФЗ как семантическое понятие. Конечно, ФЗ — это особый вид ограничений целостности, а потому это, несомненно, семантическое понятие. Распознавание ФЗ является частью процесса выяснения смысла тех или иных данных, ведь если отношение S удовлетворяет зависимости S# CITY, это значит, что каждый поставщик находится точно в одном городе. Иначе эту ситуацию можно охарактеризовать следующим образом.
В реальном мире существует некоторое ограничение, представленное в этой базе данных, а именно: каждый поставщик находится точно в одном городе.
Поскольку это ограничение является частью семантики, оно должно быть каким-то образом представлено в базе данных.
Для этого ограничение следует задать в определении базы данных таким образом, чтобы оно могло быть приведено в действие в СУБД.
Способом задания ограничения в определении базы данных является объявление ФЗ.
Как будет показано ниже, концепции нормализации приводят к весьма простым способам объявления ФЗ.