Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Кудравцев Создание баз данных 2010

.pdf
Скачиваний:
83
Добавлен:
16.08.2013
Размер:
2.65 Mб
Скачать

Переменные, входящие в WFF, могут быть свободными или связанными.

Все переменные, входящие в WFF, при построении которой не использовались кванторы, являются свободными. Фактически это означает, что если для какого-то набора значений свободных кортежных переменных при вычислении WFF получено значение true, то эти значения кортежных переменных могут входить в результирующее отношение.

Если же имя переменной использовано сразу после квантора при построении WFF вида EXISTS var (form) или FORALL var (form), то в этой WFF и во всех WFF, построенных с ее участием, var — связанная переменная. Это означает, что такая переменная не видна за пределами минимальной WFF, связавшей эту переменную. При вычислении значения такой WFF используется не одно значение связанной переменной, а вся ее область определения.

Пусть СОТР1 и СОТР2 — две кортежные переменные, определенные на отношении СОТРУДНИК. Тогда, WFF

EXISTS СОТР2 (СОТР1.СОТР_ЗАРП > СОТР2.СОТР_ЗАРП)

для текущего кортежа переменной СОТР1 принимает значение true в том и только в том случае, если во всем отношении СОТРУДНИК найдется кортеж (связанный с переменной СОТР2) такой, что значение его атрибута СОТР_ЗАРП удовлетворяет внутреннему условию сравнения. WFF

FORALL СОТР2 (СОТР1.СОТР_ЗАРП >СОТР2.СОТР_ЗАРП)

для текущего кортежа переменной СОТР1 принимает значение true в том и только в том случае, если для всех кортежей отношения СОТРУДНИК (связанных с переменной СОТР2) значения атрибута СОТР_ЗАРП удовлетворяют условию сравнения.

На самом деле, правильнее говорить не о свободных и связанных переменных, а о свободных и связанных вхождениях переменных. Легко видеть, что если переменная var является связанной в WFF form, то во всех WFF, включающих данную, может использоваться имя переменной var, которая может быть свободной или связанной, но в любом случае не имеет никакого отношения к вхождению переменной var в WFF form. Вот пример:

61

EXISTS СОТР2 (СОТР1.СОТР_ОТД_НОМ = СОТР2.СОТР_ОТД_НОМ)

AND

FORALL СОТР2 (СОТР1.СОТР_ЗАРП > СОТР2.СОТР_ЗАРП)

Здесь мы имеем два связанных вхождения переменной СОТР2 с совершенно разным смыслом.

Целевые списки и выражения реляционного исчисления

Итак, WFF обеспечивают средства формулировки условия выборки из отношений БД. Чтобы можно было использовать исчисление для реальной работы с БД, требуется еще один компонент, который определяет набор и имена столбцов результирующего отношения. Этот компонент называется целевым списком (target_list).

Целевой список строится из целевых элементов, каждый из которых может иметь следующий вид:

var.attr, где var — имя свободной переменной соответствующей WFF, а attr — имя атрибута отношения, на котором определена переменная var;

var, что эквивалентно наличию подсписка var.attr1, var.attr2,

..., var.attrn, где attr1, attr2, ..., attrn, включает имена всех ат-

рибутов определяющего отношения;

new_name = var.attr; new_name — новое имя соответствую-

щего атрибута результирующего отношения.

Последний вариант требуется в тех случаях, когда в WFF используются несколько свободных переменных с одинаковой областью определения.

Выражением реляционного исчисления кортежей называется конструкция вида

target_list WHERE wff.

Значением выражения является отношение, тело которого определяется WFF, а набор атрибутов и их имена — целевым списком.

Реляционное исчисление доменов

В исчислении доменов областью определения переменных являются не отношения, а домены. Применительно к базе данных СОТРУДНИКИ-ОТДЕЛЫ можно говорить, например, о доменных

62

переменных ИМЯ (значения — допустимые имена) или СОТР_НОМ (значения — допустимые номера сотрудников).

Основным формальным отличием исчисления доменов от исчисления кортежей является наличие дополнительного набора предикатов, позволяющих выражать так называемые условия членства. Если R — это n-арное отношение с атрибутами a1, a2, ..., an, то условие членства имеет вид

R (ai1:vi1, ai2:vi2, ..., aim:vim) (m <= n),

где vij — либо литерально задаваемая константа, либо имя доменной переменной.

Условие членства принимает значение true в том и только в том случае, если в отношении R существует кортеж, содержащий указанные значения указанных атрибутов. Если vij — константа, то на атрибут aij задается жесткое условие, не зависящее от текущих значений доменных переменных; если же vij — имя доменной переменной, то условие членства может принимать разные значения при разных значениях этой переменной.

Во всех остальных отношениях формулы и выражения исчисления доменов выглядят похожими на формулы и выражения исчисления кортежей.

Для примера сформулируем с использованием исчисления доменов запрос:

"Выдать номера и имена сотрудников, не получающих минимальную заработную плату".

Будем считать для простоты, что определены доменные переменные, имена которых совпадают с именами атрибутов отношения СОТРУДНИК. В случае, когда требуется несколько доменных переменных, определенных на одном домене, будем добавлять в конце имени цифры:

СОТР_НОМ, СОТР_ИМЯ WHERE EXISTS СОТР_ЗАРП1 (СОТРУДНИК (СОТР_ЗАРП1) AND

СОТРУДНИК (СОТР_НОМ, СОТР_ИМЯ, СОТР_ЗАРП) AND СОТР_ЗАРП > СОТР_ЗАРП1)

Реляционное исчисление доменов является основой большинства языков запросов, основанных на использовании форм. Реляционное исчисление послужило прообразом языка построения запро-

63

сов SQL (Structure Query Language), который в дальнейшем будет рассмотрен более подробно.

Нормализация отношений

Определим нормализацию как процесс приведения реляционных таблиц к стандартному виду. Рассмотрим в качестве примера табл. 2.3 (НАЗНАЧЕНИЕ), в которой хранится информация о назначении сотрудников некоторой фирмы (например, консалтинговой) для работы над проектами. Следует отметить, что один сотрудник может участвовать в нескольких проектах. Кроме того, отношение хранит информацию о должности (Skill) каждого сотрудника.

Таблица 2.3 Отношение НАЗНАЧЕНИЕ сотрудников на проекты

ID_Worker

Name

Skill

Project

1111

Алексеев Д.А.

Программист I

Альфа

1111

Алексеев Д.А.

Программист I

Омега

2222

Михайлов В.В.

Вед. программист

Альфа

2222

Михайлов В.В.

Вед. программист

Омега

2222

Михайлов В.В.

Вед. программист

Гамма

2222

Михайлов В.В.

Вед. программист

Сигма

3333

Кузнецов В.И.

Программист II

Альфа

Из анализа данной таблицы нетрудно сделать вывод, что она содержит большое количество избыточных данных. Избыточность не только приводит к увеличению объема хранимой информации, но и, что более существенно, может вызвать нарушение целостности данных.

Наличие избыточности приводит к одной из трех аномалий:

обновления;

удаления;

ввода.

Аномалия обновления

Аномалия обновления представляет собой противоречивость данных вызванная их избыточностью и частичным обновлением. Предположим, что должность Алексеева Д.А. была указана неверно, т.е. он является системным администратором, а не программи-

64

стом I категории. Если при корректировке должность Алексеева Д.А. была изменена только в первой строке (причины частичного обновления не рассматриваются), то получим противоречивые данные о должности Алексеева Д.А.

Аномалия удаления

Аномалия удаления представляет собой непреднамеренную потерю данных, вызванную удалением других данных. Например, если программист II категории Кузнецов В.И. увольняется, то он удаляется из базы данных, но вместе с ним удаляется (не преднамеренно) информация о должности «программист II категории».

Аномалия ввода

Аномалия ввода представляет собой невозможность ввода данных в таблицу, вызванная отсутствием других данных. Например, если в рассматриваемой таблице не допускаются пустые значения, то невозможно ввести данные о новом сотруднике, который не назначен ни на один проект, а проходит испытательный срок.

Основная цель нормализации – сокращение избыточности хранимых данных и, как следствие:

экономия объема используемой памяти;

уменьшение затрат на многократные операции обновления избыточных копий;

устранение возможности возникновения противоречий (аномалий) из-за хранения в разных местах сведений об одном и том же объекте.

Разбиение — процесс разделения таблицы на несколько таблиц в целях избавления от аномалий и поддержки целостности данных.

Первая нормальная форма (1НФ)

Реляционная таблица находится в первой нормальной форме (1НФ), если значения в таблице являются атомарными для каждого атрибута таблицы. Атомарным является значение, не являющееся множеством или повторяющейся группой. Табл. 2.3 находится в 1-й нормальной форме, так как на пересечении любой строки и лю-

65

бого столбца находится единственной значение. Табл. 2.4 не находится в 1-й нормальной форме, поскольку атрибут Project не является атомарным, т.е. содержит множество значений.

Таблица 2.4

НАЗНАЧЕНИЕ сотрудников на проекты (множественные значения)

ID_Worker

Name

Skill

Project

1111

Алексеев Д.А.

Программист I

{Альфа, Омега}

2222

Михайлов В.В.

Вед. программист

{ Альфа,Омега,Гамма,Сигма}

3333

Кузнецов В.И.

Программист II

{Альфа }

Вообще говоря, обычная таблица — это таблица, находящаяся в первой нормальной форме, однако в ряде случаев 1НФ могут нарушить повторяющиеся группы и эта ситуация менее очевидна. Рассмотрим табл. 2.5, в которой для хранения информации о проектах используются атрибуты Pr1, Pr2, Pr3 и Pr4. Эти атрибуты являются повторяющейся группой и приводят к значительным проблемам.

Таблица 2.5

НАЗНАЧЕНИЕ сотрудников на проекты (с повторяющейся группой)

ID_Worker

Name

Skill

Pr1

Pr2

Pr3

Pr4

1111

Алексеев Д.А.

Программист I

Альфа

Омега

 

 

2222

Михайлов В.В.

Вед. программ.

Альфа

Омега

Гамма

Сигма

3333

Кузнецов В.И.

Программист II

Альфа

 

 

 

В частности, если Михайлов В.В. будет назначен на 5-й проект, то где хранить эту информацию. Если же зарезервировать большое количество атрибутов типа Pr1, то придется хранить большое количество пустых значений.

Вторая и третья нормальные формы тесно связаны с понятием функциональных зависимостей.

Функциональные зависимости

Функциональная зависимость между атрибутами понимается в том смысле, что значение атрибута в кортеже однозначно опреде-

66

ляет значение другого атрибута в кортеже. Формально это записывается так:

ФЗ: А B,

где А и B — атрибуты одной и той же таблицы R.

Атрибут в левой части функциональной зависимости называется детерминантом. Функциональная зависимость означает, что если кортежа имеют одно и то же значение атрибута А, то они имеют одно и то же значение атрибута B. На практике функциональные зависимости выявляются путем логического анализа предметной области и взаимосвязи атрибутов описывающих сущности. Например, легко обнаружить функциональную зависимость между почтовым адресом и телефоном, артикулом товара и его названием, местом производства и т.д. С другой стороны, можно формально анализировать содержимое таблицы и руководствуясь приведенным определением отыскивать функциональные зависимости.

Рассмотрим абстрактную таблицу (отношение) X(A,B,C,D,E) содержащую четыре кортежа:

 

 

 

 

 

Таблица 2.6

 

 

Абстрактная таблица X

 

 

 

 

 

 

 

 

 

A

B

 

C

D

E

 

 

 

 

 

 

 

 

a1

b2

 

c1

d3

e2

 

 

 

 

 

 

 

 

a3

b2

 

c3

d2

e4

 

 

 

 

 

 

 

 

a1

b3

 

c1

d1

e2

 

 

 

 

 

 

 

 

a2

b4

 

c1

d4

e2

 

 

 

 

 

 

 

 

Ключевым атрибутом целесообразно выбрать D. Анализируя содержимое кортежей, можно найти следующие функциональные зависимости:

CE;

EC;

AC;

AE.

67

Вторая нормальная форма (2НФ)

Реляционная таблица находится во второй нормальной форме, если никакие неключевые атрибуты не являются функционально зависимыми лишь от части ключа. Вторая нормальная форма может оказаться нарушенной только в том случае, когда ключ составной. Для иллюстрации нарушения 2НФ рассмотрим несколько модифицированную табл. 2.3.

Таблица 2.7

НАЗНАЧЕНИЕ сотрудников на проекты

ID_Worker

Project

Start_Date

Name

1111

Альфа

01.02.2009

Алексеев Д.А.

1111

Омега

01.03.2009

Алексеев Д.А.

2222

Альфа

01.02.2009

Михайлов В.В.

2222

Омега

01.03.2009

Михайлов В.В.

2222

Гамма

01.04.2009

Михайлов В.В.

2222

Сигма

01.05.2009

Михайлов В.В.

3333

Альфа

21.02.2009

Кузнецов В.И.

В данной таблице присутствует избыточность данных, и, следовательно, имеется потенциальная опасность возникновения аномалий обновления, ввода и удаления данных.

Ключ таблицы — составной (ID_Worker, Project), при этом возможно нарушение 2НФ. Анализируя содержимое таблицы, можно обнаружить следующие функциональные зависимости:

ID_Worker, Project Start_Date; ID_Worker Name.

Следовательно, существует функциональная зависимость неключевого атрибута (Name) лишь от части составного ключа (ID_Worker), т.е. имеет место нарушение 2НФ. Для устранения этой проблемы необходимо разбить данную таблицу на две, каждая из которых будет удовлетворять 2НФ. Процесс разбиения можно представить в виде следующих шагов:

1. Создается новая таблица, атрибутами которой будут атрибуты исходной таблицы входящие в противоречащую правилу функциональную зависимость, т.е. ID_Worker Name.

68

 

Табл. 2.8

СОТРУДНИК

 

 

ID_Worker

Name

1111

Алексеев Д.А.

2222

Михайлов В.В.

3333

Кузнецов В.И.

2. Атрибут, стоящий в правой части функциональной зависимости, исключается из исходной таблицы, т.е. Name

Таблица 2.9 НАЗНАЧЕНИЕ СОТРУДНИКОВ НА ПРОЕКТЫ

ID_Worker

Project

Start_Date

1111

Альфа

01.02.2009

1111

Омега

01.03.2009

2222

Альфа

01.02.2009

2222

Омега

01.03.2009

2222

Гамма

01.04.2009

2222

Сигма

01.05.2009

3333

Альфа

21.02.2009

3.Если имеются другие функциональные зависимости, нарушающие 2НФ, то шаги 1 и 2 повторяются для каждой из них.

4.Если один и тот же детерминант входит в несколько функциональных зависимостей, то все зависящие от него атрибуты помещаются в одну таблицу, ключом которой будет детерминант.

Таким образом, в результате разбиения получаются две таблицы меньшего размера, и реляционная схема может быть записана так:

НАЗНАЧЕНИЕ(ID_Worker, Project, Start_Date)

Внешний ключ: ID_Worker -> СОТРУДНИК СОТРУДНИК(ID_Worker, Name)

Третья нормальная форма (3НФ)

Реляционная таблица находится в третьей нормальной форме (3НФ), если для любой имеющейся функциональной зависимости между атрибутами таблицы

X Y

атрибут X является ключом.

69

Рассмотрим в качестве примера таблицу, в которой хранится информация о бонусах (премиальных) для сотрудников, причем процент премиальных определяется должностью.

Таблица 2.10

БОНУС

ID_Worker

Skill

Bonus

1111

Программист I

30 %

2222

Вед. программ.

40 %

3333

Программист II

20 %

4444

Программист II

20 %

В таблице присутствует избыточность данных и, следовательно, существует потенциальная опасность возникновения аномалий обновления, ввода и удаления.

Наличие функциональной зависимости

Skill Bonus

приводит к нарушению 3НФ. Для устранения этой проблемы необходимо разбить данную таблицу на две, каждая из которых будет удовлетворять 3НФ. Процесс разбиения, очень похожий на описанный ранее, можно представить в виде следующих шагов:

1. Создается новая таблица, атрибутами которой будут атрибуты исходной таблицы входящие в противоречащую правилу функциональную зависимость, т.е. Skill Bonus.

Таблица 2.11 ДОЛЖНОСТЬ_БОНУС

Skill

Bonus

Программист I

30 %

Вед. программ.

40 %

Программист II

20 %

2. Атрибут, стоящий в правой части функциональной зависимости, исключается из исходной таблицы:

70