2013-02-26 143 views
0

我有這些表關係代數查詢

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),但我認爲它不正確。

回答

0

x代表什麼?自然連接?笛卡爾積 ?

如果是笛卡爾產品,該笛卡爾產品將會/可能具有兩個不同的屬性,名稱爲BDATE。你需要處理它。

如果是自然連接,則BDATE屬性將成爲連接字段的一部分。你需要處理它。

+0

×在關係代數中總是笛卡爾連接。 – 2013-02-27 01:13:27

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

如果你非常瞭解關係代數,你可能會懷疑,我沒有能夠以最有效的方式做到了這一點。你會是對的,但這確實顯示了每一步的分開。優化此查詢僅作爲讀者的練習。