银行业务情景的关系代数

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)

phi*_*pxy 7

给定声明。每个表/关系都有一个由列/属性参数化的语句。(其“特征谓词”。)使语句为真的行/元组进入表/关系。首先找到给定表/关系的语句:

// 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)

(请注意,在问题的第二部分尝试中,您不需要客户。因为您不需要它的声明。因为您可以声明想要的行的所有内容而没有它。因此,它只会添加库斯特县,最终不使用就扔掉。)

查询代数现在获取代数替换:

  • 每个语句的表/关系
  • 表/关系语句的每个AND?(自然加入)
  • 表/关系语句的每个OR(必须具有相同的列/属性),按?(联盟)
  • 语句的每个AND NOT(必须具有相同的列/属性)由\(不同)
  • 每个AND 条件由?条件
  • 每个保持名字的依据?要保留的名称(投影)(和Droping by?要保留的名称
  • 给定语句中每个列/属性的重命名由?(改名)。

?(交集)和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,OR,AND NOT和Keeping / Dropping。
  • 您是否不想知道您提到的列/属性的值?然后使用“保留/删除”(然后是?)。
  • 你提到太多名字了吗?然后保留您想要的文件吗?(以及相应的“保留/删除”)。

继续。

您将必须找到正确的顺序才能说出来。尝试其他顺序。因为您必须通过语句/表的AND NOT或条件来使用NOT。语句/表的AND和AND NOT的每一侧必须具有相同的列/属性。并且必须将条件中的名称与该名称进行“与”运算。

你的问题。我花了一段时间来解析并纠正您设定的目标:

显示所有贷款大于2000英镑的客户和所有存款账户小于150英镑的客户的分支机构,客户名称,余额和帐号。所有这些客户都应该在Romford分支机构。

这是:

  • 显示的分支机构,客户名称,帐户余额和帐号所有贷款额大于2000英镑的客户和存款余额小于150英镑的所有客户。所有这些客户应在Romford Branch。

(我不得不加一个词来理解这一点。但这令人难以置信,这应该是指“分支机构,客户名称,余额和编号[标为什么?],其中余额和编号是贷款余额和客户编号。 > 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语句提供行,然后代数为我们根据它们组合的任何其他语句计算行。