在哪个标准化步骤i应该包括新的主键列

时间:2015-08-07 15:44:27

标签: database normalization

我有一张包含以下数据的表格。 我需要按照规范化规则对它们进行规范化,但我很困惑,我应该将规范化的哪一步引入CustomerId作为新的PrimaryKey列。

 CustomerName Address    ObjectRented    objectCatetory
-------------------------------------------------------
Mr A         Street 1    Obj1,Obj2       Cat1,Cat1
Mr B         Street 2    Obj3,Obj4       Cat2,Cat2
MR B         Street 3    Obj2            Cat1 

2 个答案:

答案 0 :(得分:1)

在此特定示例中,您甚至可以在进行规范化之前引入主键列。在添加主键(简化结构)后,您的表可能看起来像这样非规范化:

CustomerID CustomerName  Address  ObjectRented
---------- ------------- -------  ------------
1          Mr A          Street 1 Obj1,Obj2
2          Mr B          Street 2 Obj3,Obj4
2          Mr B          Street 3 Obj2

我写这篇文章的速度相当快,所以请阅读其他关于普通表格的答案和博客。

1NF - 删除重复组

CustomerID CustomerName  Address  ObjectRented
---------- ------------- -------  ------------
1          Mr A          Street 1 Obj1
1          Mr A          Street 1 Obj2
2          Mr B          Street 2 Obj3
2          Mr B          Street 2 Obj4
2          Mr B          Street 3 Obj2

2NF - 删除部分依赖

CustomerID实际上是一个客户,住在特定的位置。将它们放在一张桌子里。客户可以租用他们喜欢的任何东西......将他们租用的东西保存在不同的表格中:

客户

CustomerID CustomerName  Address
---------- ------------- -------
1          Mr A          Street 1
2          Mr B          Street 2
2          Mr B          Street 3

ObjectRental

CustomerID ObjectRented
---------- ------------
1          Obj1
1          Obj2
2          Obj3
2          Obj4
2          Obj2

在此阶段,您还可以将对象移动到自己的表中

物件

ObjectID ObjectName
-------- ----------
1        Obj1
2        Obj2
3        Obj3
4        Obj4

ObjectRental成为

CustomerID ObjectRentedID
---------- ------------
1          1
1          2
2          3
2          4
2          2

此时我相信你已经自动获得了3NF。在3NF中,您需要确保 - 松散地说 - 您的子表的主键与父表中的非主键无关。

答案 1 :(得分:0)

规范化不要求您引入代理键。它也不是要消除重复值。规范化的目的是避免多次记录相同的事实,因为同一事实的多个实例可能会不一致地更新并导致异常。

第一范式与其他形式略有不同,因为其目的是确保您的数据处于标量值的常规排列,以便系统地应用标准化。对于第一个普通表单,您需要确保每行的每个字段都包含一个值。 “Obj1,Obj2”看起来像多个值,所以你可能想从那里开始。然后,在继续执行更高级的常规表单之前写出您的函数依赖项。