您可以加入粉丝陷阱的表格/关系。如果您认为生成的表/关系意味着它没有的东西,这只是一个陷阱。当然,如果您需要您认为的表/关系,则意味着您缺少它并需要添加它。
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 等。这就是我们可以证明查询表达式返回所需的合理性的方法行。)