Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы и банки данных / Базы и банки данных (5 сем).doc
Скачиваний:
76
Добавлен:
01.05.2014
Размер:
705.54 Кб
Скачать

Операция деления отношений

Эта операция наименее очевидна из всех операций реляционной алгебры и поэтому нуждается в более подробном объяснении. Пусть заданы два отношения - A с заголовком {a1, a2, ..., an, b1, b2, ..., bm} и B с заголовком {b1, b2, ..., bm}. Будем считать, что атрибут biотношения A и атрибут biотношения B не только обладают одним и тем же именем, но и определены на одном и том же домене. Назовем множество атрибутов {aj} составным атрибутом a, а множество атрибутов {bj} - составным атрибутом b. После этого будем говорить о реляционном делении бинарного отношения A(a,b) на унарное отношение B(b).

Результатом деления A на B является унарное отношение C(a), состоящее из кортежей v таких, что в отношении A имеются кортежи <v, w> такие, что множество значений {w} включает множество значений атрибута b в отношении B.

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

Поясним сказанное несколькими примерами. Пусть делимое отношение DENDсодержит номера поставщиков и номера, поставляемых ими деталей.

S#

P#

..

..

S1

P1

S2

P1

S1

P2

S2

P2

S1

P3

S3

P2

S1

P4

S4

P2

S1

P5

S4

P4

S1

P6

S4

P5

..

..

Для трех вариантов делителя DOR:

P#

P#

P#

P1

P2

P1

P4

P2

P3

P4

P5

P6

результаты деления DENDDEVIDEBYDORпредставляются соответственно отношениями

S#

S#

S#

S1

S1

S1

S2

S4

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

Упражнения

  1. Получить имена поставщиков, которые поставляют деталь Р2.

  2. Получить имена поставщиков, которые поставляют, по крайней мере, одну красную деталь.

  3. Получить имена поставщиков, которые поставляют все детали.

  4. Получить все пары номеров поставщиков, размещенных в одном городе.

  5. Получить номера поставщиков, поставляющих, по крайней мере, все те детали, которые поставляет поставщик S2.

  6. Получить имена поставщиков, которые не поставляют деталь Р2.

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

Для выполнения упражнений используются следующие отношения:

Поставщики (S); атрибуты:S# (номер поставщика),Sname(имя поставщика),CITY(город)

Детали (P); атрибуты:P# (номер детали),Pname(название детали),Color(цвет детали)

Заказы (SP); атрибуты:S# (номер поставщика),P# (номер детали),Qty(количество).

В общем случае выражения реляционной алгебры служат для символического высокоуровневого представления намерений пользователя (например, некоторого определенного запроса). Именно поэтому ими можно манипулировать в соответствии с многочисленными правилами преобразования. Например, выражение

(( SPJoinS)WhereP# = ‘P2’) [SNAME]

(имена поставщиков, поставляющих деталь Р2) можно преобразовать в логически эквивалентное, но, возможно, более рациональное выражение

(( SP Where P# = ‘P2’) Join S) [SNAME]