第三范式
第三范式(3NF)是数据库规范化中所使用的一种正规形式,用来检验是否所有非键属性都只和候选键有相关性,也就是说所有非键属性互相之间应该是无关的。 第三范式和第二范式不同的地方在于,在第三范式里,所有的非键属性都必须和每个候选键有直接相关。如果再对第三范式做进一步加强就成了BC范式,它所强调的重点就在于 \数据间的关系是奠基在键上、以整个键为考量、而且除了键之外不考虑其他因素\。
以下面这个定义机械组件的关系为例:
机械组件 组件编号 制造商名称 制造商地址 (主键) 1000 1001 1002 Toyota Park Avenue Mitsubishi Lincoln Street Toyota Park Avenue 本例中制造商地址很明显地不该被列在这个关系里面,因为和组件本身比起来,制造商地址应该和制造商比较有关系;正确的做法应该是把独立成为一个新的数据表:
制造商 制造商名称 制造商地址 (主键) Toyota Park Avenue Mitsubishi Lincoln Street 然后把原本的数据表改成这样:
机械组件 组件编号 制造商名称 (主键) 1000 1001 1002 Toyota Mitsubishi Toyota 先前那个数据表的问题在于每提到一次制造商名称就要多存一次它的地址,而这就不符合第三范式的原则。 下面提供了另一个例子:
订单 (Order) 订单编号 (Order Number) (主键) 1000 1001 1002 客户名称 (Customer Name) David Jim Bob 单价 (Unit Price) $35.00 $25.00 $25.00 数量 (Quantity) 3 2 3 小计 (Total) $105.00 $50.00 $75.00 在本例中,非主键字段完全依赖于主键订单编号,也就是说唯一的订单编号能导出唯一非主键字段值,符合第二范式。第三范式要求非主键字段之间不能有依赖关系,显然本例中小计依赖于非主键字段单价和数量,不符合第三范式。小计不应该放在这个数据表里面,只要把单价乘上数量就可以得到小计了;如果想要符合第三范式的话,就把小计拿掉吧 (不过在做查询的时候,本来用 \FROM Order\就要改成用 \了)。
订单 (Order) 订单编号 (Order Number) (主键) 1000 1001 1002
客户名称 (Customer Name) David Jim Bob 单价 (Unit Price) $35.00 $25.00 $25.00 3 2 3 数量 (Quantity)