让是以下数据库:
Film(Title,Director,Actor)
Produce(Producer,Title)
Run Code Online (Sandbox Code Playgroud)
用关系代数表达以下问题:
哪些演员至少制作了一部电影?
哪些演员制作了他们导演的每部电影?
如果是这样,我会尝试以下方法:
? 演员(电影)?(制片人=演员=导演)?制作人(制作)
但我不确定这是关系代数中真正的连接操作。
对于第二个,我尝试了完全不同的东西:
? 演员(电影)÷? 导演(电影)÷? 制作人(制作)
对评论的回应:
记号Producer=Actor=Director
是错误的。除此之外,也没有?演员(电影)也不是?生产者(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{导演},\text{标题}}(\text{电影}) \bowtie \rho_{\text{导演}/\text{制片人}}(\text{制片人}) \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
Run Code Online (Sandbox Code Playgroud)
对于以下数据,结果是 Donald Duck
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
Run Code Online (Sandbox Code Playgroud)
Title | Director | Actor
-------------------+-------------+-----------
Mickey Mouse Revue | Donald Duck | Minnie Mouse
Mickey Mouse Revue | Donald Duck | Mickey Mouse
Duck Tales | Walt Disney | Donald Duck
Run Code Online (Sandbox Code Playgroud)
哪些演员制作了他们导演的每部电影
另外使用集差运算符 \
:
公式的乳胶:$$\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{导演}}(\pi_{\text{导演},\text{片名}}(\text{电影}) \setminus \rho_{\text{导演}/\text{制片人}}( \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)
Run Code Online (Sandbox Code Playgroud)