答案 0 :(得分:0)
您可以加入粉丝陷阱的表格/关系。如果您认为结果表/关系意味着它没有意义,那么它只是一个陷阱。当然,如果您需要表格/关系,那么认为就意味着您错过了它并需要添加它。
Works_for(rep,branch) -- (rows where) rep *rep* works for branch *branch*
Manages(branch,account) --(rows where) some branch *branch* rep manages account *account*
/* (rows where)
rep *rep* works for branch *branch*
AND some branch *branch* rep manages account *account*
*/
Works_for NATURAL JOIN Manages
如果您认为该联接必须持有
/* (rows where)
rep *rep* works for branch *branch*
AND rep *rep* manages account *account*
*/
Works_for_and_manages(rep, branch, account)
然后你陷入了陷阱。
两个连接谓词(语句模板)不等同(在每种情况下,每个行都没有相同的真值),当它"粉丝"基数约束的模式成立。因此,他们的表格并不总是保持相同的价值。
如果每个分支机构只有一名员工 - 他必须管理所有帐户,也许您可以看到它们是等效的。但是,那些红衣主教并不会成为粉丝。然而,更可能的是两个谓词不等同,所以你不能从另一个构造谓词/表/关系,而更好的设计有Works_for
和
Manager(rep, account) -- (rows where) rep *rep* manages account *account*`
然后Manages
为SELECT branch, account FROM Works_for NATURAL JOIN Manager
。即行for some *rep*, [rep *rep* works for branch *branch* AND rep *rep* manages account *account*]
。
(由关系运算符产生的表具有由某些相应逻辑运算符产生的谓词。JOIN
对应于AND
,UNION
对应OR
等。这就是我们如何能够证明查询表达式返回所需的行。)