将数据库规范化为1nf,2nf,3nf,bcnf?

时间:2016-05-08 22:49:00

标签: database rdbms

我知道每个步骤的基本规则,但是当我必须应用它们时,我发现它们非常混乱。我现在正在研究这个例子

此表用于汽车租赁公司。客户可以从不同的商店租用汽车,特定的汽车仅在特定的商店提供,并且只能在给定日期雇用给一个客户。 1nf表包含字段:

CarReg,HireDate,Make,Model,CustNo,CustName,OutletNo,OutletLoc

主键是(carReg,HireDate)

有人可以通过逐步将其转换为bcnf来与我联系吗?并且每一步产生的结果?感谢

我的回答:

2nf

CarReg,HireDate,Custno,CustName(pk:CarReg,Hiredate)

CarReg,Make,Model,OutNo,outLoc(pk:CarReg)

3NF

CarReg,HireDate,CustNo(pk:carReg,HireDate)

CustNo,Custname(pk:custNo)

CarReg,Model,OutNo(pk:carReg)

Model,Make(pk:model)

OutNo,outLoc(pk:OutNo)

我的回答是对的吗?以及如何将其转换为bcnf?

1 个答案:

答案 0 :(得分:0)

为了做到这一点,你必须知道你列出的所有NF的定义。让我们回顾一下:

  • 1NF:简单地说 - 我们希望我们的桌子上没有其他的多值或复合属性。因此,我们将它们分成一个新表,附加一个键以将原始表与新表连接起来。

  • 2NF:这个有点棘手,但是你可以做到这一点:如果对复合键有一些依赖性,它必须是整个键而不仅仅是一些键。它。只有在表格中有复合键时,这才重要。

  • 3NF:这个说我们的表格属性不具备传递性。这意味着:我可以从一个属性知道所有其他属性而不管密钥吗?示例:假设您有一家餐馆和一份餐桌。用餐有什么用吗?价格,名称和让我们说一个ID。从用餐名称开始,假设餐点有独特的名称,您可以找到价格和ID。 ID被认为是关键,因此在3NF中不允许这样做。但现在假设您的客户有一张桌子。假设它有唯一的号码,姓名,地址和联系电话。现在,如果我们假设唯一的数字是关键,你能从他们的名字中找到其他属性吗?如果他们有相同的名字怎么办?甚至是同一个地址?显然,在这种情况下,这些都不具有传递性。

  • BCNF:简而言之,这表示对于任何类型的依赖,它必须只在密钥和密钥上。示例:假设您在餐馆中有一张表格,其中包含以下内容:bill_number,customer_number,waiter_ID,meal_number和说明。假设除描述之外的所有内容都是键和唯一的。看看现在发生了什么:waiter_ID取决于bill_number,所以我们可以通过它找到它。我们甚至不需要meal_number或customer_number,反之亦然。问题是这里存在一些不必要的关系,因此它们必须进一步分离,因为依赖关系不在整个键上。 (请注意,描述取决于所有这些。也许同一个服务员拿同一个客户的同一菜的账单。看看在这种情况下会发生什么?只有bill_number可用于识别)

    < / LI>

我对这些主题有点生疏,但这些不应该是错误的。总的来说,如果你理解正确的定义,你应该可以做得很好。 youtube上有很多很好的例子,来自我发现的。