3. Аномалии в базе данных
Аномалии в базе данных возникают вследствие наличия избыточности. Избыточность возникает при попытке ввести слишком большой объем информации в одно отношение.
При прямом преобразовании ODL и E/R-моделей в реляционные схемы данных часто возникают аномалии. Аномалии не позволяют создать хорошую реляционную базу данных.
Первая нормальная форма. Любая таблица, удовлетворяющая требованию отношения, находится в первой нормальной форме. Требования к первой нормальной форме следующие:
ячейки таблицы содержат данные простых типов;
все данные в столбце имеют один тип;
каждый столбец имеет уникальное имя;
в таблице нет одинаковых строк.
Вторая нормальная форма. Отношение находится во второй нормальной форме, если не ключевые атрибуты отношения зависят от ключевых атрибутов. Для отношения Artists ключевыми атрибутами являются {name,street,city,playIn} определяет амплуа актера, и характеристики спектаклей, в которых он участвует {ampoule,year,runningTime}.
Actors
-
name
аmpoule
city
street
playIn
year
Running Time
Olga Borodina
singer
Saint-Petersburg
Great Sea-st 33
Carmen
1966
3
Irina Bogacheva
singer
Saint -Petersburg
Nevsky 46
War and Peace
1940
4
Yury Marusin
singer
Saint -Petersburg
Small Sea-st 24
Carmen
1966
3
Ulyana Lopatkina
dancer
Saint -Petersburg
Garden-st 77
The Dying Swan
1910
1
Приведенное отношение имеет аномалию удаления, поскольку удалив строку с балериной Ulyana Lopatkina , мы потеряем информацию о балете “The Dying Swan”. Отношение имеет также аномалию обновления, действительно, изменять название, год постановки или длительность спектакля “Carmen”, нужно дважды. Причиной аномалий является тот факт, что неключевые атрибуты {ampoule, year,runningTime} зависит от части ключа {name,street,city}→{ampoule}, a {playIn}→{year, runningTime}.
Нормальная форма Бойса-Кодда. Нормальная форма Бойса-Кодда гарантирует отсутствие аномалий в базе данных.
Определение. Отношение R является нормальной формой Бойса – Кодда (BCNF), тогда и только тогда, когда при наличии в отношении R нетривиальной зависимости {A1,A2,…,An,}→{B1,B2,…,Bm} множество {A1,A2,…,An,} является надключом, содержащим ключ.
Покажем, что отношение Performances(title,year, runningTime,type,TheatresName,ActorsName) не находится в BCNF. Ключом отношения является множество {title,year,actorsName}. В отношении Performances имеется функциональная зависимость {title, year}→ {runningTime, type, theatresName}. Здесь {title, year} не является надключом, поскольку не содержит ключ и не определяет actorsName. Существование такой зависимости нарушает условие BCNF.
Чтобы перевести отношение в BCNF, необходимо выполнить операцию его декомпозиции. Декомпозиция связана с разделением отношения на ряд более простых отношений. Повторно применяя декомпозицию, можно разбить любую схему отношения на множество отношений со следующими полезными свойствами:
полученные отношения являются схемами BCNF;
данные исходного отношения правильно представлены в новых отношениях;
возможно точное восстановление исходного отношения из декомпозиции.
Следует отметить, что отношения с двумя атрибутами всегда находятся в BCNF. Поэтому простой способ декомпозиции связан с разделением исходного отношения на двух - атрибутные множества. Но при такой декомпозиции не всегда можно восстановить данные. Поэтому имеется более совершенный алгоритм декомпозиции:
Найти нетривиальные зависимости, нарушающие BCNF, {A1,A2,…,An} → {B1,B2,…,Bm}, где {A1,A2,…,An} не является надключом;
Найти атрибуты {B1,B2,…,Bm.}, которые функционально определяются {A1,A2,…,An};
Выделить в отдельное отношение атрибуты, нарушающие зависимости BCNF;
Выделить в отдельное отношение остальные атрибуты, не зависящие от {A1,A2,…,An}.
Следуя этому алгоритму, выполним декомпозицию отношения: Performances(title,year,runningTime,type,theatreName, actorName). Ключ отношения {title,year,actorsName}. Отношение содержит функциональную зависимость {title,year}→ {runningTime,type, theatreName}. Выделим в отношение Performances1, атрибуты, нарушающие BCNF:
Performances1(title, year, runningTime, type, theatreName)
Остальные атрибуты поместим в дргое отношение Performances2:
Performances2(title,year,ActorName)
Выполнив декомпозицию отношений, необходимо убедиться, что исходное отношение может быть восстановлено в прежнем виде.
Пусть имеется отношение {A,B,C}, имеющее функциональную зависимость A→B и зависимость B→C нарушающую BCNF. При декомпозиции получаем первое отношение как проекцию на {A,B} и второе отношение как проекцию на {B,C}. Тогда кортеж t=(a,b,c) исходного отношения разделяется на два кортежа u=(a,b) и w=(b,c), которые входят в два новых отношения. Кортежи, совпадающие по атрибутам (b), соединяются. В результате такого восстановления не может быть получен ложный кортеж (a, b,c), именно потому, что имеется функциональная зависимость A→B и B→C. Пока эта функциональная зависимость истинна, соединение двух проекций не может дать ложный кортеж.