关系型数据库的三范式

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

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

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

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

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值