银行场景的关系代数

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余额

以上是关于银行场景的关系代数的主要内容,如果未能解决你的问题,请参考以下文章

场景编程集锦 - 银行柜员现金清分

NewSQL 在微众银行核心批量场景的应用

TiDB 在微众银行核心批量场景的实践

菊风Juphoon入选《2021爱分析·区域性银行数字化厂商全景报告》,被评为“远程银行”场景代表厂商

场景背后见真章:银行数字化转型持续深入

数字化时代商业银行客户触达策略研究 从数据到服务 由场景到生态