前言
最近在知乎上看要怎么才能打好java的基础,看到有大佬回答说对于数据库要懂得数据库设计三大范式。故此查询了一些资料,做了些整理。
一个好的数据库结构,能够有效减小数据冗余,减少增删改中出现的问题,提高开发人员对数据库的操作。深入理解数据库设计的三范式,对于设计“健壮的数据库“十分有必要。数据库三范式是设计数据库 时参考的准则,接下来做一个简单的介绍。
第一范式
数据的原子性
数据库表的每一列都应该是不可再分割的最小基础数据项。同一个字段,不能有多重含义,即实体中的某个属性不能有代表多个类型的值。
栗子
设计用户信息表时,一般都会存储手机号码,
如果像上表这样设计,就会出现歧义,因为电话可以分为手机、固话、工作电话、家庭电话等等多种,若设计一个字段,无法知道到底是哪一类的电话。
所以应该要讲电话这个字段再进行细分,
如上表这样设计,不仅数据清晰,而且开发人员获取的时候也能按需获取。
第二范式
消除部分依赖
在满足第一范式的基础上,每个非主键字段都应该只依赖于主键字段。
主键只要接触过数据库的都知道,不再赘述。依赖主键的意思,就是比如字段a为主键,他能决定字段b的值,但是b不能决定a,称b依赖a。
先说明下部分依赖的意思,一般主键都是一个字段,但有时候有两字字段,我们定位字段a和字段b,还有两个非主键属性字段c和字段b,部分依赖的情况就是:c依赖于a,但是b依赖于b。
部分依赖的缺点:
1、数据冗余
2、数据操作复杂,增删改容易出现问题
第三范式
消除依赖传递
所谓依赖传递,举个栗子,如下表所示:
根据该表,有如下关系:
学号–>姓名,性别,系号–>决定系名,宿舍号–>决定宿舍电话,也有 学号–>系名,学号–>宿舍电话。
像上表这样设计,不仅数据关系复杂,而且数据冗余,开发人员更是难以操作,一不小心就会造成数据异常。
实际情况下,完全能够将这张表分开设计为三张表:
总结
以上就是数据库三范式了,一般设计数据库的时候都应该想到。但是,这个三范式并不是金科玉律,实际还是要根据需求来定的,如果硬是为了符合三范式,把原本简单的设计方式弄得复杂了,反而是适得其反了。这只是一个参考标准罢了。