在關係代數中,連接操作上的三個等式是否合法?
讓我們成為以下數據庫:
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)