Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
90
Добавлен:
10.02.2015
Размер:
2.04 Mб
Скачать

Правила записи выражений реляционной алгебры

Каждая операция реляционной алгебры принимает в качестве операндов одно или несколько отношений. В качестве отношения может быть указано имя некоторого отношения или некоторое другое выражение реляционной алгебры. Результатом вычисления выражения реляционной алгебры является результат последней выполненной операции.

Для выполнения операции реляционной алгебры должны быть предварительно вычислены ее операнды.

Выражения реляционной алгебры вычисляются в соответствии с приоритетом операций: сначала операции пересечения и декартова произведения (высший приоритет), затем – операции объединения и вычитания (низший приоритет). В случае одинаковых приоритетов операции выполняются слева направо. Порядок выполнения операций можно задать явно с помощью группирующих круглых скобок.

Выражения реляционной алгебры представляются формулами. Формулы называются эквивалентными, если они формируют одно и то же отношение при совпадении отношений- аргументов. В частности можно показать, что ([p1][p2])(R)= ([p2][p1])(R)

Свойства операций:

Пересечение отношений:

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

База данных содержит файлы - ПОСТАВЩИКИ, ДЕТАЛИ, ДОГОВОРА, ПОСТАВКИ.

Файл ПОСТАВЩИКИ (PSTS) имеет поля - код поставщика (KPST - уникальный ключ), наименование поставщика (IMPST), адрес поставщика (ADRPST).

Файл ДЕТАЛИ (DET) имеет поля - код детали (KDET - уникальный ключ), наименование детали (IMDET), цвет детали (CVET).

Файл ДОГОВОРА (DOG) содержит сведения о том «кто» - «что» - «в каком количестве» обязался поставить, и имеет поля - код поставщика (KPST), код детали (KDET), количество (KOL), дата начала договора (DTN), дата завершения договора (DTK). (KPST, KDET) – уникальный (составной) ключ этого файла.

В период действия договора поставщик поставляет детали не обязательно «все за раз», а обычно партиями. Файл ПОСТАВКИ (PST) содержит сведения о партиях поставленных деталей: «кто» - «что» - «в каком количестве» - «когда» поставил, и имеет поля - код поставщика (KPST), код детали (KDET), количество (KOL), дата поставки (DTP)

Задача. Сформировать список крупных (в количестве > 1000) поставок детали с кодом 1010: наименование поставщика, размер поставки.

ПРИМЕР. Решение вышерассмотренной задачи «о крупных поставках» описывается реляционным выражением:

[ImPst,Kol](Psts*([(KDet=1010)&(Kol>1000)]Pst))

Эквивалентное, но менее эффективное решение:

[ImPst,Kol]( [(KDet=1010)&(Kol>1000)])Psts*Pst)

5.2. Реляционное исчисление кортежей

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

Запрос к БД, выполненный с использованием реляционного исчисления, содержит описание желаемого результата, для которого может существовать несколько способов его вычисления, представленных выражениями реляционной алгебры или непосредственно командами СУБД. Преимуществом реляционного исчисления перед реляционной алгеброй можно считать то, что пользователю не требуется самому строить алгоритм выполнения запроса. Программа СУБД (при достаточной ее интеллектуальности) сама строит эффективный алгоритм.

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

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

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

Для определения кортежной переменной используется оператор RANGE. Например, для того, чтобы определить переменную СОТРУДНИК, областью определения которой является отношение СОТРУДНИКИ, нужно употребить конструкцию

RANGE СОТРУДНИК IS СОТРУДНИКИ

В любой момент времени переменная СОТРУДНИК представляет некоторый кортеж отношения СОТРУДНИКИ. При использовании кортежных переменных в формулах можно ссылаться на значение атрибута переменной (это аналогично тому, как, например, при программировании на языке Си можно сослаться на значение поля структурной переменной). Например, для того, чтобы сослаться на значение атрибута СОТР_ИМЯ переменной СОТРУДНИК, нужно употребить конструкцию СОТРУДНИК.СОТР_ИМЯ.

Правильно построенные формулы (WFF - Well-Formed Formula) служат для выражения условий, накладываемых на кортежные переменные. Основой WFF являются простые сравнения (comparison), представляющие собой операции сравнения скалярных значений (значений атрибутов переменных или литерально заданных констант). Например, конструкция "СОТРУДНИК.СОТР_НОМ = 140" является простым сравнением. По определению, простое сравнение являетсяWFF, а WFF, заключенная в круглые скобки, является простым сравнением.

Более сложные варианты WFF строятся с помощью логических связок NOT, AND, OR и IF ... THEN. Так, если form - WFF, а comp - простое сравнение, то NOT form, comp AND form, comp OR form и IF comp THEN form являются WFF.

Наконец, допускается построение WFF с помощью кванторов. Если form - это WFF, в которой участвует переменная var, то конструкции EXISTS var (form) и FORALL var (form) представляют WFF.

Квантор существования EXISTS определяется формально как повторяющееся OR (ИЛИ). То есть, если R – это отношение с кортежами Т1, Т2, …, Тm; Т – это переменная кортежа, которая изменяется на этом отношении; а f ( T ) – это формула, в которой используется переменная Т, то формула

EXISTS T ( f (T) )

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

false OR ( f (T1)) OR … OR ( f (Tm) ).

Пример. Пусть используется отношение R:

R ( D, F, W )

2 3 4

2 3 5

2 4 5

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

EXISTS T ( T.W > 2 ) : true

EXISTS T ( T.F > 4 ) : false

EXISTS T ( T.D > 2 OR T.W >= 5 ) : true

Квантор всеобщности FORALL определяется как повторяющееся AND (И). Другими словами, если R, T и f (T) такие же, как рассматривались выше, то формула

FORALL T ( f ( T ) )

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

true AND ( f ( T1 ) ) AND ... AND ( f ( Tm ) ).

Пример. Если отношение R содержит те же самые кортежи, что и в предыдущем примере, то приведенные ниже выражения будут иметь такие значения:

FORALL T ( T.D > 2) : false

FORALL T ( T.F > 2) : true

FORALL T ( T.D = 2 AND T.W > 3) : true

Переменные, входящие в 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. Вот пример:

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

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

Базовые (элементарные) формулы:

  • R(r) - имеет смысл «запись r принадлежит файлу R», т.е. rR.

  • r.A операция s.B

константа сравнения константа

имеет смысл «поле A записи r (или константа) имеет значение больше (меньше, равно...), чем поле B записи s (или константа)».

Формулы общего вида - строятся из базовых с помощью операций:

  • логики высказываний , и ограниченно используемого отрицания : если F1 и F2 формулы, то F1F2, F1F2, F1F2 тоже формулы;

  • логики предикатов , : если F формула, то rR(F) и rR (F) тоже формулы.

Смысл формул без кванторов , известен по языку Паскаль - это логические выражения с операциями AND(),OR() и NOT().

Смысл кванторных формул - для фиксированных значений других (кроме r) переменных:

  • формула rR F истинна, если формула F истинна для любой записи r из файла R

  • формула rR F истинна, если формула F истинна хотя бы для одной записи r из файла R.

ПРИМЕЧАНИЕ. С некоторыми оговорками (уточнениями, в которых используется операция естественного соединения - декартова произведения) имеют место следующие соответствия:

  • каждой формуле соответствует файл записей, на которых эта формула истинна;

  • формулам F1F2, F1F2, F1F2 соответствуют (пересечение), (объединение) и - (разность) файлов, соответствующих формулам F1 и F2;

  • формуле rR F соответствует файл FR;

  • формуле rR F соответствует проекция файла F по полям, которые отсутствуют в rR.

Запрос НАЙТИ{(r.A,...s.B,...)/rR,sS...}(F) имеет смысл:

  • найти запись r в файле R, s в файле S..., такие что на этом наборе записей истинна формула F;

  • по каждому такому набору записей сформировать соответствующую запись в файл - результат запроса, включая в нее поле A записи r, поле B записи s,...

ПРИМЕР. Вышеприведенный рисунок, иллюстрирующий операцию деления T=(RS), соответствует запросу T=НАЙТИ{t.B/tR} sS rR ((r.B=t.B)(r.A=s.A))

ПРИМЕР. Решение вышерассмотренной задачи «о крупных поставках» описывается запросом реляционного исчисления кортежей:

НАЙТИ{(r.ImPst,s.Kol)/rPsts,sPst}

(r.KPst=s.KPst)(s.KDet=1010)(s.Kol>1000)

ПРИМЕР. Найти имена поставщиков, которые поставляют все красные детали.

Переформулируем постановку задачи, явно оговорив неявное и явно выделив кванторы: найти имена таких поставщиков, что для каждой детали, если она красная, то существует договор о поставке этой детали этим поставщиком. Устранив импликацию (AB)(AB), получим: найти имена таких поставщиков, что для каждой детали - либо она не красная, либо существует договор о поставке этой детали этим поставщиком.

НАЙТИ{(ps.ImPst)/rPsts} detDet ((det.Cvet#'КРАСНЫЙ')

dogDog ((dog.KDet=det.KDet)(dog.KPst=ps.KPst)))

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

Соседние файлы в папке Базы данных(1 курс, 2 семестр,2011-2012)