在关系代数中,连接运算的三个等式是否合法?

Rev*_*ica 4 relational-theory

让是以下数据库:

Film(Title,Director,Actor)
Produce(Producer,Title)
Run Code Online (Sandbox Code Playgroud)

用关系代数表达以下问题:

哪些演员至少制作了一部电影?
哪些演员制作了他们导演的每部电影?

  • 对于第一个问题,它让我想到一个问题,因为我在 join 操作上有三个相等,我不知道它是否合法。

如果是这样,我会尝试以下方法:

? 演员(电影)?(制片人=演员=导演)?制作人(制作)

但我不确定这是关系代数中真正的连接操作。

  • 对于第二个,我尝试了完全不同的东西:

    ? 演员(电影)÷? 导演(电影)÷? 制作人(制作)

对评论的回应:

  • 一部电影可能有多个演员。
  • 对于有多个演员的电影,关系Film中有多行
  • 一个导演可以或不可以,也是一个演员在同一个电影

mir*_*173 5

记号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)