我的练习答案很大程度上依赖于关系代数过程查询语言。
练习如下:
考虑以下关系数据库模式:
person(ID, firstName, lastName, nickName) follows(pID1, pID2)
关系实例 person 存储每个人的信息。每个人都通过他们的 ID 来识别。关系实例 follow 跟踪谁关注谁,即 pID1 follow pID2。属性 pID1 和 pID2 都是关系人中属性 ID 的外键
编写一个关系代数查询,查找所有昵称对 (name1, name2),使得 name1 跟随 name2。
由于练习语句一开始并没有指定这两个属性,所以属性
name1
和 name2
是如何突然发挥作用的?
name1
和name2
代表什么(例如,nickName
的属性或子成分)?
在编写关系代数查询时我应该如何使用这两个全新的属性?
我的回答:
π nickName (σ pID1=ID ∧ pID2=ID (person ⨝ follows))
分解:
person ⨝ follows
- 使用自然连接操作(也称为笛卡尔积?)来组合表并简化过滤过程。σ pID1=ID ∧ pID2=ID
- 使用选择操作过滤掉不遵守上述顺序的名称 - “名称 1 跟随名称 2” - 将约束与 ID 属性相关联。
c) π nickName
- 仅检索“nickName”列及其关联的域,这些域是其封装的字符类型值。自从我在课堂上使用该符号以来已经很长时间了。
在标准 SQL 数据库中,您会看到类似这样的内容。希望这有帮助。
select distinct p1.nickName name1, p2.nickName name2
from follows f
join person p1 on p1.ID = f.pID1
join person p2 on p2.ID = f.pID2