-1

我有这些桌子

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'} Employee) x (σ {relationship='child'} Dependent),但我认为它不正确。

4

2 回答 2

0

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

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

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

于 2013-02-27T00:07:10.187 回答
0

π bdate (σ{sex = 'f'} Employee) x (σ{relationship='child'} Dependent)有暧昧bdate的s,会和每一个女员工一起带上每一个孩子,甚至是无关的孩子。

在任何关系代数表达式中,您首先投影您关心的属性:

π(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)))

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

于 2013-02-27T00:58:14.593 回答