关系代数(完整性检查):客户包括所有 Tulsa 客户的分支机构

Relational Algebra (sanity check): branches whose customers include all Tulsa customers

Given These Schemas:

Account: bname, acct_no, balance
Depositor: cname, acct_no
Customer: cname, street, city <-(all customers / both loan and account customers)
Loan: loan_no, amount, b_name
Borrower: cname, loan_no
Branch: bname, b_city, assets

Question: Find branches whose customers include all customers that live in Tulsa

我的教授给出了这个解决方案:

Π cname, bname(account ⋈ depositor) / Πcnamecity == ‘Tulsa’ (customers))

我认为 Π cname, bname(account ⋈ depositor) 部分不正确 因为那只包括有账户的客户的 cname 和 bname,不包括所有客户(不包括有贷款的客户)。题目没有具体说"Find branches whose customers with accounts include all customers that live in Tulsa"。

我错过了什么?

我们可以猜测——根据名称、对称性和你提到的 "loan and account customers"——有一个正确的查询涉及 (Account join Depositor)(Loan join Borrower)(投影的并集) .所以看起来你对查询的看法是合理的。但是您不提供基础 table 谓词(行出现的条件);靠我们猜。

在约束条件下,某些查询 return 与其他人查询的结果相同,否则不会。也许你的教授认为(很明显)借款人必须有一个账户。在这种限制下,如果你的看法是正确的,那么他们的看法也是正确的。没有像这样的某些限制,你是对的,他们是错的。但是你也不给约束。

然而,您可能都错了:如果某个分支机构和 Tulsa 没有客户,那么结果应该保留该分支机构。但是商不会。规范只和一个部门对应的类似。您的部门 return 和 "branches whose customers include all customers that live in Tulsa" 至少有一位客户。这是涉及除法和几乎涉及除法的规范和实施中的经典错误和歧义的案例。另一方面,可能存在没有银行没有客户的约束。那么您的查询是正确的——但不是您的推理。

Re relational querying.(您可以使用它来准确而合理地证明您的查询和论点。)