use*_*348 4 relational-algebra
我处于无处可去的情况。我不知道如何解决关系代数问题。
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)
Run Code Online (Sandbox Code Playgroud)
产生一个关系,该关系显示所有贷款大于2500.00英镑的客户和所有存款账户小于100英镑的客户的分支机构,客户名称,余额和帐号。所有客户都应在Romford分公司。
到目前为止,这是我想出的。这是对的吗?
? Branch, Acc-No, Cust-Name, Balance (
?(Loan.Balance > 2000 ? branch='Romford')(Loan)
? ?(Deposit.Balance < 150 ? branch='Romford')(Customer ? Deposit)
)
Run Code Online (Sandbox Code Playgroud)
正确的答案是:
? Branch, Cust-Name, Balance, Acc-No,
(? Balance < 100^branch=”Romford” (Deposit))
?
? Branch, Cust-Name, Balance, Loan-No,
(? Balance > 2500 ^branch=”Romford”(Loan))
Run Code Online (Sandbox Code Playgroud)
给定声明。每个表/关系都有一个由列/属性参数化的语句。(其“特征谓词”。)使语句为真的行/元组进入表/关系。首先找到给定表/关系的语句:
// 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)
. . .
Run Code Online (Sandbox Code Playgroud)
请注意,表/关系定义是该语句的简写。
查询语句。现在,将这些给定的语句放在一起以获得仅我们要满足的行的语句。使用AND,OR,AND 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
Run Code Online (Sandbox Code Playgroud)
我想要那些行。所以我想要一个声明,正是这些行是正确的。因此,我所做的陈述越来越接近我想要的陈述。所以我开始:
-- columns/attributes Cust-Name, Loan-No, Balance, Branch
customer [Cust-Name] loan [Loan-No] balance is £[Balance] at branch [Branch]
Run Code Online (Sandbox Code Playgroud)
现在,我想为贷方余额使用一个不同的名称,因为我最终希望仅对帐户余额使用余额:
-- columns/attributes Cust-Name, Loan-No, Loan-Balance, Branch
customer [Cust-Name] loan [Loan-No] balance is £[Loan-Balance] at branch [Branch]
Run Code Online (Sandbox Code Playgroud)
现在我也想要帐户余额:
-- 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]
Run Code Online (Sandbox Code Playgroud)
如果我只使用一个名称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'
Run Code Online (Sandbox Code Playgroud)
现在我只想要一些列/属性:
-- 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')
Run Code Online (Sandbox Code Playgroud)
这是示例行的声明。
您可以使用“保留名称 ”或“删除名称以放置。”(在逻辑上,Droping称为FOR SOME或THERE EXISTS。因为我们希望其中的语句对于某个名称的FOR SOME值是正确的,即我们希望该声明的值存在,以便使该语句为真。)
查询速记。现在,将每个语句替换为其速记。
在我的示例中,我得到:
-- 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')
Run Code Online (Sandbox Code Playgroud)
(请注意,在问题的第二部分尝试中,您不需要客户。因为您不需要它的声明。因为您可以声明想要的行的所有内容而没有它。因此,它只会添加库斯特县,最终不使用就扔掉。)
查询代数现在获取代数替换:
?(交集)和x(乘积)是?的特例 (?表示双方相同的列/属性,x表示没有共享的列/属性)。
请记住,列/属性名称是由表/关系语句和表/关系引入的,但由“保留/删除&”除去的。请记住,给定语句中的重命名会变成?。
我得到:
-- algebra style version
? Branch, Cust-Name, Balance, Acc-No
? Branch='Romford' ? Loan-Balance>2000
((? Loan-Balance/Balance Loan) ? Deposit)
Run Code Online (Sandbox Code Playgroud)
(我不知道您应该使用哪种特殊的代数符号。了解其点名称以及使用等联接与自然联接的规则。同样,我也不知道它允许哪种条件?)
根据例子。因此,请对行进行描述并编写一条语句,使这些行完全正确。然后转换为给定的语句。然后用简写代替。然后用代数代替。
继续进行总体陈述的另一部分。
继续。
您将必须找到正确的顺序才能说出来。尝试其他顺序。因为您必须通过语句/表的AND NOT或条件来使用NOT。语句/表的AND和AND NOT的每一侧必须具有相同的列/属性。并且必须将条件中的名称与该名称进行“与”运算。
你的问题。我花了一段时间来解析并纠正您设定的目标:
显示所有贷款大于2000英镑的客户和所有存款账户小于150英镑的客户的分支机构,客户名称,余额和帐号。所有这些客户都应该在Romford分支机构。
这是:
(我不得不加一个词来理解这一点。但这令人难以置信,这应该是指“分支机构,客户名称,余额和编号[标为什么?],其中余额和编号是贷款余额和客户编号。 > 2000的贷款或余额和编号是帐户余额<150“的客户的帐户余额和编号。)
它的中间有一个AND,因此您可能会认为它将给出一个代数?(自然加入)还是?(路口)。但是,您必须仅根据给定的语句和条件来描述列/属性。事实证明,AND变成OR。而且事实证明,我们必须添加一个额外的Deposit语句。这样我们就可以获得贷款客户的帐户信息。请记住,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)
Run Code Online (Sandbox Code Playgroud)
现在“分支机构,客户名称,帐户余额,帐户编号”“所有存款帐户余额少于£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
Run Code Online (Sandbox Code Playgroud)
现在我们想要使语句“ 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
Run Code Online (Sandbox Code Playgroud)
现在我们限制分支:
-- 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'
Run Code Online (Sandbox Code Playgroud)
这是通缉行的声明。现在我们用速记代替:
-- 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'
Run Code Online (Sandbox Code Playgroud)
一个答案。现在我们用代数代替:
-- algebra style version
? Branch='Romford'
( ? Branch, Cust-Name, Balance, Acc-No
? Loan-Balance>2000
((? Loan-Balance/Balance Loan) ? Deposit)
? ? Balance<150 Deposit))
Run Code Online (Sandbox Code Playgroud)
PS:代数=无循环计算关系代数的全部要点是,语句完全对应于代数表达式:语句对应于表/关系,(语句的)逻辑运算符对应于代数运算符。但是,代数版本是可以自动计算的无环描述。使语句为真的行是其代数形式的值。我们为table / relation语句提供行,然后代数为我们根据它们组合的任何其他语句计算行。