3.2.2 第二范式—关系型数据库设计的第二步
第二范式是在第一范式的基础上进一步对关系型数据库进行规范,官方给出第二范式的定义是要求在数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖。意思就是说在第二范式中组合主键(AB)里面的A或者B与其他字段不能存在组合重复。为解决这个问题,通常的做法是不用组合主键,添加一个编号列,作为单一主键即可满足第二范式。如果不想添加编号列,就满足组合主键(AB)里面的A或者B与其他字段不能存在组合重复。例如,设计一个购物信息表,字段包括客户编号、产品名称、产品数量、产品类型、产品价格、客户类型。如果用客户编号和产品名称作为组合主键,那么在组合主键中产品名称和产品类型存在一定关系,是由产品名称决定产品的类型,所以不符合第二范式的要求,如果不按照第二范式的要求设计表,就会出现以下4个问题:
1.数据冗余
同一个产品由n个顾客购买,“产品类型”就重复n-1次;同一个顾客购买了多件产品,那么就会多次记录顾客的个人信息。
2.更新异常
若调整了某个产品的类型,数据表中所有行的“产品类型”值都要更新,否则会出现同一个产品不同类型的情况。
3.插入异常
假设新进了一个产品,暂时还没有人购买。这样,由于没有人购买,产品的名称和类型也无法记录到数据库中。
4.删除异常
假设一批顾客把已经购买完的商品退货,这些产品信息就从数据表中删除了。但是,与此同时,产品名称和产品类型等信息也被删除了。这样就导致了删除异常。
为了消除数据冗余、更新异常、插入异常和删除异常,可以把现有的一个表拆分成3张表:
第1张表是产品类型表,表中有产品类型、产品名称。
第2张表是客户信息表,表中有客户编号、客户类型。
第3张表是产品信息表,表中有产品名称、产品类型、产品价格、产品数量。