数据库的三大范式
什么是三大范式:数据库中的三大范式,可以说是三种规范,三大范式规定了数据库最基本的设计规范,在设计数据库的时候,让数据库的结构更加简明,可以提高效率。设计范
式的思想很像是我做我的事,别人做别人的事,大家没有交集,避免冲突,可以很大程度上提高效率。
简单来说就是:
第一范式:具有原子性
第二范式:主键列与非主键列遵循完全函数依赖关系
第三范式:非主键列之间没有传递函数依赖关系
第一范式(1NF):
数据库表的每一列都是不可分割的基本数据项。第一范式是数据库最基本的要求,在数据库中表示为没有重复的列,在设计数据库的时候,要满足数据库中的每一个属性都是不可分割的一项,例如在数据库的一个表中设计了家庭住址这一属性,但是在查询的时候,要求列出每条数据的家庭所在城市,我们通常在填写的时候,会把家庭所在的省,市,详细住址填进去,这样带来的后果就是,在对数据库进行查询操作的时候,效率低下。把家庭住址拆成省,市,详细地址。这样在查询的时候,直接查某个属性值就可以了,想要完整地址的时候再组合在一起。不满足第一范式还表现为数据库中表的两个属性类似,例如一个属性为商品(假如是这样),这个商品的概念很广啊,商品的什么?编号?名称?价格?所以这个商品向下可以分为很多。这样清晰地分出各个属性,在后续的查找上会方便很多,同样效率也是最高的。第一范式保证了列的原子性。
第二范式(2NF):
第二范式的基础是满足第一范式,不满足第一范式,不可能满足第二范式,第二范式要求数据库表中的每个实例或行必须可以被唯一的区分,为了区分各个实例,需要加上一列值,通过这个值可以找到唯一的一个实例(数据库中的一条记录),加上的这个属性列称之为主键,在有的数据库书上称之为主码。我们经常说第二范式就是主键约束。那些非主属性完全依赖于主关键字,例如一个表,这个表示存商品的各种信息的,商品的信息有很多,价格,名字,产地等等,我们怎么区分这些呢,也就是在数据库中能准确的找到某个商品呢?我们可以设置一个商品编号,这个编号是唯一的,每个商品对应一个编号,把这个编号作为主键存在数据库中,这样我们在查找某个商品的时候,只要知道商品编号,就可以查到唯一的一条信息。之前说到了非主属性完全依赖于主键,这个完全表现在,一个表中不能有和主键无关的属性,例如商品表中,还有生产厂家,厂家地址,等等一些关于厂家的信息,这样完全可以再新建另一张表来存生产厂家的信息。所以说第三范式保证了属性完全与主键相关。
第三范式(3NF):
同样满足第三范式的条件是满足前两个范式。第三范式要求一个数据库表中不包含已在其它表中已包含的非主关键字信息(消除了传递依赖)。简单来说,在一张表中,定义了学生姓名,性别等等关于学生的一些信息,那么在另一张表,是记录学生获奖信息的表,在这张表中不能有在前面那张学生基本信息表中的信息了,不能有学生的姓名,性别等等,这样避免了数据的冗余(数据的重复)。一般情况下我们在一张表中建立一个外键,建立和另一张表的联系。一个表中有学生的基本信息,还有学生所在班级的基本信息,这个表的主键为学号,学生的基本信息依赖于学号区分,但是表中的班级信息也要依赖于学号区分,显然这是不合理的这种情况下可以分为两个表,一个学生表,一个班级信息表。所以说第三范式消除了传递依赖。这个第三范式和第二范式很像,大家在区分的时候注意一下。