
- •Часть 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. Резюме
9.5. Замыкание множества атрибутов
Хотя в предыдущем разделе так и не был дан эффективный алгоритм для вычисления замыкания S+ на основе множества функциональных зависимостей S, в этом разделе описан алгоритм определения, будет ли данная ФЗ находиться в данном замыкании. Для этого прежде всего следует дать определение понятию суперключ. Суперключ отношения R— это множество атрибутов отношения R, которое содержит в виде подмножества , но не обязательно собственного подмножества, по крайней мере один потенциальный ключ. ( Определение термина «суперключ», таким образом, может быть выведено из понятия «потенциальный ключ».) Таким образом, отсюда следует, что суперключи для данного отношения R – это такие подмножества К множества атрибутов отношения R , что функциональная зависимость
К -> А
истинна для каждого атрибута А отношения R.
Теперь предположим, что известны некоторые ФЗ, выполняющиеся для данного отношения, и требуется определить потенциальные ключи этого отношения. По определению потенциальными ключами называются неприводимые суперключи (т.е. суперключ содержит потенциальный ключ). Таким образом, выясняя, является ли данное множество атрибутов К суперключом, можно в значительной степени продвинуться к выяснению вопроса, является ли К потенциальным ключом.
Для этого нужно определить, будет ли набор атрибутов отношения R множеством всех атрибутов, функционально зависящих от К. Таким образом, для заданного множества зависимостей S, которые выполняются для отношения R, необходимо найти способ определения множества всех атрибутов отношения R, которые функционально зависимы от К, т.е. так называемое замыкание К + множества К для S. Простой алгоритм вычисления этого замыкания показан на рис. 9.2. Ниже даны пояснения. Упражнение. Докажите, что этот алгоритм правильный.
CLOSURE[К,S]:= К ;
do "forever" ; /* выполняется всегда */
for each FD X -> Y in S /*для каждой ФЗ X -> У в S */ do ;
if X is subset of CLOSURE [K,S} /* если является подмножеством */
then CLOSURE [К, S] := CLOSURE [К, S] UNION Y;
end ;
if CLOSURE[K,S]did not change on this iteration then leave loop ;
/* если на этой итерации изменений не произошло,
вычисления завершаются */
end ;
Рис. 9.2. Вычисление замыкания K+ множества К для S
Пример. Предположим, что дано отношение R с атрибутами А, В, С, D, Е и F и следующими ФЗ:
А -> ВС
Е -> CF .
В -> Е
CD -> EF
Теперь вычислим замыкание {А, В}+ множества атрибутов {А, В} для данного множества ФЗ.
1. Присвоим замыканию CLOSURE [K, S] начальное значение — множество {А, В}.
2. Теперь выполним внутренний цикл четыре раза, по одному разу для каждой ФЗ. На первой итерации (для зависимости А -> ВС) будет обнаружено, что левая часть действительно является подмножеством замыкания CLOSURE [K, S]; таким образом, к результату можно добавить атрибуты В и С. Замыкание CLOSURE[K, S] теперь представляет собой множество {А, В, С}.
3. На второй итерации (для зависимости Е -> CF) можно обнаружить, что левая часть не является подмножеством полученного до этого момента результата, который, таким образом, остается неизменным.
останется неизменным.
4. На третьей интерации ( для зависимости B ->E ) множество Е будет добавлено к замыканию CLOSURE[K, S], которое теперь будет иметь вид{А, В, С, Е}.
5. На четвертой интерации ( для зависимости CD ->EF ) замыкание CLOSURE[K, S] останется неизменным.
6. Теперь внутренний цикл будет выполнен еще четыре раза. На первой интерации результат останется прежним, на второй он будет расширен до {А, В, С, E, F } , а на третьей и четвертой — снова не изменится.
7. Наконец, после еще одного четырехкратного прохождения цикла замыкание CLOSURE[K, S] остается неизменным и весь процесс в целом завершается с результатом {А, В, С, Е, F}+={A, В, С, Е, F}. Обратите внимание, что {А,B} не является суперключом (и, следовательно, потенциальным ключом).
Из сказанного выше можно сделать очень важное заключение: для множества функциональных зависимостей S можно легко указать, будет ли заданная зависимость X ->Y следовать из S, поскольку это возможно тогда и только тогда, когда Y является подмножеством замыкания X+ множества Х для заданного множества S. Иначе говоря, таким образом представлен простой способ определения , будет ли данная функциональная зависимость X—> Y включена в замыкание S+ множества S.