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

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

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

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

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

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

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

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

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

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

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

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

#Java开发##学习路径#
全部评论
楼主你是做什么工作的,分享的技术涉及面这么广
点赞 回复 分享
发布于 2022-03-11 19:07

相关推荐

评论
5
12
分享

创作者周榜

更多
牛客网
牛客企业服务