Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных.doc
Скачиваний:
114
Добавлен:
16.03.2016
Размер:
5.67 Mб
Скачать

6.2. Исчисление кортежей

Для определения кортежной переменной используется оператор RANGE. Например, для того чтобы определить переменнуюСЛУЖАЩИЙ, областью определения которой является отношениеСЛУЖАЩИЕ, нужно употребить конструкцию

RANGE СЛУЖАЩИЙ IS СЛУЖАЩИЕ

Как уже говорилось, из этого определения следует, что в любой момент времени переменная СЛУЖАЩИЙпредставляет некоторый кортеж отношенияСЛУЖАЩИЕ. При

25 Это совсем не означает, что для понимания этой лекции требуется знание исчисления предикатов. Автор стремился к тому, чтобы материал лекции был в основном самодостаточным.

использовании кортежных переменных в формулах можно ссылаться на значение атрибута переменной (это аналогично тому, как, например, при программировании на языке C можно сослаться на значение поля структурной переменной). Например, для того, чтобы сослаться на значение атрибута СЛУ_ИМЯпеременнойСЛУЖАЩИЙ, нужно употребить конструкциюСЛУЖАЩИЙ.СЛУ_ИМЯ.

6.2.1. Правильно построенные формулы

Правильно построенная формула (Well-Formed Formula, WFF) служит для выражения условий, накладываемых на кортежные переменные.

Простые условия

Основой WFF являются простые условия, представляющие собой операции сравнения скалярных значений (значений атрибутов переменных или литерально заданных констант). Например, конструкции

СЛУЖАЩИЙ.СЛУ_НОМ = 2934и

СЛУЖАЩИЙ.СЛУ_НОМ = ПРОЕКТ.ПРОЕКТ_РУК

являются простыми условиями. Первое условие принимает значение trueв том и только в том случае, когда значение атрибутаСЛУ_НОМкортежной переменнойСЛУЖАЩИЙравно2934. Второе условие принимает значениеtrueв том и только в том случае, когда значения атрибутовСЛУ_НОМиПРОЕКТ_РУКпеременныхСЛУЖАЩИЙиПРОЕКТсовпадают.

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

Более сложные варианты WFF строятся с помощью логических связокNOT,AND,ORиIF ... THEN26)с учетом обычных приоритетов операций (NOT > AND > OR) и возможности расстановки скобок. Так, если form – WFF, а comp – простое сравнение, то NOT form, comp AND form, comp OR form и IF comp THEN form являются WFF.

Для примеров воспользуемся отношениями СЛУЖАЩИЕ,ПРОЕКТЫиНОМЕРА_ПРОЕКТОВиз предыдущей лекции (см.рис. 6.1).

Правильно построенной является следующая формула:

IF СЛУЖАЩИЙ.СЛУ_ИМЯ = 'Иванов'

THEN (СЛУЖАЩИЙ.СЛУ_ЗАРП >= 22400.00 AND СЛУЖАЩИЙ.ПРО_НОМ = 1)

Эта формула будет принимать значение trueдля следующих значений кортежной переменнойСЛУЖАЩИЙ:

26 Через IF … THEN здесь обозначается одна и важных логических функций – импликация. По определению, IF a THEN b эквивалентно NOT a OR b. Хотя операция импликации является избыточной, она явно вводится в реляционное исчисление, поскольку часто требуется на практике для выражения условий.

Рис. 6.1.Примерные значения отношений СЛУЖАЩИЕ, ПРОЕКТЫ и НОМЕРА_ПРОЕКТОВ

СЛУ_НОМЕР

СЛУ_ИМЯ

СЛУ_ЗАРП

ПРО_НОМ

2934

Иванов

22400.00

1

2935

Петров

29600.00

1

2936

Сидоров

18000.00

1

2937

Федоров

20000.00

1

2938

Иванова

22000.00

1

2935

Петров

29600.00

2

2939

Сидоренко

18000.00

2

2940

Федоренко

20000.00

2

2941

Иваненко

22000.00

2

Конечно, нужно представлять себе какой-нибудь способ реализации системы, которая сможет по заданной WFF при существующем состоянии базы данных произвести такой результат. И таким очевидным способом является следующий: в некотором порядке просмотреть область определения переменной и к каждому очередному кортежу применить условие. Результатом будет то множество кортежей, для которых при вычислении условия производится значение true. Очевидно, что результат эквивалентен выполнению алгебраической операцииСЛУЖАЩИЕ WHERE (NOT (СЛУЖАЩИЙ.СЛУ_ИМЯ = 'Иванов') OR (СЛУЖАЩИЙ.СЛУ_ЗАРП >= 22400.00 AND СЛУЖАЩИЙ.ПРО_НОМ = 1)над отношением, тело которого представляет собой область определения кортежной переменной.

Пусть имеется следующее определение кортежной переменной ПРОЕКТ:

RANGE ПРОЕКТ IS ПРОЕКТЫ

Вот еще пример правильно построенной формулы:

СЛУЖАЩИЙ.СЛУ_ИМЯ = ПРОЕКТ.ПРОЕКТ_РУК

Эта формула будет принимать значение trueдля следующих пар значений кортежных переменныхСЛУЖАЩИЙиПРОЕКТ:

СЛУЖАЩИЕ

ПРОЕКТЫ

СЛУ_НОМЕР

СЛУ_ИМЯ

СЛУ_ЗАРП

ПРО_НОМ

ПРО_НОМ

ПРОЕКТ_ РУК

2934

Иванов

22400.00

1

1

Иванов

2941

Иваненко

22000.00

2

2

Иваненко

2934

Иванов

22400.00

2

1

Иванов

Очевидный способ реализации системы, которая по заданной WFF при существующем состоянии базы данных производит такой результат, заключается в следующем. В некотором порядке просматривать область определения (например) переменной СЛУЖАЩИЙ. Для каждого текущего кортежа из области определения переменнойСЛУЖАЩИЙпросматривать область определения переменнойПРОЕКТ. Оставлять в области истинности те пары кортежей, для которых формула принимает значениеtrue. Возможен и альтернативный подход: начать просмотр с области определения переменнойПРОЕКТ, и для каждого кортежаПРОЕКТпросматривать область определенияСЛУЖАЩИЙ.

Здесь нужно сделать несколько замечаний. Во-первых, если бы в данном случае формула была тождественно истинной (например, имела вид

(СЛУЖАЩИЙ.СЛУ_ИМЯ = СЛУЖАЩИЙ.СЛУ_ИМЯ)

AND (ПРОЕКТ.ПРОЕКТ_РУК = ПРОЕКТ.ПРОЕКТ_РУК))

то областью истинности этой формулы являлось бы декартово произведение (в строгом математическом смысле) тел отношений СЛУЖАЩИЙиПРОЕКТ. В реляционном исчислении кортежей, как и в реляционной алгебре, принято иметь дело с операцией расширенного декартова произведения, и поэтому считается, что в подобных случаях областью истинности WFF является отношение, заголовок которого представляет собой объединение заголовков отношений, на телах которых определены кортежные переменные, а кортежи являются объединением соответствующих кортежей из областей определения переменных. При этом имя атрибута результирующего отношения уточняется именем соответствующей переменной. Поэтому правильнее было бы изображать область истинности формулы

СЛУЖАЩИЙ.СЛУ_ИМЯ = ПРОЕКТ.ПРОЕКТ_РУК

следующим образом:

СЛУЖАЩИЙ. СЛУ_НОМЕР

СЛУЖАЩИЙ. СЛУ_ИМЯ

СЛУЖАЩИЙ. СЛУ_ЗАРП

СЛУЖАЩИЙ. ПРО_НОМ

ПРОЕКТ. ПРО_НОМ

ПРОЕКТ. ПРОЕКТ_ РУК

2934

Иванов

22400.00

1

1

Иванов

2941

Иваненко

22000.00

2

2

Иваненко

2934

Иванов

22400.00

2

1

Иванов

Во-вторых, как видно, показанное результирующее отношение в точности совпадает с результатом алгебраической операции СЛУЖАЩИЕ JOIN ПРОЕКТЫ WHERE СЛУ_ИМЯ = ПРОЕКТ_РУКс учетом особенности именования атрибутов результирующего отношения. Наконец, заметим, что описанный выше способ реализации, который приводит к получению области истинности рассмотренной формулы, в действительности является наиболее общим (и зачастую неоптимальным) способом выполнения операций соединения (он называетсяметодом вложенных циклов – nested loops join).