银行场景的关系代数
Posted
技术标签:
【中文标题】银行场景的关系代数【英文标题】:Relational algebra for banking scenario 【发布时间】:2014-06-26 05:42:50 【问题描述】:我不知道如何解决关系代数问题。
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)
生成一个关系,显示所有的分行、客户名称、余额和帐号 贷款超过 2000.00 英镑的客户以及所有拥有存款账户的客户 余额小于 150.00 英镑。所有客户都应该在 Romford 分店。
这是我到目前为止想出的。对吗?
π 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 < 150 ∧ branch = 'Romford' (Deposit) ∪ π Branch, Cust-Name, Balance, Loan-No σ Balance > 2000 ∧ branch = 'Romford' (Loan) )
【问题讨论】:
在我的答案中添加了正确的代数。 (请注意,您在下面的答案不是合法的代数表达式。) 问题末尾的答案也不是合法的代数表达式,原因与下面的答案相同。 (虽然略有不同)。 这篇文章已经关闭并重新打开了几次,最初关闭是因为不是为了编程。这是那些不了解关系模型的重要性和本质的人的误解。除了关系代数被专门设计为一组实用的可执行运算符之外,它还是关系查询推理的基础。请参阅下面的答案和Is there any rule of thumb to construct SQL query from a human-readable description?@ 可悲的是 SQL 程序员大多没有正确地接触到这一点。 【参考方案1】:给定语句。每个表/关系都有一个由列/属性参数化的语句。 (它的“特征谓词”。)使语句为真的行/元组进入表/关系中。首先找到给定表/关系的语句:
// 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、AND NOT 和 条件。保留或删除名称。如果需要,请使用新名称。
我会在你的作业中举一个例子:
-- 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]
现在我想为贷款余额使用不同的名称,因为我想最终只对账户余额使用 Balance:
-- 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,那么它必须是贷款余额和帐户余额。行/元组将用于贷款余额与帐户余额相同的客户。而 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')
这是示例行的语句。
您可以使用“保留 names to keep”或“Dropping names to drop。(在逻辑上,Dropping 被称为 FOR SOME 或 THE EXISTS。因为我们想要对于名称的某些值,其中的语句为真,即我们希望名称的存在值使语句为真。)
查询简写。现在用简写替换每个语句。
在我的示例中,我得到:
-- 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你最终没有使用就扔掉了。)
查询代数现在获取代数替换:
每个语句都按其表/关系进行 表/关系语句的每个 AND 由 ⋈(自然连接) 表/关系语句的每个 OR(必须具有相同的列/属性)由 ∪(联合) 每个 AND NOT 语句(必须具有相同的列/属性)由 \(差异) 每个 AND 条件 by σ 条件 每一个 names to keep 由 π names to keep(投影)(和 Dropping by π names to keep) 给定语句中的每个列/属性都由 ρ(重命名)重命名。∩(交集)和 x(乘积)是 ⋈ 的特例(∩ 表示两边相同的列/属性,x 表示没有共享的列/属性)。
请记住,列/属性名称是由表/关系语句和表/关系引入的,但会被 Keeping/Dropping 和 π 删除。请记住,给定语句中的重命名会变成 ρ。
我明白了:
-- algebra style version
π Branch, Cust-Name, Balance, Acc-No
σ Branch='Romford' σ Loan-Balance>2000
((ρ Loan-Balance/Balance Loan) ⋈ Deposit)
(我不知道您应该使用哪种特定的代数表示法。了解其用于点名和使用等值连接与自然连接的规则。我也不知道它允许什么样的 σ 条件。)
按照示例进行。因此,请对行进行描述并编写一个语句,使这些行完全正确。然后转换为给定的语句。然后用简写代替。然后用代数替换。
您给出的陈述是什么? 它们的速记是什么? 它们的表/关系名称是什么? 它们的列/属性是什么? 您想要的行/元组的列/属性是什么? 什么是清晰、简单、自然的语言陈述,您想要的行是真实的,而您不想要的行却不是?但要避免使用代词,因为它们不会转化为代数;只需重用列/属性名称。如果您需要一个新名称,只需发明一个并发表声明即可。 作为整体陈述一部分的一个给定陈述是什么? 什么是速记版本? 代数版本是什么? 您是否更改了给定语句中的名称?然后通过 ρ 在其表/关系中重命名它。继续你的整体陈述的另一部分。
您想要给定语句的组合吗?然后使用 AND、OR、AND NOT 和 Keeping/Dropping。 您不想知道您提到的列/属性的值吗?然后使用 Keeping/dropping(然后是 π)。 你提到的名字太多了吗?然后通过 π(以及相应的 Keeping/Dropping)保留您想要的那些。继续。
你必须找到正确的顺序来表达。尝试不同的顺序。因为您必须通过语句/表的 AND NOT 或通过条件使用 NOT。语句/表的 OR 和 AND NOT 必须在每一侧具有相同的列/属性。条件中的名称必须在与它进行 AND 运算的语句中提及。
你的问题。我花了一段时间来解析和纠正你给出的目标:
显示所有分行、客户名称、余额和帐号 贷款超过 2000 英镑的客户和所有客户 存款账户余额小于 150 英镑。所有这些 客户应该在 Romford 分店。
这是:
显示分行、客户名称、账户余额和帐号(所有贷款超过 2000 英镑的客户和所有存款账户为余额小于 150 英镑 ) 。所有这些客户都应该在 Romford Branch。(我不得不添加一个词来理解这一点。但令人难以置信的是,这应该意味着“分支、客户名称、余额和编号 [标记什么??] 其中余额和编号是贷款余额和编号对于贷款 > 2000 或余额和数量的客户,对于账户余额
这中间有一个 AND,所以你可能会认为它会给出代数 ⋈(自然连接)或 ∩(交集)。但是您必须仅根据给定的语句和条件来描述您的列/属性。事实证明,AND 变成了 OR。事实证明,我们必须添加额外的存款声明。这样我们就有了贷款客户的账户信息。请记住,您必须在 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
现在我们想要使语句“语句 A OR 语句 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'
这是对所需行的声明。现在我们用简写代替:
-- 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:代数 = 无环计算 关系代数的重点在于语句与代数表达式完全对应:语句对应于表/关系,而(语句的)逻辑运算符对应于代数运算符。但是代数版本是无环描述,可以自动计算。使语句为真的行是其代数版本的值。我们给出表/关系语句的行,代数计算我们从它们组合的任何其他语句的行。
【讨论】:
感谢您的解释,但是对于超过 2000 英镑的部分贷款该怎么办.. 表明你正在尝试。我在我的回答中添加了:“按照示例进行操作。”一步一步地按照答案所说的去做。将您的尝试放入您的问题中。包括部分工作。解释你的步骤。 我猜我的导师在某些方面是错的,但我在考试前就解决了。谢谢你。这对我帮助很大。【参考方案2】:这是我想出的答案:
π Branch, Cust-Name, Balance, Acc-No, (σ Balance < 100^branch=”Romford” (Deposit))
∪
π Branch, Cust-Name, Balance, Loan-No, (σ Balance > 2500 ^branch=”Romford”(Loan))
【讨论】:
这不仅仅是错误,它是 invalid 因为 ∪ 需要两边的列/属性相同。即使您将数字列重命名为相同,例如“否”,英文也不接近。首先,您提供的英语仅要求提供帐号。将贷款编号标记为帐号并不能使其成为一个。其次,有效的代数需要的英文远非你给的:“branch, customer name, balance and number where balance and number are loan balance and number for customers with loan > 2000 or balance and number are account balance and number for customers with account余额以上是关于银行场景的关系代数的主要内容,如果未能解决你的问题,请参考以下文章