热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

第一范式第二范式第三范式怎么区分_聊聊数据库范式

最近给新员工做了一次数据库基础的培训,其中涉及个主题,就是数据库范式,从理论层面讲,数据库会包含第一范式、第二范式、第三范式

最近给新员工做了一次数据库基础的培训,其中涉及个主题,就是数据库范式,从理论层面讲,数据库会包含第一范式、第二范式、第三范式、BC范式、第四范式、第五范式等,但是一般情况下,满足第三范式就足够了。

什么是第三范式?我们要从第一范式开始看。

第一范式,理论概念是数据库表中的字段都是单一属性的,不可再分。举个例子,学生信息表,“地址”字段存储了学生的地址,可以看到,当前不是单一属性的,我们检索的时候,可能会根据“省”、“市”作为条件,该字段是可以继续进行分解的,

0eca959758afadd2ce22e0376512d941.png

将“地址”字段拆成“省份”、“城市”、“详址”三个字段,此时每个字段就是单一属性的了,当前的设计就是符合第一范式,

75568ff4b14d8e16d67906a35bff79f2.png

第二范式,理论概念是数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖,不能部分依赖。听着抽象,翻译一下,应该包括了三层含义,

1. 首先就是符合第一范式。

2. 表必须存在主键。

3. 非主键列不能只依赖于主键的一部分。

如下这张表,主键是“快递单号”和“商品编号”,但是像“价格”依赖于“商品编号”,“数量”依赖于“快递单号”,都是依赖于主键的一部分,这种情况,就是不符合第二范式的,

aed285f7d00586a66573d9a748518082.png

因此,拆分为这三张表,快递信息表中都是和快递相关的字段,商品信息表中都是和商品相关的字段,快递项目表则是快递和商品的关联表,每张表中非主键列都依赖于主键的全部,此时,就是符合第三范式的,

eacea7ecaa3f2ae7bca762d67ac0fc29.png

第三范式,理论概念是在第二范式的基础上,数据表中不存在非关键字段对任一候选关键字段的传递函数依赖,即除了主键外,其他字段必须依赖主键。如下例子,“爸爸”是主键,但是“儿子的玩具车”和“儿子的玩具枪”依赖的是“儿子”,并不依赖于主键,存在传递函数依赖的关系,因此不符合第三范式,

57ad8769aa65208ebce0377856986898.png

可以拆成这两张,每张表中的非主键字段,都只依赖于主键,不存在传递函数依赖的关系,因此这是符合第三范式的,

4dae4292c48e994cab5d4ac3bca50dd5.png

符合第三范式的表设计,可以说是从理论层面比较纯粹的设计了,但在实操层面,这种设计,未必一定可行。其实无论是数据库设计,还是系统架构的设计,都是为了业务需求服务的,都需要考虑实际的业务场景,仅从理论上考量,有时候未必能够满足业务的需求。

例如在第一范式中的例子,如果你的需求,会根据“区”、“路”进行检索,“详址”字段,当前的设计还可以继续拆,究竟什么是“单一属性”的粒度,还是取决于业务场景。例如在第二范式的例子,拆成了三张表,确实结构清晰,但是可能每次检索快递和商品信息的时候,都需要三表关联,如果数据量很大,表的字段属性再复杂些,对性能造成的影响就会更明显,此时,根据业务场景,向表中冗余一些字段,虽然违反了范式,但是能在满足业务需求和性能需求中得到平衡,可能就是一种更合适的方案。

因此,无论何种范式,都是理论基础,在实操过程中,还是要考虑实际业务场景的需求,有时候就需要“反范式”,套用一句广告词“没有最好的设计,只有最合适的设计”。

近期的热文:

《数据库到底能不能部署在docker容器中?》

《一道SQL问题,你来试试的?》

《如何捕获问题SQL解决过度CPU消耗的问题》

《了解一下ARM CPU架构》

《如何查看JVM运行的堆内存情况》

《Linux下如何快速删除大量碎小的文件?》

《打造国产技术产品的必要性》

《Oracle删除字段的方式和风险,你都了解么?》

《登录缓慢的诡异问题》

《Oracle相关提问的智慧技巧》

《PLSQL Developer几个可能的隐患》

《从70万字SRE神作提炼出的7千字精华文章》

《从数据误删到全量恢复的惊险记录》

《公众号600篇文章分类和索引》




推荐阅读
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • 本文探讨了容器技术在安全方面面临的挑战,并提出了相应的解决方案。多租户保护、用户访问控制、中毒的镜像、验证和加密、容器守护以及容器监控都是容器技术中需要关注的安全问题。通过在虚拟机中运行容器、限制特权升级、使用受信任的镜像库、进行验证和加密、限制容器守护进程的访问以及监控容器栈,可以提高容器技术的安全性。未来,随着容器技术的发展,还需解决诸如硬件支持、软件定义基础设施集成等挑战。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • 【Java面试】简单说一下你对序列化和反序列化的理解
    Hi,大家好,我是Mic一个工作4年的粉丝,投了很多简历好不容易接到一个互联网公司的面试邀约。在面试第一轮就被干掉了,原因是对主流互联网技术理解太浅了。其中就有一个这样的问题:“简 ... [详细]
  • 原文地址http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/最开始时 ... [详细]
author-avatar
捕风的默小墨
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有