给出这些模式:
Account: bname,acct_no,余额
存款人: cname,acct_no
客户:名称,街道,城市
Loan:贷款编号,金额,b_name
借款人: cname,loan_no
Branch: bname,b_city,资产
问题:查找客户包括住在塔尔萨的所有客户的分支机构
我的教授给出了此解决方案:
Πcname,bname(帐户⋈储户)➗Πcname(σcity =='Tulsa'(客户))
我不认为<cname,bname(账户⋈存款人)是正确的因为那仅包括具有帐户的客户的名字和bname,而不包括所有客户(将那些拥有贷款的客户排除)。该问题并没有具体说明“查找其客户有帐户的分支机构包括居住在塔尔萨的所有客户”。
我想念什么?
[根据名称,对称性和您提到的“贷款和帐户客户”,我们可以猜测到,有一个正确的查询涉及(Account join Depositor)
和(Loan join Borrower)
的(投影的并集)。因此,看来您接受查询是合理的。但是您不给基表谓词(行出现的条件);您依靠我们来猜测。
在约束下,某些查询返回的结果与其他查询返回的结果相同,否则将不会。也许您的教授认为(很明显)借款人必须有一个帐户。在这种限制下,如果您的选择正确,那么他们的选择也是正确的。没有这样的约束,您是对的,因为它们是错误的。但是您也没有给出约束。
但是,您可能都错了:如果某个分支机构&Tulsa没有客户,那么结果应该保留该分支机构。但是商不会。该规范仅类似于对应于一个分区的规范。您的部门返回“其客户包括居住在塔尔萨的所有客户的分支机构”,并且至少有一个客户。这是规范和实现中涉及除法或几乎涉及除法的经典错误和歧义的情况。另一方面,也许存在一个约束,即没有银行没有客户。然后您的查询是正确的-但您的推理不正确。
Re relational querying.(您可以用来准确,合理地证明您的查询和参数合理。)