Relational-Theory

在關係代數中,連接操作上的三個等式是否合法?

  • March 18, 2016

讓我們成為以下數據庫:

Film(Title,Director,Actor)
Produce(Producer,Title)

用關係代數表達以下問題:

哪些演員至少製作了他們導演的電影?

哪些演員製作了他們導演的每一部電影?

  • 對於第一個問題,它引出了一個問題,因為我在 join 操作上有三個相等,我不知道它是否合法。

如果是,我會嘗試以下方法:

Π演員(電影)⋈(製片人=演員=導演)Π製片人(製片人)

但我不確定這是關係代數中真正的連接操作。

  • 對於第二個,我嘗試了一些完全不同的東西:

Π演員(電影)÷Π導演(電影)÷Π製片人(製片)

對評論的回應:

  • 一部電影可能有幾個演員。
  • 對於有多個演員的電影,關係電影中有多行
  • 導演可能也可能不是同一部電影中的**演員

符號Producer=Actor=Director是錯誤的。除此之外,**Π Actor (Film)Π Producer (Produce)**都沒有屬性Director。第一個投影只有一個屬性Actor,第二個投影只有一個屬性Producer

在第二個答案中,如果您劃分具有相同數量屬性的兩個關係,這意味著什麼。我認為這沒有意義,因為結果是沒有屬性的關係。

你的第一個關係Film(Title,Director,Actor)很奇怪。它定義了三個屬性演員、導演和頭銜之間的關係。但從我對電影的理解來看,並不存在這樣的關係。演員和片名之間存在關係,如果演員在具有該片名的電影中演出。如果一個人是這部電影的導演,那麼導演和片名之間就存在關係。但我不明白元組(演員、導演、頭銜)。一個演員在一部電影中有一個導演,而另一個演員在同一部電影中有另一個導演嗎?如果不是這種情況,那麼您最好使用兩個關係: A 關係Acts(Person, Title)和 關係Directs(Person, Title)

以下是僅使用自然連接的答案,這使它們有點笨拙。

第一個問題

哪些演員至少製作了他們導演的電影?

使用來自維基百科的符號得到以下答案:

加入公式

乳膠配方:

$$ \pi_{\text{Actor}}(\text{Film}) \bowtie \pi_{\text{Actor}}\left(\rho_{\text{Actor}/\text{Director}}\left(\pi_{\text{Director},\text{Title}}(\text{Film}) \bowtie \rho_{\text{Director}/\text{Producer }}(\text{Produce})\right)\right) $$

這是一個等效的 SQL 程式碼 (Oracle):

select F2.Actor
from Film F2 join (
 Film F1 join Produce P 
   on (F1.Director=P.Producer and F1.Title=P.Title)
 ) on F2.Actor=F1.Director

例子

對於以下數據,結果是Donald Duck

  • 電影
   Title              | Director    | Actor
   -------------------+-------------+-----------
   Mickey Mouse Revue | Donald Duck | Minnie Mouse
   Mickey Mouse Revue | Donald Duck | Mickey Mouse
   Duck Tales         | Walt Disney | Donald Duck
  • 製片人
   Producer    | Title 
   ------------+------------------
   Donald Duck | Mickey Mouse Revue 
   Walt Disney | Duck Tales 

第二個問題

哪些演員製作了他們導演的每一部電影

另外使用集差運算符 \

在此處輸入圖像描述

乳膠配方:

$$ \pi_{\text{Actor}}(\text{Film}) \bowtie \rho_{\text{Actor}/\text{Director}}(\pi_{\text{Director}}((\pi_{\text{Director},\text{Title}}(\text{Film}) \bowtie \rho_{\text{Director}/\text{Producer }}(\text{Produce}))\setminus \pi_{\text{Director}}(\pi_{\text{Director},\text{Title}}(\text{Film}) \setminus \rho_{\text{Director}/\text{Producer }}(\text{Produce})))) $$

這些都是(Director,Title)不是由標題導演製作的對:

在此處輸入圖像描述

因此,這些導演都沒有製作過至少一個頭銜:

在此處輸入圖像描述

類似地,這些都是至少製作了一個頭銜的導演:

在此處輸入圖像描述

不同之處在於導演製作了所有被導演的頭銜。現在我們必須將它加入到所有演員的集合中,以過濾出同時也是演員的導演(但對於他們導演的電影來說不是必需的)。

這是一個等效的 SQL 程式碼 (Oracle):

Select F2.Actor
from Film F2 join 
(
 (Select F1.Director,F1.Title
 from Film join Produce on (
     F1.Director=P.Producer 
     and F.Title=P.Filem))
 minus
 (Select Director, Title
 from Film
 minus
 select Producer,Title
 from Produce)
) F3
on(F2.Actor=F3.Director)

引用自:https://dba.stackexchange.com/questions/131217