我有这些表
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'}依赖),但我不认为这是正确的。
答案 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)))
如果你对关系代数有所了解,你可能会怀疑我没有以最有效的方式做到这一点。你是对的,但这确实分别显示了每一步。优化此查询是留给读者的练习。