让成为以下数据库:
Film(Title,Director,Actor)
Produce(Producer,Title)
在关系代数中表达以下问题:
哪些演员至少制作了一部他们执导的电影?
哪些演员制作了他们执导的每部电影?
- 对于第一个问题,就我在连接操作上有三个相等而我不知道它是否合法而言,它导致了我的问题。
如果是的话,我会尝试以下方法:
Π演员(电影)⋈( Producer=Actor=Director )Π Producer (Produce)
但我不确定这是否是关系代数中的真正连接操作。
对于第二个,我尝试了一些完全不同的东西:
π演员(电影)÷导演(电影)÷制片人(制作)
对评论的回应:
- 一部电影可能有几个演员。
- 对于有多位演员的电影,关系Film中有多行
- 导演可能也可能不是同一部电影中的演员
符号
Producer=Actor=Director
是错误的。除此之外,Π Actor (Film)和Π Producer (Produce)都没有属性Director
。第一个投影只有一个属性Actor
,第二个投影只有一个属性Producer
。在第二个答案中,如果你划分两个具有相同数量属性的关系是什么意思。我认为这没有意义,因为结果是没有属性的关系。
你的第一次关系
Film(Title,Director,Actor)
很奇怪。它定义了三个属性演员、导演和标题之间的关系。但以我对电影的理解,不存在这样的关系。演员和片名之间存在关系,如果演员在电影中扮演这个片名。如果一个人是这部电影的导演,那么导演和片名之间就有关系。但是我不明白元组(演员,导演,标题)。一个演员在一部电影中有一个导演,另一个演员在同一部电影中有另一个导演吗?如果不是这种情况,那么您最好使用两个关系: A relationActs(Person, Title)
和 relationDirects(Person, Title)
。以下是仅使用自然连接的答案,这让它们有点笨拙。
第一个问题
有以下答案,使用来自维基百科的符号:
这是等效的 SQL 代码 (Oracle):
例子
对于以下数据,结果是
Donald Duck
第二个问题
另外使用集合差异运算符
\
:这些都是
(Director,Title)
不是由片名导演制作的对:因此,这些都是没有产生至少一种头衔的董事:
类似地,这些都是至少制作过一部作品的导演:
不同之处在于导演制作了所有导演的作品。现在我们必须将它加入到所有演员的集合中,以过滤掉也是演员的导演(但不是他们导演的电影所必需的)。
这是等效的 SQL 代码 (Oracle):