我遇到了一些规范化问题。我有一个架构 REPAYMENT ,如下所示:
现在,根据我收集的内容,模式中包含的功能依赖项是
{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和贷款的请求日期来识别贷款。借款人可以在同一天偿还多笔(不同)贷款,但每笔贷款只能偿还一次(在一个日期有一笔金额)。有一个系统,每个请求日期和贷款金额确定还款日期和偿还金额。由于存在适用的利率,所申请的贷款金额和偿还金额并不相同。
答案 0 :(得分:1)
从候选键的定义:
在数据库的关系模型中,关系的候选键是 这种关系的最小超级钥匙;也就是说,一组属性 这样:
该关系没有两个不同的元组(即通用数据库语言中的行或记录),这些元素具有相同的值 属性(这意味着属性集是一个超级键)
- 醇>
这些属性没有适当的子集(1)成立(这意味着该集合是最小的)。
现在你的问题:
候选键是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。
- 计算R。
的键- 醇>
重复直到所有关系都在BCNF中。
- 选择任何R'拥有违反BCNF的F.D
A --> B
。- 分解R'进入R1(A,B)和R2(A,其余属性)。
- 为R1和R2计算F.D&。
- 计算R1和R2的密钥。
自 {request_date} - > {repayment_date,loan_amount} 和 request_date 不是密钥,它违反了BCNF,因此我们将模式拆分为两个关系:
R1(REQUEST_DATE,repayment_date,loan_amount)
R2(borrower_id,姓名,地址,REQUEST_DATE,repayment_amount)
显然R1在BCNF中。但是在BCNF中,R2 不,因为我们错过了以下的F.D.这是:
address --> name
我们知道地址不是关键,所以我们将R2进一步拆分为:
R3(borrower_id,地址,REQUEST_DATE,repayment_amount)
R4(地址,姓名)
现在,显然R3和R4都在BCNF中。如果我们不进一步拆分R2,我们最终会为该人所获得的每笔贷款存储相同的地址和名称组合,这就是冗余。