银行业务情景的关系代数

我有一种情况,我无处可去。 我不知道如何解决关系代数问题。

Deposit (Branch, Acc-No, Cust-Name, Balance) Loan (Branch, Loan-No, Cust-Name, Balance) Branch (Branch, Assets, Branch-County) Customer (Cust-Name, Cust-County, Branch) 

产生一个关系,显示贷款大于2500.00英镑的所有客户的分行,客户名称,余额和帐号,以及所有存款余额小于100.00英镑的客户。 所有客户都应该在罗姆福德分店。

这是我到目前为止所提出的。 这是对的吗?

 π Branch, Acc-No, Cust-Name, Balance ( σ(Loan.Balance > 2000 ∧ branch='Romford')(Loan) ∪ σ(Deposit.Balance < 150 ∧ branch='Romford')(Customer ∩ Deposit) ) 

正确的激光是:

  π Branch, Cust-Name, Balance, Acc-No, (σ Balance < 100^branch=”Romford” (Deposit)) ∪ π Branch, Cust-Name, Balance, Loan-No, (σ Balance > 2500 ^branch=”Romford”(Loan)) 

给定的陈述。 每个表/关系都有一个由列/属性参数化的语句。 (它的“特征谓词”)。使expression式为真的行/元组进入表/关系。 首先find给定表/关系的陈述:

 // customer [Cust-Name] has £[Balance] in account [Acc-No] at branch [Branch] Deposit (Branch, Acc-No, Cust-Name, Balance) // customer [Cust-Name] loan [Loan-No] balance is £[Balance] at branch [Branch] Loan(Branch, Loan-No, Cust-Name, Balance) . . . 

注意表/关系定义是语句的缩写。

查询语句。 现在把这些给定的语句放在一起,得到一个只有我们想要的行满足的声明。 使用AND,OR,NOT和AND 条件 。 保留或放弃名字。 如果您需要,请使用新名称。

我会做一个例子,像你的任务的一部分:

 -- informal style version branch, customer name, account balance and account number for customers that have a loan bigger than £2000 at Romford branch 

我想要这些行。 所以我想要一个声明,确切地说,这些行是真实的。 所以我发表的声明越来越接近我想要的。 所以我开始:

 -- columns/attributes Cust-Name, Loan-No, Balance, Branch customer [Cust-Name] loan [Loan-No] balance is £[Balance] at branch [Branch] 

现在我想为贷款余额使用一个不同的名称,因为我只想结束帐户余额的余额:

 -- columns/attributes Cust-Name, Loan-No, Loan-Balance, Branch customer [Cust-Name] loan [Loan-No] balance is £[Loan-Balance] at branch [Branch] 

现在我也想要帐户余额:

 -- columns/attributes Cust-Name, Loan-No, Loan-Balance, Branch, Balance, Acc-No customer [Cust-Name] loan [Loan-No] balance is £[Loan-Balance] at branch [Branch] AND customer [Cust-Name] has £[Balance] in account [Acc-No] at branch [Branch] 

如果我只使用一个名称余额,那么它将不得不是一个贷款余额和帐户余额。 行/元组本来是用于贷款余额与账户余额相同的客户。 Balance列/属性就是那些值。

现在我想限制余额和分支:

 -- columns/attributes Cust-Name, Loan-No, Loan-Balance, Branch, Balance, Acc-No customer [Cust-Name] loan [Loan-No] balance is £[Loan-Balance] at branch [Branch] AND customer [Cust-Name] has £[Balance] in account [Acc-No] at branch [Branch] AND [Loan-Balance]>2000 AND [Branch]='Romford' 

现在我只想要一些列/属性:

 -- statement style version -- columns/attributes Cust-Name, Branch, Balance, Acc-No Keeping Branch, Cust-Name, Balance, Acc-No: ( customer [Cust-Name] loan [Loan-No] balance is £[Loan-Balance] at branch [Branch] AND customer [Cust-Name] has £[Balance] in account [Acc-No] at branch [Branch] AND [Loan-Balance]>2000 AND [Branch]='Romford') 

这是示例行的声明。

你可以使用“Keeping names to keep ”或“Dropping names drop” (在逻辑上,Dropping被称为FOR SOME或THEN EXISTS,因为我们希望它里面的语句对于某个名字的某些值是真的,我们希望THERE EXISTS值是一个名字使得声明成立。)

查询速记。 现在用简写replace每个语句。

在我的例子中,我得到:

 -- shorthand style version -- columns/attributes Cust-Name, Branch, Balance, Acc-No Keeping Branch, Cust-Name, Balance, Acc-No: ( Loan (Branch, Loan-No, Cust-Name, Loan-Balance) AND Deposit (Branch, Acc-No, Cust-Name, Balance) AND Loan-Balance>2000 AND Branch='Romford') 

(请注意,在你的问题的后半部分你不需要客户,因为你不需要它的声明,因为你可以在没有它的情况下陈述你想要的所有行,所以它只是添加你最终的Cust-County扔掉不用。)

查询代数现在得到代数replace:

  • 每个表格/关系的声明
  • 表/关系语句的每个AND由⋈(自然连接)
  • 表/关系语句(必须具有相同的列/属性)的每个OR由∪(union)
  • 每个AND NOT语句(必须具有相同的列/属性)由\(差异)
  • 每个AND 条件由σ 条件
  • 每个保持名称保持 π 名保持 (投影)(和删除π 名保持
  • 每个列/属性通过ρ(重命名)在给定语句中重命名。

∩(交点)和x(乘积)是special(∩对于两侧相同的列/属性和x没有共享列/属性)的特殊情况。

请记住,列/属性名称由表/关系语句和表/关系引入,但通过保留/删除&π来删除。 请记住,给定语句中的重命名变为ρ。

我得到:

 -- algebra style version π Branch, Cust-Name, Balance, Acc-No σ Branch='Romford' σ Loan-Balance>2000 ((ρ Loan-Balance/Balance Loan) ⋈ Deposit) 

(我不知道你应该使用什么特定的代数符号,学习它的点名规则,使用equijoin和自然连接,也不知道它允许什么样的σ条件。

根据例子。 因此,请对行进行说明,并写出恰好这些行成立的声明。 然后转换为给定的语句。 然后用shorthandsreplace。 然后用代数代替。

  • 你的陈述是什么?
  • 他们的短手是什么?
  • 他们的表/关系名称是什么?
  • 他们的专栏/属性是什么?
  • 你想要的行/元组的列/属性是什么?
  • 什么是清晰,简单,自然的语言陈述,你想要的行是真实的,但你不想要的行呢? 但是避免使用代词,因为它们不会转化为代数; 只是重用列/属性名称。 如果你需要一个新的名字,那么只需要创build一个名字就可以了。
  • 什么是你整体陈述的一部分?
  • 什么是简写版本?
  • 什么是代数版本?
  • 你是否在给定的陈述中改变了名字? 然后通过ρ将其重命名为表格/关系。

继续进行总体陈述的另一部分。

  • 你想要一个给定的语句的组合? 然后使用AND,OR,NOT和保持/删除。
  • 你不想知道你提到的列/属性的价值吗? 然后使用保持/下降(然后π)。
  • 你提到的名字太多了吗? 然后通过π保持你想要的(和相应的保持/放下)。

继续。

你将不得不find正确的命令来说事。尝试不同的命令。 因为你必须通过AND NOT NOT语句/表或通过条件来使用NOT。 而且语句/表的OR和AND NOT在每一边必须有相同的列/属性。 在一个条件中的名字必须在一个声明中提到,它是与。

你的问题。 我花了一段时间来parsing和纠正你给的目标:

显示所有贷款超过2000英镑的客户的分行,客户名称,余额和账号,以及所有存款账户余额小于150英镑的客户。 所有这些客户都应该在Romford分行。

这是:

  • 显示所有贷款超过2000英镑的客户以及所有存款账户余额小于150英镑的客户)的分行,客户名称, 账户余额和账户号码。 所有这些客户应该在Romford分行。

(我不得不添加一个词来说明这个问题,但是令人难以置信的是,这意味着“分支,客户名称,余额和数字(标有”什么“),其中余额和数字是客户的贷款余额和数量贷款> 2000或余额和数字是账户余额<150“的客户的账户余额和数量。)

这在中间有一个AND,所以你可能会认为它会给一个代数⋈(自然连接)或∩(连接)。 但是,只能根据给定的陈述和条件来描述你的列/属性。 事实certificate,AND变成了一个OR。 另外事实certificate,我们必须添加一个额外的存款声明。 所以我们有贷款客户的帐户信息。 请记住,您必须在OR(或AND NOT)的两侧具有相同的列/属性。

所有贷款超过2000英镑的客户的第一“分行,客户名称,账户余额,账户号码”。 这看起来像我们上面做的。 但是这一次让我们稍后再限制分支:

 -- statement A -- columns/attributes Cust-Name, Branch, Balance, Acc-No Keeping Branch, Cust-Name, Balance, Acc-No: ( customer [Cust-Name] loan [Loan-No] balance is £[Loan-Balance] at branch [Branch] AND customer [Cust-Name] has £[Balance] in account [Acc-No] at branch [Branch] AND [Loan-Balance]>2000) 

现在“所有存款账户余额小于150英镑的客户”的分行,客户名称,账户余额,账户号码。 这比以前更简单,所以我希望你能直接理解它:

 -- statement B -- columns/attributes Cust-Name, Branch, Balance, Acc-No customer [Cust-Name] has £[Balance] in account [Acc-No] at branch [Branch] AND [Balance]<150 

现在我们需要使语句“statement A OR statement B”为真的行:

 -- columns/attributes Cust-Name, Branch, Balance, Acc-No Keeping Branch, Cust-Name, Balance, Acc-No: ( customer [Cust-Name] loan [Loan-No] balance is £[Loan-Balance] at branch [Branch] AND customer [Cust-Name] has £[Balance] in account [Acc-No] at branch [Branch] AND [Loan-Balance]>2000) OR customer [Cust-Name] has £[Balance] in account [Acc-No] at branch [Branch] AND [Balance]<150 

现在我们限制分支:

 -- statement for goal -- columns/attributes Cust-Name, Branch, Balance, Acc-No ( Keeping Branch, Cust-Name, Balance, Acc-No: ( customer [Cust-Name] loan [Loan-No] balance is £[Loan-Balance] at branch [Branch] AND customer [Cust-Name] has £[Balance] in account [Acc-No] at branch [Branch] AND [Loan-Balance]>2000) OR customer [Cust-Name] has £[Balance] in account [Acc-No] at branch [Branch] AND [Balance]<150 ) AND [Branch]='Romford' 

这是要求的行的声明。 现在我们用shorthandsreplace:

 -- shorthand for goal -- columns/attributes Cust-Name, Branch, Balance, Acc-No ( Keeping Branch, Cust-Name, Balance, Acc-No: ( Loan (Branch, Loan-No, Cust-Name, Loan-Balance) AND Deposit (Branch, Acc-No, Cust-Name, Balance) AND [Loan-Balance]>2000) OR Deposit (Branch, Acc-No, Cust-Name, Balance) AND [Balance]<150 ) AND [Branch]='Romford' 

一个答案。 现在我们用代数代替:

 -- algebra style version σ Branch='Romford' ( π Branch, Cust-Name, Balance, Acc-No σ Loan-Balance>2000 ((ρ Loan-Balance/Balance Loan) ⋈ Deposit) ∪ σ Balance<150 Deposit)) 

PS:代数=空洞计算关系代数的全部点是语句完全对应于代数expression式:语句对应于表/关系和(语句)逻辑运算符对应于代数运算符。 但是代数版本是一个可以自动计算空洞描述 。 使声明为真的行是其代数版本的值。 我们表/关系语句的行,代数计算我们从它们组合的任何其他语句的行。

这是我想出的答案:

 π Branch, Cust-Name, Balance, Acc-No, (σ Balance < 100^branch=”Romford” (Deposit)) ∪ π Branch, Cust-Name, Balance, Loan-No, (σ Balance > 2500 ^branch=”Romford”(Loan))