如何将架构规范化为BCNF

时间:2017-09-22 08:39:59

标签: database database-design database-normalization bcnf

我遇到了一些规范化问题。我有一个架构 REPAYMENT ,如下所示:enter image description here

现在,根据我收集的内容,模式中包含的功能依赖项是

{borrower_id} - > {name,address,request_date,loan_amount}

{request_date} - > {repayment_date,loan_amount}

{loan_amount] - > {repayment_amount}

(如果我错了,请纠正我?)

我应该将架构规范化为BCNF,但我有点困惑。候选键是request_date还是borrower_id?

它可用于登记小额贷款的重新付款信息。借款人,他的姓名和地址,都有一个独特的借款人。借款人可以同时拥有多笔贷款,但每笔贷款(由loan_amount,repayment_date和repayment_amount指定)都有不同的请求日期。因此,可以使用借款人ID和贷款的请求日期来识别贷款。借款人可以在同一天偿还多笔(不同)贷款,但每笔贷款只能偿还一次(在一个日期有一笔金额)。有一个系统,每个请求日期和贷款金额确定还款日期和偿还金额。由于存在适用的利率,所申请的贷款金额和偿还金额并不相同。

1 个答案:

答案 0 :(得分:1)

从候选键的定义:

  

在数据库的关系模型中,关系的候选键是   这种关系的最小超级钥匙;也就是说,一组属性   这样:

     
      
  1. 该关系没有两个不同的元组(即通用数据库语言中的行或记录),这些元素具有相同的值   属性(这意味着属性集是一个超级键)

  2.   
  3. 这些属性没有适当的子集(1)成立(这意味着该集合是最小的)。

  4.   

现在你的问题:

  

候选键是request_date还是borrower_id?

这是一个超级钥匙,但不是最小的。以下是我们计算候选键的方法。

考虑到所有F,哪个属性仅出现在左侧。 D' s?

ITS borrower_id 。这意味着它必须是此给定架构的每个键的一部分。现在让我们计算它的结束。

因为 {borrower_id} - > {name,address,request_date,loan_amount}

closure(borrower_id)= borrower_id,name,address,request_date,loan_amount。

由于 {request_date} - > {repayment_date,loan_amount} 和关闭(borrower_id)有 request_date ,这意味着

closure(borrower_id)= borrower_id,name,address,request_date,loan_amount,repayment_date

最后因为 {loan_amount] - > {repayment_amount} 和关闭(borrower_id)有 loan_amount ,这意味着

closure(borrower_id)= borrower_id,name,address,request_date,loan_amount,repayment_date,repayment_amount

因为 borrower_id 的关闭包含所有属性, borrower_id 是一个关键,因为它是最小的,它确实是候选键,唯一的。

现在让我们将架构分解为 BCNF 。算法是:

  

给定模式R。

     
      
  1. 计算R。
  2. 的键   
  3. 重复直到所有关系都在BCNF中。

         
        
    • 选择任何R'拥有违反BCNF的F.D A --> B
    •   
    • 分解R'进入R1(A,B)和R2(A,其余属性)。
    •   
    • 为R1和R2计算F.D&。
    •   
    • 计算R1和R2的密钥。
    •   
  4.   

{request_date} - > {repayment_date,loan_amount} request_date 不是密钥,它违反了BCNF,因此我们将模式拆分为两个关系:

  1. R1(REQUEST_DATE,repayment_date,loan_amount)

  2. R2(borrower_id,姓名,地址,REQUEST_DATE,repayment_amount)

  3. 显然R1在BCNF中。但是在BCNF中,R2 ,因为我们错过了以下的F.D.这是:

    address --> name
    

    我们知道地址不是关键,所以我们将R2进一步拆分为:

    1. R3(borrower_id,地址,REQUEST_DATE,repayment_amount)

    2. R4(地址,姓名)

    3. 现在,显然R3和R4都在BCNF中。如果我们不进一步拆分R2,我们最终会为该人所获得的每笔贷款存储相同的地址和名称组合,这就是冗余。