Простые условия
Основой WFF являются простые условия, представляющие собой операции сравнения скалярных значений (значений атрибутов переменных или литерально заданных констант). Например, конструкции
СЛУЖАЩИЙ.СЛУ_НОМ = 2934 и
СЛУЖАЩИЙ.СЛУ_НОМ = ПРОЕКТ.ПРОЕКТ_РУК
являются простыми условиями. Первое условие принимает значение true в том и только в том случае, когда значение атрибута СЛУ_НОМ кортежной переменной СЛУЖАЩИЙ равно 2934. Второе условие принимает значение true в том и только в том случае, когда значения атрибутов СЛУ_НОМ и ПРОЕКТ_РУК переменных СЛУЖАЩИЙ и ПРОЕКТ совпадают.
По определению, простое сравнение является WFF, а WFF, заключенная в круглые скобки, представляет собой простое сравнение.
Более сложные варианты WFF строятся с помощью логических связок NOT, AND, OR и IF ... THEN с учетом обычных приоритетов операций (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 для следующих значений кортежной переменной СЛУЖАЩИЙ:
СЛУ_НОМЕРСЛУ_ИМЯСЛУ_ЗАРППРО_НОМ
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).
Содержание раздела