聊聊数据库范式

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

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

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

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

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

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

2. 表必须存在主键。

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

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

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

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

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

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一次删除还是分批删除

    今天有位同事说“传言一次删除量大,是更慢”,这句话有对的地方,但重要的是问个为什么,只有知道了它的原因才能更好地使用Oracle提供的技术。

    bisal
  • shell常见问题系列

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    bisal
  • ORA-1555经典的错误

    应用的夜维从夜里00:00开始执行,但因为hang的原因(暂时猜测为夜维处理的某条数据和当前应用正常处理的某条数据相同,出现前后等待同一资源锁的现象),直到第二...

    bisal
  • 啥是数据库范式

    关于数据库范式,时常有听说过,一直没有详细去了解。一般数据库书籍或数据库课程会介绍范式相关内容,范式也经常出现在数据库考试题目中。不清楚你是否对范式有比较清晰的...

    MySQL技术
  • 数据库三范式详解

    范式的概念   为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计...

    新人小试
  • Access数据库范式

    大家好,本节主要介绍下数据库范式的相关知识。在介绍Access数据库设计步骤时,有提到过数据库范式的概念。

    无言之月
  • 100天机器学习实践之第1天

    练习中,这两个重要的库每次都要导入。Numpy包含数学函数,Pandas用于导入和管理数据集。

    fanzhh
  • Flowportal BPM 邮件提醒内容

    1、在系统表BPMSysSettings中增加一行记录ItemName = ClickToProcessHTTP ItemValue=http://www.x...

    Tony老师
  • ython实战开发!tornado框架开发一个扫码签到平台!

    云飞
  • spin_lock的变体

    当处理器上当前进程A需要对共享变量a操作,所以在操作前通过spin_lock获取锁进入临界区,如上图标号1。当进程A进入临界区后,进程A所在的处理器发生了一个外...

    DragonKingZhu

扫码关注云+社区

领取腾讯云代金券