关系代数查询

时间:2013-02-26 06:11:09

标签: relational-algebra

我有这些表

Employee(ssn, name, sex, address, salary, bdate, dno, superssn)
fk:superssn is ssn in Employee
fk:dno is dnumber in Department

Department(dnumber, dname, mgrssn, mgrstartdate)
fk:mgrssn is ssn in Employee

Dept_locations(dnumber, dlocation)
fk:dnumber is dnumber in Department

Project(pnumber, pname, plocation, dnum)
fk:dnum is dnumber in Department

Dependent(essn, dependent_name, sex, bdate, relationship)
fk: essn is ssn in Employee

Works_on(essn,pno,hours)
fk: essn is ssn in Employee; pno is pnumber in Project

我想使用以下关系代数运算{σ,π,∪,ρ, - ,×}来检索每个女性员工的每个孩子的生日。

到目前为止,我有πbdate(σ{sex ='f'}员工)x(σ{relationship ='child'}依赖),但我不认为这是正确的。

2 个答案:

答案 0 :(得分:0)

x代表什么?自然加入?笛卡尔积?

如果是笛卡尔积,那么该笛卡尔积将会/可能有两个不同的属性,名为BDATE。你需要处理它。

如果是自然连接,则BDATE属性将成为连接字段的一部分。你需要处理它。

答案 1 :(得分:0)

π bdate (σ{sex = 'f'} Employee) x (σ{relationship='child'} Dependent)含糊不清bdate,每个女性员工都会加入每个孩子,甚至是不相关的孩子。

在任何关系代数表达式中,首先要预测你关心的属性:

π(ssn, sex)Employee ...something... π(essn, bdate, relationship)Dependent

现在您可以选择要加入的元组:

(σ{sex='f'} π(ssn, sex)Employee) ...something...
(σ{relationship='child'} π(essn, bdate, relationship)Dependent)

加入他们:

(σ{sex='f'} π(ssn, sex)Employee) ×
(σ{relationship='child'} π(essn, bdate, relationship)Dependent)

仅选择每位员工的家属:

σ{ssn=essn} ((σ{sex='f'} π(ssn, sex)Employee) ×
(σ{relationship='child'} π(essn, bdate, relationship)Dependent))

从那里,选择依赖的生日:

π(bdate)(σ{ssn=essn} ((σ{sex='f'} π(ssn, sex)Employee) ×
(σ{relationship='child'} π(essn, bdate, relationship)Dependent)))

如果你对关系代数有所了解,你可能会怀疑我没有以最有效的方式做到这一点。你是对的,但这确实分别显示了每一步。优化此查询是留给读者的练习。