Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Белобжеский_Лекции_по_ББД.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
5.5 Mб
Скачать

Примеры применения реляционной алгебры

ПРИМЕР 1. Возьмем набор отношений, которые моделируют сдачу сессии студентами неко­торого учебного заведения. Тема весьма понятная и привычная.

R1 (ФИО, Дисциплина, Оценка) - информация о попытках (как успешных, так и неуспешных) сдачи экзаменов студентами;

R2 (ФИО, Группа) - состав групп;

R3 (Группа, Дисциплина) - список дисциплин, которые надо сдавать каждой группе

Домены для атрибутов формально задавать не будем, но, ориентируясь на здравый смысл, будем считать, что доменом для атрибута Дисциплина будет множество всех дисциплин, преподающихся в ВУЗе, доменом для атрибута Группа будет множество всех групп ВУЗа и т. д.

Покажем. каким образом можно получить из этих таблиц интересующие нас сведения с помощью реляционной алгебры. В каждом из приведенных примеров путем операций над исходными отношениями R1, R2, R3 формируются промежуточные отношения и результирующее отношение S, содержащее требуемую информацию.

  1. Список студентов (только ФИО), которые сдали экзамен по БД на «отлично». Результат может быть получен применением операции выборки по сложному условию к отношению R1 и последующим проектированием на атрибут «ФИО» (нам ведь требуется только список фамилий).

S = ПФИО(Оценка=5 Λ Дисциплина= БД (R1))

  1. Список тех, кто должен был сдавать экзамен по БД, но пока еще не сдавал. Сначала найдем всех, кто должен был сдавать экзамен по БД. В отношении R3 находится список всех дисциплин, по которым каждая группа должна была сдавать экзамены, ограничим перечень дисциплин только «БД», используя операцию выборки

R4 = Дисциплина= БД (R3)

Для получения всех ФИО из тех групп, которые должны сдавать БД, необходимо соединить R2 с R4, а потом спроектировать на ФИО. Используем операции естественного соединения и проекции:

R5= ПФИО(R2 R4)

Создадим список тех, кто сдавал БД согласно отношению R1 (нас пока не интересует результат сдачи, а интересует сам факт попытки сдачи, то есть при­сутствие в отношении R1):

R7ФИО(Дисциплина= БД (R1))

Окончательный результат (список еще не сдававших БД) получается путем вычитания R7 из отношения R5 (все кто есть в R5, но нет в R7):

S = R5 R7

Примечание: Для получения R5 (минуя получение R4 ) можно было сразу написать операцию тета-соединения

R5= ПФИО (R2 R3.НомерГруппы = R2.НомерГруппы Λ R3.Дисциплина = «БД» R3)

  1. Список несчастных, имеющих несколько двоек (только ФИО):

Этот пример весьма интересен: для поиска строк, удовлетворяющих в совокупности условию больше одного, применяется операция тета-соединения отношения с самим собой. Поэтому мы как бы взяли копию отношения R1 и назвали ее R'1. Напомним, что тета-соединение – это подмножество декартового произведения, удовлетворяющее определенному предикату (условию). А декартово произведение получается путем конкатенации (сцепления) кортежей.

S = ПФИО(R1 R1.ФИО= R'1.ФИО Λ R1.Дисциплина≠ R'1.Дисциплина Λ R1.Оценка=2 Λ R'1.Оценка=2 R'1)

Обратите внимание на эту операцию – она применяется очень часто, когда надо найти список или перечень объектов, удовлетворяющих условию «больше одного».

  1. Список круглых отличников.

Строим список всех пар <студент—дисциплина>, которые в принципе должны быть сданы:

R4 ФИО, Дисциплина (R2 R2.Группа = R3.Группа R3))

Строим список пар <студент— дисциплина>, где получена оценка «отлично»:

R5 = ПФИО,Дисциплина ((Оценка=5 (R1 ))

Строим список студентов, что-либо не сдавших на «отлично»:

R6 = ПФИО (R4 - R5)

Наконец, исключив последнее отношение из общего списка студентов, получаем результат:

ПФИО (R2) - R6

Обратите внимание, что для получения множества студентов, что-либо не сдав­ших на «отлично» (R6), мы осуществили «инверсию» множества всех отлично сданных пар <студент—дисциплина> (R5) путем вычитания его из предвари­тельно построенного универсального множества (R4). Рекомендуем очень внимательно разобрать этот пример и вникнуть в смысл каждого действия — это очень пригодится для понимания реляционной алгебры. ЗАМЕЧАНИЕ: Вместо двух операций R5 и R6 здесь можно было сразу найти список студентов, что-либо не сдавших на отлично, если поставить в выборке условие Оценка≠5.

  1. Общий список студентов, которые сдали все экзамены (для данной сессии)

Особенность ситуации такая, что есть группы как с одинаковыми, так и с разными экзаменами, что отражается в отношении R3 . Для определенности положим, что у нас 3 группы с номерами 406, 407 и 507. Будем «погруппно» искать студентов, сдавших все экзамены, а потом объединим эти списки.

  • Составим список пар «студент-дисциплина», у которых оценка больше

двойки:

R4 = ПФИО,Дисциплина ((Оценка>2 (R1 ))

Здесь указаны студенты всех групп, сдавшие хотя бы один экзамен.

  • Для каждой группы определим список дисциплин , по которым сдаются экзамены

R406 = ПДисциплина ((Группа=406 (R3 ))

R407 = ПДисциплина ((Группа=407 (R3 ))

R507 = ПДисциплина ((Группа=507 (R3 ))

Если у групп 406 и 407 экзамены совпадают, то R406 = R407 .

  • Найдем списки студентов каждой группы, которые сдали все экзамены. Поскольку мы отвечаем на вопрос «все», то здесь нужно применить операцию деления. При этом студенты тех групп, в которых экзамены совпадают, попадут в одно отношение.

R

Если у групп 406 и 407 одинаковые экзамены, то R5 = R6

5 = R4 ÷ R406

R6 = R4 ÷ R407

R7 = R4 ÷ R507

  • Объединим эти отношения для получения общего списка студентов, сдавших все экзамены. Учтем, что при операции объединения кортежи-дубликаты исключаются.

R8 = R5 R6 R7

Получили список студентов всех групп (406, 407, 507), которые сдали все экзамены.

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

  1. Список студентов, которые сдали только один экзамен.

Другими словами, надо найти список студентов, которые получили только по одной дисциплине оценку выше 2.

  • Найдем список студентов и дисциплин, по которым эти студенты имеют оценку выше двойки, т.е. сдали хотя бы один экзамен

R4 = ПФИО,Дисциплина ((Оценка>2 (R1 ))

  • Найдем студентов, которые сдали более одного экзамена, т.е. сдали экзамены по двум и более дисциплинам. Для этого используем тета-соединение отношения R4 с его копией R'4.

R5 = (R4 R4.ФИО=R'4.ФИО Λ R4.Дисциплина≠ R'4.Дисциплина R'4)

  • Список студентов, сдавших только один экзамен, получается как разность между R4 и R5 с последующей проекцией на ФИО

S= ПФИО (R4 - R5)

Итак, здесь был ход решения «от противного» с использованием тета-соединения отношения R4 с самим собой.

ПРИМЕР 2. Для демонстрации возможностей операций объединения, пересечения и разности рассмотрим один пример. Рассмотрим ситуацию поступления в высшие учебные заведения, которая была характерна для периода, когда были разрешены так называемые репетиционные вступительные экзамены, которые сдавались раньше основных вступительных экзаменов в вуз. Исходными являются три отношения R1, R2 и R3. Все они имеют эквивалентные схемы (совместимы по объединению).

R1= (ФИО, Паспорт, Школа) - список абитуриентов, сдававших репетиционные экзамены.

R2= (ФИО, Паспорт, Школа) - список абитуриентов, сдававших экзамены на общих условиях.

R3= (ФИО, Паспорт, Школа) - список абитуриентов, принятых в институт.

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

Ответим на следующие вопросы:

  1. Список абитуриентов, которые поступали два раза и не поступили в вуз

R = R1 R2R3

Сначала с помощью операции пересечения определяются студенты, сдававшие 2 экзамена (общая часть первых двух отношений). Затем вычитаются студенты, поступившие в институт.

  1. Список абитуриентов, которые поступили в вуз с первого раза, то есть они сдавали экзамены только один раз и сдали их так хорошо, что сразу были зачислены в ВУЗ.

R = (R1 - R2 R3) (R2 - R1 R3)

3. Список абитуриентов, которые поступили в вуз только со второго раза.

Прежде всего это те абитуриенты, которые присутствуют в отношениях R1 и R2, потому что они поступали два раза, и присутствуют в отношении R3, потому что они поступили.

R = R1 R2 R3

4. Список абитуриентов, которые поступали только один раз и не поступили.

Это прежде всего те абитуриенты, которые присутствуют в R1 и не присутствуют в R2, и те, кто присутствуют в R2 и не присутствуют в R1. И разумеется, никто из них не присутствует в R3.

R = (R1 - R2) (R2 - R1) - R3

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

Операции объединения, пересечения и разности применимы только к отношениям с эквивалентными схемами.

Пример 3 (нет в билетах, можно использовать для примеров)

Даны отношения, моделирующие работу фирмы, занимающейся разработкой программных систем. Каждый сотрудник административно закреплен только за одним отделом. Файлы хранятся на разных серверах. На разных серверах файлы могут иметь одинаковые имена. Создатель файла является его владель­цем, поэтому у каждого файла только один владелец, но владелец файла может разрешить пользоваться файлом другим сотрудникам. Существует множество системного программного обеспечения, каждая программа может работать с од­ним или с несколькими файлами, расположенными на одном или нескольких серверах:

R1(Название файла, Имя владельца файла),

R2(Название программы, Название файла, Сотрудник),

R3(Название файла, Название сервера),

R4(Сотрудник, Отдел).

С использованием реляционной алгебры и языка составить запросы, позволяю­щие выбрать:

1. Файлы, которые имеют нескольких пользователей из разных отделов.

2. Программы, которые работают только с одним файлом.

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

4. Файлы, с которыми работают сотрудники всех отделов.

5. Файлы, пользователями которых являются сотрудники только одного отдела.

6. Программы, которые работают со всеми серверами.

7. Отделы, сотрудники которых не работают ни с одним файлом. То есть отделы, в которых нет ни одного сотрудника, работающего с каким-нибудь файлом.

8. Отделы, сотрудники которых работают со всеми серверами.

9. Серверы, с которыми работают сотрудники только одного отдела.

Ниже приводятся решения перечисленных задач.

1. Файлы, которые имеют нескольких пользователей из разных отделов.

а) R5=R2 R4 – добавили к R2 информацию об отделе пользователя файла.

б) Для ответа на вопрос нужно сделать тета-соединение отношения R5 самого с собой (для удобства обозначим копию R5 через R'5) при сложном условии несовпадения сотрудников и отделов для каждого файла, а потом спроектировать на атрибут "Название файла".

R6=ПНазвание файла (R5 R5.Название файла=R'5.Название файла Λ R5.Сотрудник <> R'5.Сотрудник Λ R5.Отдел <> R5.ОтделR'5) ,

где знак <> означает знак неравенства.

2. Программы, которые работают только с одним файлом.

а) Найдем программы , которые работают с более чем одним файлом (соединим R2 с самим собой, т.е. с его копией R'2)

R5=ПНазвание программы (R2 R2.Название программы=R'2.Название программы Λ R2.Название файла <> R'2.Название файла R'2)

б) Общий список работающих программ (при проекции повторяющиеся строки удаляются)

R6= ПНазвание программы(R2)

в) Вычтем из общего списка работающих программ те программы, к-рые работают со многими файлами – это и будет результат:

R7= R6 – R5

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

а) Выделим файлы с одинаковыми именами, но расположенные на различных серверах:

R5= ПНазвание файла(R3 R3.Название файла = R'3.Название файла Λ R3.Название сервера <> R’3.Название сервера R'3)

б) Выделим файлы, используемые сотрудниками разных (более одного) отделов. Для этого сначала добавим к R2 номер отдела сотрудника

R6= R2 R4

Теперь сделаем тета-соединение R6 с самим собой (R'6- копия R6)

R7= ПНазвание файла (R6 R6. Название файла=R'6. Название файла Λ R6.Отдел <> R'6.Отдел R'6)

Получили список файлов, которые используют сотрудники разных отделов.

в) Используя операцию пересечения R5 и R7, найдем общее для них подмножество файлов, которые имеют одинаковое имя, расположены на различных серверах и используются сотрудниками разных отделов:

R8= R5 R7

  1. Файлы, с которыми работают сотрудники всех отделов.

R5=R2 R4 – добавили к R2 информацию об отделе пользователя файла.

R6= ПНазвание файла, Отдел (R5) – список файлов и отделов, в которых работают с этими файлами.

R7=ПОтдел(R4) – список всех отделов.

R8= (R6 ÷ R7) – операция деления дает список файлов, с которыми работают во всех отделах.

5. Файлы, пользователями которых являются сотрудники только одного отдела.

R5=R2 R4 – добавили к R2 информацию об отделе пользователя файла.

R6=ПНазвание файла (R5 R5.Название файла=R'5.Название файла Λ R5.Отдел <> R5.ОтделR'5) – файлы, используемые несколькими (более одного) отделами.

R7= ПНазвание файла (R2) – все используемые файлы.

R8=R7 - R6 – файлы , используемые только одним отделом.

6. Программы, которые работают со всеми серверами.

R5=R2 R3 – добавили к R2 информацию об названии сервера.

R6= ПНазвание программы, Название сервера(R5) – список пар "программа-сервер".

R7= ПНазвание сервера(R3) – список всех серверов.

R8= R6 ÷ R7 – результат.

7. Отделы, сотрудники которых не работают ни с одним файлом. То есть отде­лы, в которых нет ни одного сотрудника, работающего с каким-нибудь фай­лом.

R5=R2 R4 – добавили к R2 информацию об отделе пользователя файла.

R6= ПОтдел(R5) – список отделов, сотрудники которых работают с файлами.

R7= ПОтдел(R4) - общий список отделов.

R8=R7 - R6 – результат, т.е. отделы, сотрудники которых не работают ни с одним файлом.

8. Отделы, сотрудники которых работают со всеми серверами.

а) R5=R2 R3 – добавили к R2 атрибут "Название сервера".

б) R6=R5 R4 – добавили к R5 атрибут "Отдел". Т.е. теперь отношение R6 имеет схему:

R6(Название программы, Название файла, Сотрудник, Название сервера, Отдел).

в) R7= ПНазвание сервера, Отдел (R6) – список пар "сервер-отдел".

г) R8=ПНазвание сервера(R3) – список всех серверов.

д) R9= R7 ÷ R8 – список отделов, которые работают со всеми серверами, что и требуется получить.

Этот результат можно записать сразу без промежуточных пошаговых записей:

R9= ПНазвание сервера, Отдел (R2 R3 R4) ÷ ПНазвание сервера(R3)

9. Серверы, с которыми работают сотрудники только одного отдела.

а) R5=R2 R3 – добавили к R2 информацию об атрибуте "Название сервера".

б) R6=ПНазвание сервера (R5 R5.Название сервера=R'5.Название сервера Λ R5.Отдел <> R5.ОтделR'5) – это список серверов, с которыми работают сотрудники более чем одного отдела.

в) R7=ПНазвание сервера(R3) – список всех серверов.

г) R8=R7 - R6 – список серверов, с которыми работают сотрудники только одного отдела, что и требуется определить.