2014-02-05 2 views
1

Извините за туманную тему вопроса!Реляционная алгебра "группировка"

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

Теперь вот вопрос:

For each department, find the maximum salary of instructors in that 
department. You may assume that every department has at least one 
instructor. 

выложу схему, а также, в качестве визуального помощника. enter image description here

Я работал над этим вопросом;

Мне нужно отношение, которое включает в себя всех инструкторов в любом отделе, у нас это есть. Это отношение instructor.

Из этого соотношения мне нужно «разбить» его на единицу. и как только у меня есть это отношение, я просто возьму max(salary) и верну это.

Проблема, единственный способ, которым я могу думать, чтобы сделать что-то вроде этого:

π(max(salary)(σ(dept_name = x(instructor))) 

где х = все, что dept_name я ищу, но если я сделал это так, то я «Мне нужно сделать новое отношение для каждого отдела!

Как вы это сделаете?

(Примечание: Я просто скопировать и paste'd символы из википедии, если вы хотите использовать их в своем ответе)

ответ

1

Моя реляционная алгебра может быть немного ржавый, но я думаю, что

dept_name_G_{max(salary)}(
    σ_{ddept_name = idept_name}(
     ρ_{dept_name/ddept_name}(department) ⨯ 
     ρ_{dept_name/idept_name}(instructor) 
    ) 
) 

- это то, что вы ищете.

Помните, что все выступы - это просто операции над наборами. Первое, что вы хотели бы сделать с , - это информация, полученная от department и instructor, чтобы собрать информацию вместе. Итак, вы хотите присоединиться к department и instructor, в основном крест продукта ():

department = {(depA, 100$), (depB, 200$)} 
instructor = {(will, depA, 10$), (bob, depB, 20$), (will, depB, 9$)} 
department ⨯ instructor = { 
          (depA, 100$, will, depA, 10$), 
          (depA, 100$, bob, depB, 20$), 
          ..., 
          (depB, 200$, will, depA, 10$), 
          ... 
          } 

Так что вы хотите сейчас фильтровать кортежи, где dept_name инструктора Равен dept_name отдела. Но вы также заметили, что теперь у вас столкновение имен, , а именно столбец dept_name появляется дважды.

Как вы не можете просто сделать σ_{dept_name = dept_name}(department ⨯ instructor), вам нужно переименовать на по меньшей мере одно из полей dept_name. Я переименовал оба для ясности, какой из них принадлежит.

Так что теперь у вас есть

σ_{ddept_name = idept_name}(
    ρ_{dept_name/ddept_name}(department) ⨯ 
    ρ_{dept_name/idept_name}(instructor) 
) 

давая вам:

{ 
(depA, 100$, will, depA, 10$), 
(depB, 200$, bob, depB, 20$), 
(depB, 200$, will, depB, 9$) 
} 

Весь процесс является natural join и может быть выражена в ближайшее время с:

department ⋈ instructor 

Теперь окончательное шаг - проецировать максимальную зарплату на один отдел. Простая проекция не может сделать это но aggregation operator может:

{dept_name}_G_{max(salary)}(department ⋈ instructor) 

приводит

{ 
(depA, 10$), 
(depB, 20$) 
} 
+0

Это очень хорошо! Он отвечает на мой вопрос и устраняет путаницу, которую я испытывал между перекрестным продуктом и естественным объединением. Основные реквизиты для этого! – YourbrainonCompSci

+0

@YourbrainonCompSci & nemo Естественное соединение возвращает только один столбец для каждого имени входного столбца. Чтобы получить естественное соединение, переименовав оба столбца dept перед перекрестным объединением, вы должны проецировать один и переименовать другую обратно после ограничения. (И это переименование отсутствует в версии в верхней части ответа.) Или, чтобы получить естественное соединение, просто переименуйте один столбец и проецируйте его после ограничения. – philipxy

+0

@YourbrainonCompSci & nemo За исключением того, что в традиционной реляционной алгебре нет MAX или GROUP. Это, по существу, SQL, а не какая-либо типичная реляционная алгебра. Хотя некоторые запросы, выражаемые с ними, могут быть выражены без них. Как и в вопросе. Назначение намного сложнее, если вам запрещено использовать их. Интересно, какая алгебра должна была использоваться. (Их много). – philipxy

Смежные вопросы