Читайте также:
|
|
ПРИМЕР 1. Возьмем набор отношений, которые моделируют сдачу сессии студентами некоторого учебного заведения. Тема весьма понятная и привычная.
R1 (ФИО, Дисциплина, Оценка) - информация о попытках (как успешных, так и неуспешных) сдачи экзаменов студентами;
R2(ФИО, Группа) - состав групп;
R3 (Группа, Дисциплина) -список дисциплин, которые надо сдавать каждой группе
Домены для атрибутов формально задавать не будем, но, ориентируясь на здравый смысл, будем считать, что доменом для атрибута Дисциплина будет множество всех дисциплин, преподающихся в ВУЗе, доменом для атрибута Группа будет множество всех групп ВУЗа и т. д.
Покажем. каким образом можно получить из этих таблиц интересующие нас сведения с помощью реляционной алгебры. В каждом из приведенных примеров путем операций над исходными отношениями R1, R2, R3 формируются промежуточные отношения и результирующее отношение S, содержащее требуемую информацию.
1. Список студентов (только ФИО), которые сдали экзамен по БД на «отлично». Результат может быть получен применением операции выборки по сложному условию к отношению R1 и последующим проектированием на атрибут «ФИО» (нам ведь требуется только список фамилий).
S = ПФИО(sОценка=5 Λ Дисциплина= БД (R1))
2. Список тех, кто должен был сдавать экзамен по БД, но пока еще не сдавал. Сначала найдем всех, кто должен был сдавать экзамен по БД. В отношении R3 находится список всех дисциплин, по которым каждая группа должна была сдавать экзамены, ограничим перечень дисциплин только «БД», используя операцию выборки
R4 = sДисциплина= БД (R3)
Для получения всех ФИО из тех групп, которые должны сдавать БД, необходимо соединить R2 с R4, а потом спроектировать на ФИО. Используем операции естественного соединения и проекции:
R5= ПФИО(R2 R4)
Создадим список тех, кто сдавал БД согласно отношению R1 (нас пока не интересует результат сдачи, а интересует сам факт попытки сдачи, то есть присутствие в отношении R1):
R7=ПФИО(sДисциплина= БД (R1))
Окончательный результат (список еще не сдававших БД) получается путем вычитания R7 из отношения R5 (все кто есть в R5, но нет в R7):
S = R5 – R7
Примечание: Для получения R5 (минуя получение R4 ) мож но было сразу написать операцию тета-соединения
R5= ПФИО (R2 R3.НомерГруппы = R2.НомерГруппы Λ R3.Дисциплина = «БД» R3)
3. Список несчастных, имеющих несколько двоек (только ФИО):
Этот пример весьма интересен: для поиска строк, удовлетворяющих в совокупности условию больше одного, применяется операция тета-соединения отношения с самим собой. Поэтому мы как бы взяли копию отношения R1 и назвали ее R'1. Напомним, что тета-соединение – это подмножество декартового произведения, удовлетворяющее определенному предикату (условию). А декартово произведение получается путем конкатенации (сцепления) кортежей.
S = ПФИО(R1 R1.ФИО= R'1.ФИО Λ R1.Дисциплина≠ R'1.Дисциплина Λ R1.Оценка=2 Λ R'1.Оценка=2 R'1)
Обратите внимание на эту операцию – она применяется очень часто, когда надо найти список или перечень объектов, удовлетворяющих условию «больше одного».
4. Список круглых отличников.
Строим список всех пар <студент—дисциплина>, которые в принципе должны быть сданы:
R4 =ПФИО, Дисциплина (R2 R2.Группа = R3.Группа R3))
Строим список пар <студент— дисциплина>, где получена оценка «отлично»:
R5 = ПФИО,Дисциплина ((sОценка=5 (R1 ))
Строим список студентов, что-либо не сдавших на «отлично»:
R6 = ПФИО (R4 - R5)
Наконец, исключив последнее отношение из общего списка студентов, получаем результат:
ПФИО (R2) - R6
Обратите внимание, что для получения множества студентов, что-либо не сдавших на «отлично» (R6), мы осуществили «инверсию» множества всех отлично сданных пар <студент—дисциплина> (R5) путем вычитания его из предварительно построенного универсального множества (R4). Рекомендуем очень внимательно разобрать этот пример и вникнуть в смысл каждого действия — это очень пригодится для понимания реляционной алгебры. ЗАМЕЧАНИЕ: Вместо двух операций R5 и R6 здесь можно было сразу найти список студентов, что-либо не сдавших на отлично, если поставить в выборке условие Оценка≠5.
5. Общий список студентов, которые сдали все экзамены (для данной сессии)
Особенность ситуации такая, что есть группы как с одинаковыми, так и с разными экзаменами, что отражается в отношении R3. Для определенности положим, что у нас 3 группы с номерами 406, 407 и 507. Будем «погруппно» искать студентов, сдавших все экзамены, а потом объединим эти списки.
· Составим список пар «студент-дисциплина», у которых оценка больше
двойки:
R4 = ПФИО,Дисциплина ((sОценка>2 (R1 ))
Здесь указаны студенты всех групп, сдавшие хотя бы один экзамен.
· Для каждой группы определим список дисциплин, по которым сдаются экзамены
R406 = ПДисциплина ((sГруппа=406 (R3 ))
R407 = ПДисциплина ((sГруппа=407 (R3 ))
R507 = ПДисциплина ((sГруппа=507 (R3 ))
Если у групп 406 и 407 экзамены совпадают, то R406 = R407.
· Найдем списки студентов каждой группы, которые сдали все экзамены. Поскольку мы отвечаем на вопрос «все», то здесь нужно применить операцию деления. При этом студенты тех групп, в которых экзамены совпадают, попадут в одно отношение.
|
R6 = R4 ÷ R407
R7 = R4 ÷ R507
· Объединим эти отношения для получения общего списка студентов, сдавших все экзамены. Учтем, что при операции объединения кортежи-дубликаты исключаются.
R8 = R5 R6 R7
Получили список студентов всех групп (406, 407, 507), которые сдали все экзамены.
В случае, если встает вопрос о погруппных списках студентов, сдавших все экзамены, то надо действовать несколько иначе, сначала выделяя студентов каждой группы, сдавших хотя бы один экзамен.
6. Список студентов, которые сдали только один экзамен.
Другими словами, надо найти список студентов, которые получили только по одной дисциплине оценку выше 2.
· Найдем список студентов и дисциплин, по которым эти студенты имеют оценку выше двойки, т.е. сдали хотя бы один экзамен
R4 = ПФИО,Дисциплина ((sОценка>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 R2 – R3
Сначала с помощью операции пересечения определяются студенты, сдававшие 2 экзамена (общая часть первых двух отношений). Затем вычитаются студенты, поступившие в институт.
2. Список абитуриентов, которые поступили в вуз с первого раза, то есть они сдавали экзамены только один раз и сдали их так хорошо, что сразу были зачислены в ВУЗ.
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 (нет в билетах, можно использовать для примеров)
Даны отношения, моделирующие работу фирмы, занимающейся разработкой программных систем. Каждый сотрудник административно закреплен только за одним отделом. Файлы хранятся на разных серверах. На разных серверах файлы могут иметь одинаковые имена. Создатель файла является его владельцем, поэтому у каждого файла только один владелец, но владелец файла может разрешить пользоваться файлом другим сотрудникам. Существует множество системного программного обеспечения, каждая программа может работать с одним или с несколькими файлами, расположенными на одном или нескольких серверах:
Дата добавления: 2015-07-08; просмотров: 520 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Полусоединение | | | R4(Сотрудник, Отдел). |