数据库三大范式与反范式的概念及解决的问题 | 本质+例子

数据库三大范式与反范式的概念及解决的问题

概念:范式是设计表结构的标准。高阶范式在低阶范式的基础上冗余度更低,一般要让表的设计尽量满足第三范式(3NF),但有时为提高某些查询性能,要破坏范式,也即反范式。

第一范式:表中的每个字段属性都是原子性的,不可分割;

(比方讲你要记录地点,那你不能设计一个字段是 省+市 的格式,应该拆开来)

第二范式:要求非主属性都要完全依赖于完整的(联合)主键;一张表只表达一个独立的意思。

(比如说记录选手战绩的 选手战绩表,他的主键是 选手id+比赛id ,其他字段有 姓名、比赛时间、得分,这其中就只有得分是完全依赖于主键的,而 姓名 和 比赛时间就没必要在这重复的记录造成冗余,到 选手表 和 比赛表 去查就是了)

第三范式:任何非主属性不依赖于主键外的字段;

(比如说记录选手信息的 选手表,他的主键当然是选手id,其他字段有 队伍id, 比赛id ,这个 比赛id 就不依赖于主键,而是依赖 队伍id 的,如果放在这不仅会造成数据冗余,你要插入一条 比赛id 原本是件很简单的事情只要在对应的队伍表那里插入就好了,现在要在每一个 参赛选手 的选手表里都插入一下,而且如果举办方如果不能知道参赛队伍有哪些选手参赛,那岂不是连插入信息都做不了了,这就是潜在的异常)

解决的问题:三大范式既减少数据冗余,也避免了一些更新数据时的异常。

反范式:为了性能和读取效率违反范式化的原则,以空间换时间的策略允许适当的冗余数据在表中;

(比如说记录选手战绩的 选手战机表,他的主键是 选手id+比赛id,其他字段就一个 得分 ,我们要是需要选手 姓名 和 比赛时间 ,就得联合其他表来查,当然会比较慢了,你要是想快那就可以违反范式化的原则,把 姓名 和 比赛时间 存在选手战绩表中)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值