关系代数和关系演算之间的确切区别是什么?在大多数参考文献中,它将是
Relational algebra is procedural and calculus is non procedural
。
那么,这些代表什么呢。但是,我们可以使用关系解决所有问题 代数。那么为什么我们要使用关系演算。除了定义,用例子解释非常感谢。
答案 0 :(得分:5)
TL; DR:查询调用RA(关系代数)运算符&查询两个关系结石(RCs)TRC(元组RC)& DRC(域RC)是同一事物的不同语法:关系值或关系值的元组必须满足的属性/条件。和SQL一样(它们的混合(上))。与谓词演算一样,数学,逻辑,科学(包括计算机科学)和数学的精确语言也是如此。工程(包括软件工程)。而RA作为程序性与RCs作为声明是一个神话。
relation 包含使元素参数化的谓词 - 语句模板的元组 - 成为真正的命题 - 语句。
/* tuples where employee PERSONNAME lives on STREET in CITY */
Employee
/* tuples where employee PERSONNAME works at COMPANY for $SALARY */
WorksFor
RA样式的查询表达式涉及属性名称,关系变量/常量名称,关系文字(涉及属性名称和值)和&关系运营商。运算符是JOIN,UNION,MINUS,PROJECT,RESTRICT等。它表示通过计算表达式得到的关系值。但它也是要满足价值的要求。
/* RA query for tuples where
FOR SOME STREET & CITY [employee PERSONNAME lives on STREET in CITY]
AND NOT FOR SOME COMPANY & SALARY
[employee PERSONNAME works at COMPANY for $SALARY AND COMPANY = 'FBC']
*/
PROJECT PERSONNAME (Employee)
MINUS PROJECT PERSONNAME (RESTRICT COMPANY = 'FBC' (WorksFor))
关系值的RC表达式为set-builder notation。它涉及一个带有关系变量/常量名称,属性名称和属性的谓词。价值观,谓词算子和量化名称(逻辑变量)。运算符是AND,OR,NOT,FOR SOME / ALL和=。它通常被视为满足价值的要求。但它也表示通过评估表达式或某个等价表达式得到的关系值。
DRC已量化属性名称。我们对每个属性使用一个参数的语句使用简写:
Employee(PERSONNAME, STREET, CITY)
means (PERSONNAME, STREET, CITY) IN Employee
means employee PERSONNAME lives on STREET in CITY
WorksFor(PERSONNAME, COMPANY, SALARY)
means (PERSONNAME, COMPANY, SALARY) IN WorksFor
means employee PERSONNAME works at COMPANY for $SALARY
/* DRC query for the same tuples as the RA query above */
tuples like (PERSONNAME) where
FOR SOME STREET & CITY [Employee(PERSONNAME, STREET, CITY)]
AND NOT FOR SOME COMPANY & SALARY
[WorksFor(PERSONNAME, COMPANY, SALARY) AND COMPANY = 'FBC']
TRC已经量化了作为元组的名称。我们点一个名称来获取与其中的属性名称相关联的值。 (就像编程语言记录的字段一样。)我们使用一个参数(一个元组)的语句的简写:
Employee(T)
means T IN Employee
means employee T.PERSONNAME lives on T.STREET in T.CITY
Worksfor(T)
means T IN Worksfor
means employee T.PERSONNAME works at T.COMPANY for $T.SALARY
/* TRC query for the same tuples as the RA query above */
tuples equal to some tuple T like (PERSONNAME) where
FOR SOME E [Employee(E) AND E.PERSONNAME = T.PERSONNAME]
AND NOT FOR SOME W [
WorksFor(W)
AND W.COMPANY = 'FBC'
AND E.PERSONNAME = T.PERSONNAME
]
(有关RA和RCs原件的一些变体被教导。例如,一些按顺序识别参数,其他一些按名称识别。有时候会增加额外的功能。例如,允许在RC中进行函数调用就像允许一定的表达一样RA中的关系常量加运算符 R RENAME A TO N 。)
然而,RA运营商和RC运营商之间存在对应关系。在RA表达式和RC表达式之间:
如果:
•R - 保持元组R(...)
•S - 保持元组S(...)
然后:
•R JOIN S保存元组,其中R(...)和S(...)
•R UNION S保持元组R(...)或S(...)
•R MINUS S保持元组R(...)AND NOT S(...)
•R PROJECT 列保持保存元组,其中FOR SOME 列要删除,R(...)
•R RESTRICT 条件保存元组,其中R(...)AND 条件
RA表达式的值是满足相应RC表达式的元组。
如果我们想要逐个运算符从RC表达式映射到RA表达式,那么我们需要扩展的RA运算符:一个概括UNION&一个对应于NOT。那些不是我们想要在实现中实际使用的运算符 - 返回的关系值在某种意义上是不可取的大。但是使用它们的每个RC表达式都可以机械地重新排列为仅使用基本RA运算符的正常形式。
所以:RA作为程序对象和RCs作为声明是一个神话。每个RA运算符都有一个相应的RC运算符,每个RC运算符都有一个(可能是扩展的)相应的RA运算符,并且每个运算符的每个表达式都具有(在基本和扩展的意义上)另一个的相应表达式。它们是同一事物的两个符号。任何一个的表达都可以作为"程序"通过执行它作为解析或规范化和"声明"否则执行它。这个神话试图捕捉到RC表达式不像运算符那样使用基本RA运算符的表达式。但RC表达式 使用基本运算符识别其非显而易见的正常形式的RA表达式。并且它是运算符的运算符,就像包含扩展运算符的RA表达式一样。
(由于词语的历史,这个神话可能会有所帮助。"现代代数"表达式与操作员一起服用并给出值并且可以计算。&#34 ;微积分"又名分析 - 微分和积分 - 具有通过不可能计算无限极限和总和来描述值的表达式。我们以其他方式计算,通常只计算近似值。)
(另外,具有讽刺意味的是:"谓词演算"被认为是指定事物"声明性地"不考虑如何以其他方式计算或估计它们。但标准语义/意义这样的表达式是通过遵循一个遍历表达式树的算法给出的。因此它具有明显的程序性解释。)
答案 1 :(得分:3)
转到此链接了解详情。 http://ecomputernotes.com/database-system/rdbms/relational-algebra-and-relational-calculus
[
答案 2 :(得分:2)
答案 3 :(得分:0)
关系代数和关系微积分之间的区别
关系代数运算操纵一些关系并以查询的形式提供一些表达式,其中关系演算是基于表达式对查询形成的。
RA具有连接,联合,交集,除法,差异,投影,选择等运算符,其中RC具有元组和面向域的表达式。
RA是程序性语言,其中RC是非程序性查询系统。
RA和RC的表现力相当。这意味着任何可以用RA表达的查询都可以用RC中的公式表示。
任何KC公式都在Algebric查询中翻译。
RA中的查询比RC更容易进行修改。
RA形成了数学形式,没有特定的语言RC也有数学形式,但有一种查询语言QUEL。
关系代数比RC更易于操作和理解。
RA查询比RC更强大。
RC形成WFF,其中RA不形成任何公式。
RA是程序性的。这意味着我们已经按顺序写了一些条件。
RC是非程序性的。在这里,我们以任何顺序编写条件。
实施例: -
图书馆示例: -
Book is a relation it have a following attributes.
1. Book Name
2. Accession Number
3. Year of publication
问题: -
Find out the all book names published in the year 2000
关系代数: -
-------------------------------------------------------
| (σ (book) ) |
| ¶ (yr_pub=2000) |
| (Book name) |
------------------------------------------------------
关系演算: -
S = { t | ∃ u ∈ book (t[book name] = u[book name]) ∧ (u[yr_pub] = 2000 ) }
在这个关系演算中,我们可以在下面的任何地方写出条件。
S = { t | ∃ u ∈ book (u[yr_pub] = 2000 ) ∧ (t[book name] = u[book name]) }
但是在关系代数中,我们必须首先找到出版年份为2000的元组,然后我们只需要提取书名列。