【问题标题】:Why can't you just join in fan trap?你为什么不能加入粉丝陷阱?
【发布时间】:2017-11-27 19:18:52
【问题描述】:

我正试图了解粉丝陷阱到底是什么。

我不明白您为什么不知道销售代表处理的帐户?

您不能直接加入销售代表、分公司和客户表并找出答案吗?我错过了什么?

【问题讨论】:

  • 你可以加入三个表,实际上我鼓励你建立一个例子并这样做。您应该看到的是每个分支机构的销售代表和客户的笛卡尔连接。
  • 您的研究结果如何? PS 可以使用 [text](meta.stackoverflow.com/q/285551/3404097(这里是 DDL.) 时请不要使用图片

标签: database database-design entity-relationship


【解决方案1】:

您可以加入粉丝陷阱的表格/关系。如果您认为生成的表/关系意味着它没有的东西,这只是一个陷阱。当然,如果您需要认为的表/关系,则意味着您缺少它并需要添加它。

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 对应于ANDUNIONOR 等。这就是我们可以证明查询表达式返回所需的合理性的方法行。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多