关系型数据库的三范式

对于关系型数据库,我们往往只关注它的三范式,所谓范式是指Normal Form,也就是要求。

第一范式,要求表中的列具有原子性,也就是说列不能被再次拆分。比如有一个列需要存电话号码,如果要存手机号码和固定电话时,按照本范式的要求,就必须定义两个列,一个用来存储手机号码,一个用来存储固定电话。而不能只使用一个列同时去存取手机号码和固定电话。

第二范式,要求每个表都要有主键,且非主键的列必须完全依赖于主键列,而不是只依赖于部分主键列。比如订单表 (订单id, 折扣,产品id, 产品名称, 成本价),其主键可以是订单id+产品id,但是产品名称列和成本价列都仅仅只依赖于产品id列,所以不符合第二范式。这样会造成数据的冗余。应该定义成两张表:订单表(订单id, 折扣,产品id),产品表(产品id,产品名称,成本价)。这样遵循了第二范式后就不会造成数据的冗余。

第三范式,要求不能出现传递依赖的情况,也就是非主键列A完全依赖于另外非主键的列B,而非主键列B又完全依赖于主键列。比如 订单表(订单id, 折扣,客户id, 客户姓名,客户电话) , 主键是订单id,客户id列完全依赖于主键列订单id,但是客户姓名和客户电话又完全依赖于非主键列客户id。这样不满足第三范式,也会造成数据的冗余。所以应该将客户姓名和客户电话列提取成客户表(客户id,客户姓名,客户电话),这样原来的订单表就变为 订单表(订单id, 折扣, 客户id) 。

你可能感兴趣的:(JAVA开发)