Autumn 2001
Total number of points:
100
1.
LivingBeing(id, name)
Human(lbID, phone)
Pet(lbID, tag)
Doctor(lbID, licence, pager)
HumanDoctor(licence)
PetDoctor(licence)
hVisit(lbID, licence, date)
pVisit(tag, ownerLbID, caregiverLbID, licence, date)
CREATE TABLE LivingBeing (id CHAR(10) PRIMARY KEY,
name CHAR (50)
);
CREATE TABLE Human(lbID CHAR (10) PRIMARY KEY,
phone CHAR(20),
FOREIGN KEY lbID
REFERENCE LivingBeing(id)
);
CREATE TABLE Pet(lbID CHAR (10)
UNIQUE,
tag CHAR(30) PRIMARY KEY,
FOREIGN KEY lbID REFERENCE LivingBeing(id)
);
CREATE TABLE Doctor(licence CHAR(20) PRIMARY KEY,
lbID CHAR (10) UNIQUE
FOREIGN KEY lbID REFERENCE Human(lbID)
);
CREATE TABLE HumanDoctor(licence CHAR (20) PRIMARY KEY,
FOREIGN KEY licence REFERENCE Doctor(licence)
);
CREATE TABLE PetDoctor(licence CHAR (20) PRIMARY KEY,
FOREIGN KEY licence REFERENCE Doctor(licence)
);
CREATE TABLE hVisit (lbID CHAR (10) REFERENCE Hman(lbID),
licence CHAR(20) REFERENCES HumanDoctor(licence),
date DATE
);
CREATE TABLE pVisit (tag CHAR (30) REFERENCES Pet(tag),
owner CHAR(10) REFENCES Human(lbID),
caregiver CHAR(10) REFERENCES Human(liID),
licence CHAR(20) REFERENCE PetDoctor(licence)
date DATE
);
2. Answers:
a. Keys are: ABC, BD
b. AD ŕ C violates BCNF, so we decompose in R1(A,C,D), R2(A, B, D). This is now in BCNF
c.
A |
B |
C |
D |
a |
b1 |
c |
d |
a |
b2 |
c |
d |
3. a.
Pname(File)
- Pname(Join(sname=”Smith”(User),
Join(stype=”owner”(Relationship),
File)))
b. i
select x1.name
from User x1,
Relationship y1, User x2, Relationship y2, File z
where x1.login = y1.uLogin AND y1.type=”writePermission” AND
y1.fName =
z.name AND
x2.login = y2.uLogin AND x2.name =
“Mary” AND
y2.type =
“owner” AND
y2.fName =
z.name AND
x1.office = x2.office
ii.
select User.name,
count(File.name), sum(File.size)
from User, Relationship, File
where User.login = Relationship.uLogin AND
Relationship.type = “owns”
AND Relationship.fName = File.name
group by User.name
having sum(File.size) > 5000000
iii
INSERT INTO Relationship(uLogin, fName, type)
SELECT x.login AS uLogin,
z.name as fName, “readPermission” as type
FROM User x, Relationship y, File z
WHERE x.login = y.uLogin
AND y.fName = z.name
AND y.type
= “writePermission”
AND not exists (SELECT *
FROM Relationship y2
WHERE
x.login=y2.uLogin AND
y2.fName = z.name AND
y2.type
= “readPermissions”)
iii.
select x.name
from User x
where not exists (select y.name
from
Relationship z, File y
where
x.login=z.uLogin AND z.fName = y.name AND
z.type = “readPermission” AND
not exists (select *
from
Relationship u, User v
where
v.name = “Smith” AND
u.uLogin = v.login AND
u.type = “owner” AND
u.fName = y.name))
]
4.
a
<!ELEMENT course (name, homework*)>
<!ELEMENT homework (number, points, turnin*)>
<!ELEMENT turnin (student, grade)>
<!ELEMENT student (name)>
<!ELMENET name (#PCDATA)>
<!ELEMENT number (#PCDATA)>
<!ELEMENT grade (#PCDATA)>
<!ELEMENT points (#PCDATA)>
b.
<!ELEMENT student (name, turning*)>
<!ELEMENT turning (grade,
homework)>
<!ELEMENT homework (course, number, points)>
<!ELEMENT course (name)>
(same #PCDATAs)