Выражение реляционной алгебры для - PullRequest
0 голосов
/ 02 сентября 2018

Я знаю, что этот вопрос уже задан здесь . Но там нет правильного ответа.

Рассмотрим следующие схемы реляционных баз данных:

КУРСЫ (Cno.name)
PRE-REQ (Cno, pre-Cno)
ВЫПОЛНЕНО (student_no, Cno)

КУРСЫ дают номер и название всех доступных курсов.
PRE-REQ предоставляет информацию о том, какие курсы являются обязательными для данного курса.
ЗАВЕРШЕНО указывает, какие курсы были пройдены студентами

Выразите следующее, используя реляционную алгебру:

Перечислите все курсы, для которых студент с student_no 2310 имеет выполнили все предварительные условия.

МОЯ ПОПЫТКА-

S ← π Cno (σ student_no=2310 (COMPLETED))
RESULT ← ((ρ (Course,Cno) (PRE−REQ))÷S)

same expression

Но я нашел в этом изъян. Пусть

PRE-REQ                    COMPLETED
Cno Pre-Cno                Student_no Cno
C1    C3                   2310       C3
C2    C4                   2310       C4

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

S         RESULT
Cno       Course Cno
C3
C4

Возможное решение, которое я могу найти, но с помощью SQL is-

SELECT Pre-Req.Cno 
FROM Completed, Pre-Req  
WHERE student_no = '2310'  
GROUP BY Pre-req.Cno  
HAVING pre-Cno IN (
    SELECT C.cno 
    FROM Completed AS C
    WHERE C.student_no = '2310';
    )

Есть ли другой возможный способ записи в виде выражения реляционной алгебры?

1 Ответ

0 голосов
/ 02 сентября 2018

Вот возможное решение (я буду использовать более простую запись):

COURSES_OF_2310 = π c←Cno (σ student_no=2310 (COMPLETED))
PARTIALLY_SATISFIED = PRE_REQ ⨝ PRE_REQ.preCno=c COURSES_OF_2310
NOT_SATISFIED = PRE_REQ - π Cno, preCno←c PARTIALLY_SATISFIED
FULLY_SATISFIED = π Cno PRE_REQ - π Cno (NOT_SATISFIED)

Это довольно сложно и, вероятно, может быть упрощено. Однако это должно работать сейчас. Вот пример, протестированный с RelaX :

COURSES(Cno)
C1
C2
C3
C4
C5
C6

PRE-REQ(Cno, pre-Cno)
C1 C3
C1 C4
C2 C3
C2 C4
C5 C3
C5 C6
C6 C4

COMPLETED(student_no, Cno)
2310 C3
2310 C4

PARTIALLY_SATISFIED(Cno, preCno c)
C1  C3  C3
C1  C4  C4
C2  C3  C3
C2  C4  C4
C5  C3  C3
C6  C4  C4

NOT_SATISFIED(Cno, preCno)
C5  C6

FULLY_SATISFIED(Cno)
C1
C2
C6
...