我有关系
R
-------
cid sid gradepoint credits
CS425 001 4.0 3
我需要计算GPA。有更多的行,但我相信如果我得到这个答案,我应该对其余的一切都好。我需要做gradepoint * credits
。我如何用关系代数表达式来表达它?
我最好的猜测是:
,但我不确定我是否可以将属性与 其他 相比,而不是常量。
答案 0 :(得分:0)
关系代数不解决特定于域的操作。它既不包括也不排除它,就像真正的代数既不包括也不包括对关系的操作。
如果允许乘以常数,那么你已经将代数组合起来了(这对于任何实际的应用都是非常需要的),所以我认为没有理由禁止属性之间的乘法。
答案 1 :(得分:0)
请注意,如果允许使用您正在使用的表达式,那么正在进行乘法的投影。而不是其输入是关系值&属性名称,其输入是关系值和某种类型的表达式,包括其输入是属性类型值的运算符的名称。您的投影正在解析和倍增。所以它是一个不同的运算符而不是只接受属性名称的运算符。
采用属性表达式的投影在给定代数时只考虑关系值和属性名称时引出其实现的问题。这在学术环境中很重要,因为一个问题可能是希望你真正弄清楚如何做到这一点,或者因为问题的难度取决于可用的操作员。那么找出你应该使用的代数。
当我们只有基本关系运算符获取属性名称和关系值时,我们可以在属性值上引入运算符。每个这样的运算符可以与关系值相关联,该关系值具有每个操作数的属性和结果的属性。该关系保存元组,其中结果值等于在操作数值上调用的运算符的结果。 (结果在功能上取决于操作数。)
假设我们有以下表值Times
,其中包含left * right = result
所在的元组:
left right result
-------------------
0 0 0
1 0 0
...
0 1 0
1 1 1
2 1 2
...
如果您的计算属性为result
,那么您需要
/* tuples where for some credits & gradepoint,
course cid's student sid earned grade gradepoint and credits credits
and credits * gradepoint = result
*/
project cid, sid, result (
R natural join (rename left\credits right\gradepoint (Times))
)
Relational algebra - recode column values
PS re代数与语言:什么是"关系代数"您正在使用?有许多。他们甚至对什么是"关系"有不同的概念。是。一些所谓的"代数"实际上是语言,因为表达式不代表在值上调用运算符的结果。虽然代数可能有操作数值来表示包含自身名称的表达式和/或关系值。
PS重新分离关注点:您还没有说出乘法结果的属性名称是什么。如果您希望它是credit * gradepoint
,那么您还期望投影将表达式值输入映射到属性名称。除非您期望credit * gradepoint
被识别为具有两个属性名称的表达式,并且和一个操作员名称在一个地方,但在另一个地方只是一个属性名称。在语言设计中有这些东西的解决方案,例如在专用于属性名称的SQL可选引号中。但也许你可以看到为什么简单的事情,比如代数操作只是属性名称&具有唯一,无序属性名称的关系值有助于我们理解自包含的块。