关系代数习题中name1、name2属性的相关技术疑问
关系代数查询疑问解答
数据库模式
person(ID, firstName, lastName, nickName) follows(pID1, pID2)
- person表存储人员信息,ID为唯一标识
- follows表记录关注关系,pID1、pID2均为person表ID的外键
习题要求
编写关系代数查询,找出所有满足「name1关注name2」的昵称对(name1, name2)
疑问列表
- 习题初始未指定name1、name2属性,为何突然出现?
- name1、name2代表什么(如属性或nickName的子成分)?
- 编写查询时应如何使用这两个新属性?
你的查询语句问题分析
你给出的查询语句:
π nickName (σ pID1=ID ∧ pID2=ID (person ⨝ follows))
存在逻辑错误:连接person和follows后,同时要求pID1=ID和pID2=ID,等价于查询“关注自己的人”,且仅投影单个nickName,无法得到题目要求的二元昵称对。
疑问解答
为何突然出现name1、name2?
这是习题里的结果元组分量别名,用来明确查询输出的结构:一个二元组,第一个元素是关注者的昵称,第二个是被关注者的昵称。属于题目表述的简化指代,并非数据库中预先定义的属性。name1、name2代表什么?
name1对应关注者的nickName(即follows表中pID1关联的person的nickName),name2对应被关注者的nickName(即follows表中pID2关联的person的nickName)。它们是题目用来描述结果含义的命名,不是数据库原生属性。编写查询时如何使用这两个新属性?
需要通过两次关联person表,分别获取关注者和被关注者的昵称,再将这两个昵称投影并重命名为name1、name2。正确的关系代数查询示例:
π name1, name2 ( σ f.pID1 = p1.ID ∧ f.pID2 = p2.ID ( ρ p1(person) ⨝ ρ f(follows) ⨝ ρ p2(person) ) )
或更直观的写法:
π p1.nickName→name1, p2.nickName→name2 ( (person as p1 ⨝ follows) ⨝ person as p2 where p1.ID = follows.pID1 and p2.ID = follows.pID2 )
这里通过给person表重命名为p1(关注者)和p2(被关注者),分别关联follows的两个外键,最终将两个nickName映射为题目要求的name1、name2,得到符合需求的昵称对。
内容的提问来源于stack exchange,提问作者Paradoxac
相关产品推荐
相关产品推荐

