Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
[конспект] Технологии баз данных [v0.8.1].pdf
Скачиваний:
79
Добавлен:
21.03.2016
Размер:
1.3 Mб
Скачать

Если исключить оператор , то понадобится некоторый одноместный предикат, позволяющий определить, является ли подаваемый аргумент !-значением или нет, — пусть это будет предикат !is. Тогда без применения оператора запрос примет более громоздкий вид:

!T T P R

^ pT :city ‘Лондон’q _ !ispT :cityq

^ pT :job ‘Программист’q _ !ispT :jobq ^

 

^ pT

 

 

 

q ^ pT

 

 

q

)

 

:city

‘Лондон’

:job

 

 

 

 

‘Программист’

 

Кванторы

С кванторами @ и D в трехзначной логике дело обстоит так же, если вспомнить определение этих кванторов. Пусть область действия квантора есть множество tT1; : : : ; Tnu, тогда:

Формула pDT qpFpT qq эквивалентна pFALSE_FpT1q_: : :_FpTnqq, где FALSE — тождественно ложный предикат. Т. е. формула принимает значение:

а) T тогда и только тогда, когда хотя бы один из операндов FpTiq принимает значение T, б) F тогда и только тогда, когда все операнды FpTiq принимают значение F,

в) U в противном случае.

Формула p@T qpFpT qq эквивалентна pTRUE ^ FpT1q^ : : : ^ FpTnqq, где TRUE — тождественно истинный предикат. Т. е. формула принимает значение:

а) F тогда и только тогда, когда хотя бы один из операндов FpTiq принимает значение F, б) T тогда и только тогда, когда все операнды FpTiq принимают значение T,

в) U в противном случае.

Арифметические операции и операции сравнения

Предположим, что имеется элементарное логическое выражение A B, где A; B — атрибуты или константы одного или сравнимых доменов, P tă; ď; ą; ě; ; u — операция сравнения. Что делать, если один из операндов является !-значением (заложено в отношении) или принимает U-значение (является результатом промежуточного вычисления)? В этом случае все элементарное логическое выражение должно принять значение U. Таким образом, если хотя бы один операнд операции сравнения принимает значение U, то логическое выражение A B операции должно принимать значение U.

А что будет, если один из операндов операции сравнения является арифметическим выражением? Предположим, что имеется элементарное арифметическое выражение EpA1; : : : ; Anq, где E — допустимое арифметическое выражение, зависящее от переменных (кортежей или доменов) A1; : : : ; An и являющееся операндом операции сравнения . Если хотя бы один из атрибутов, участвующий в арифметическом выражении E является !-значением, то весь этот операнд операции сравнения принимает !-значение.

5.2. ω-значения и домены

Так как ! не является значением, то типы не могут содержать в своем множестве значений величину !, а значит, и домены тоже. Действительно, если бы типы могли содержать неопределенные значения какого-либо вида, то проверка ограничений целостности для них всегда завершалась бы с положительным результатом! Но поскольку типы фактически не могут содержать величину !, то «отношения», допускающие присутствие величины !, являются чем угодно, но только не реляционными отношениями.

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

27

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

5.3. ω-значения и операторы реляционной алгебры

Рассмотрим влияние !-значений на базисные операторы реляционной алгебры:

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

Определение 1. Два кортежа T1 и T2 являются дубликатами тогда и только тогда, когда они имеют одинаковый набор атрибутов ta1; a2; : : : ; anu и @i P r1 : ns

либо значение атрибута ai кортежа T1 равно значению атрибута ai кортежа T2

либо оба значения атрибута ai в кортежах T1 и T2 равны !.

Используя такое определение дубликатов кортежей определение оператора проекции остается прежним, при этом теперь есть разница между «кортежи совпадают» и «кортежи являются дубликатами».

2.Выборка: здесь достаточно уточнить, что следует выбирать только те кортежи, для которых условие выборки принимает значение T и никакое другое (F или U).

3.Объединение тоже подразумевает исключение дубликатов кортежей, поэтому здесь тоже будет использоваться расширенное определение дубликатов кортежей, а значит, само определение оператора не изменится (если только явно добавить уточнение, что дубликаты должны отсутствовать).

4.На декартово произведение !-значения никакого влияния не оказывают.

5.С разностью дела обстоят аналогично проекции и объединению — используется расширенное определение дубликатов кортежей и уточнение о том, что результирующее отношение не должно содержать дубликатов кортежей.

5.4. ω-значения и агрегирующие функции

Что делать, если среди значений атрибута, для которого вычисляется агрегирующая функция, есть !-значения? Все агрегирующие функции, кроме варианта функции COUNT(*) подсчёта количества кортежей (звездочка означает именно это, а не по конкретному атрибуту), пропускают !- значения, т. е. если COUNT подается конкретный атрибут, то он тоже пропускает !-значения.

Почему так? По поводу функции COUNT еще можно поспорить на правомерность такого подхода, ведь подсчёт идет по атрибуту кортежа, а раз там есть !-значения, то неужели их не надо считать? Конечно, на практике таких двусмысленностей избегают, считая либо по ключевому атрибуту, который уж точно не содержит !-значений, либо ясно понимают, что не не нужно учитывать кортежи !-значениями либо просто исключая эти кортежи с помощью условия выборки.

1 Такое казалось бы противоречие объясняется Коддом следующим образом: «...проверка на равенство в процессе исключения дубликатов кортежей... выполняется на более низком уровне детализации по сравнению с проверкой на равенство при оценке условий выборки. Поэтому здесь можно применить другое правило».

28