我有一种关系
R
-------
cid sid gradepoint credits
CS425 001 4.0 3
我需要计算GPA。有更多的行,但我相信如果我得到这个答案,我应该对其余的一切都好。我需要做gradepoint * credits
。我如何用关系代数表达式来表达它?
我最好的猜测是:
,但我不确定我是否可以将属性与常量之外的任何东西相乘。
关系代数不涉及特定于域的操作。它既不包括也不包括它,就像真正的代数既不包括也不排除对关系的操作。
如果你允许乘以常数,那么你已经将代数组合起来了(这对于任何实际的应用都是非常需要的),所以我认为没有理由不允许在属性之间进行乘法运算。
请注意,如果允许使用您正在使用的表达式,那么正在进行乘法的投影。它的输入不是其输入是关系值和属性名称,而是一个关系值和某种类型的表达式,包括其输入是属性类型值的运算符的名称。您的投影正在解析和倍增。所以它是一个不同于仅接受属性名称的运算符。
采用属性表达式的投影在给定代数时只考虑关系值和属性名称时引出其实现的问题。这在学术环境中很重要,因为一个问题可能是希望你真正弄清楚如何做到这一点,或者因为问题的难度取决于可用的操作员。那么找出你应该使用的代数。
当我们只有基本关系运算符获取属性名称和关系值时,我们可以在属性值上引入运算符。每个这样的运算符可以与关系值相关联,该关系值具有每个操作数的属性和结果的属性。该关系保存元组,其中结果值等于在操作数值上调用的运算符的结果。 (结果在功能上取决于操作数。)
所以假设我们有以下表值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可选引号中。但也许你可以看到为什么简单的事情,如代数操作只是属性名称和关系值与唯一的,无序的属性名称有助于我们理解自包含的块。