【问题标题】:Relational Algebra expression for the given query给定查询的关系代数表达式
【发布时间】:2018-09-02 06:25:30
【问题描述】:

我知道这个问题已经被问到here。 但是那里没有正确回答。

Q) 考虑以下关系数据库方案:

课程(Cno.name)
PRE-REQ(Cno, pre-Cno)
已完成(student_no, Cno)

COURSES 提供所有可用课程的编号和名称。
PRE-REQ 提供有关哪些课程是给定课程的先决条件的信息。
COMPLETED 表示学生已经完成了哪些课程

使用关系代数表达以下内容:

列出学生编号为 2310 的学生所修读的所有课程 完成所有先决条件。

给出here的答案:

S ← π Cno (σ student_no=2310 (COMPLETED))
RESULT ← ((ρ (Course,Cno) (PRE−REQ))÷S)

但我发现了其中的一个缺陷。 假设

PRE-REQ                    COMPLETED
Cno Pre-Cno                Student_no Cno
C1    C3                   2310       C3
C2    C4                   2310       C4

所需的结果应该是 C1、C2,但我的查询将返回一个空关系,因为 C1 没有 C4 作为其先决课程,同样,C2 也没有 C3 作为其先决课程。

S         RESULT
Cno       Course Cno
C3
C4

在答案之一here 中给出的另一种解决方案是使用 SQL 是-

SELECT Pre-Req.Cno 
FROM Completed, Pre-Req  
WHERE student_no = '2310'  
GROUP BY Pre-req.Cno  
HAVING pre-Cno IN (
    SELECT C.cno 
    FROM Completed AS C
    WHERE C.student_no = '2310';
    )

有没有其他可能的写法是关系代数表达式?

【问题讨论】:

  • 请不要重复。根据许多 cmets 的问题编辑原始文件。如果你工作的一部分,问一个新问题,然后问一个关于其余部分的问题。但是请解释为什么您编码了您所做的事情,您认为正确和相关的内容,不正确的内容等(“您的”尝试的图像来自哪里?)您已经忽略了那里的 cmets 重新解释您的工作并给出您的代数。请阅读并根据点击谷歌搜索“stackexchange 作业”采取行动。 (还有“在线运行关系代数”。)另外(因为 RA 是代码)minimal reproducible example--通过给出有效的最大部分来证明“最小”。
  • 你最后一句话不清楚。使用足够多的句子来清楚地表达你的意思。另请解释为什么您的“因为”如此 - 这并不明显。 “空表”是什么意思——你的意思是空表吗?
  • 我已经阅读了该问题下方的所有 cmets,但无法找到我要查找的内容..
  • 无论如何,谢谢。下次我会注意的:)
  • 阅读我的 cmets。您没有在问题中提出其他问题中所说的问题应该存在的东西。此外,没有证据表明您试图找到该问题的解决方案或理解您提供的解决方案。重新链接/图像,因为您提供了文本,所以有人会将链接内联。但对于未来:请use text, not images/links, for text (including code, tables & ERDs)。使用图片只是为了方便补充文本和/或无法在文本中给出的内容。

标签: database relational-algebra


【解决方案1】:

这是一个可能的解决方案(我将使用更简单的符号):

COURSES_OF_2310 = π c←Cno (σ student_no=2310 (COMPLETED))
PARTIALLY_SATISFIED = PRE_REQ ⨝ PRE_REQ.preCno=c COURSES_OF_2310
NOT_SATISFIED = PRE_REQ - π Cno, preCno←c PARTIALLY_SATISFIED
FULLY_SATISFIED = π Cno PRE_REQ - π Cno (NOT_SATISFIED)

这是相当复杂的,可能可以简化。但是它现在应该可以工作了。这是一个使用RelaX 测试的示例:

COURSES(Cno)
C1
C2
C3
C4
C5
C6

PRE-REQ(Cno, pre-Cno)
C1 C3
C1 C4
C2 C3
C2 C4
C5 C3
C5 C6
C6 C4

COMPLETED(student_no, Cno)
2310 C3
2310 C4

PARTIALLY_SATISFIED(Cno, preCno c)
C1  C3  C3
C1  C4  C4
C2  C3  C3
C2  C4  C4
C5  C3  C3
C6  C4  C4

NOT_SATISFIED(Cno, preCno)
C5  C6

FULLY_SATISFIED(Cno)
C1
C2
C6

【讨论】:

  • 但是C3和C4(其中没有)的所有先决条件也已经完成。我们看到带有“all”的查询的常见规范歧义,这可能会或可能不会通过 Codd 的除法或全称量化来解决。
  • @philipxy,我认​​为这需要一个递归解决方案,这在“常规”关系代数中是不可能的。
  • 先生,C6 课程的先决条件也已完成..但是您的查询不会返回它..我在上面写了相同的表达式,但我只坚持这样的情况。
  • 这就是为什么不应该回答不清楚的问题。
  • @user9014873,你是对的,我已经改变了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多