数据库三大范式

三大范式是数据库设计规范。

1 NF要求每个字段原子不可分。
例子:学生表,姓名字段不能拆分“张/三”。

2 NF要求非主键字段完全依赖主键。
例子:订单表,主键是订单号+商品号,金额字段依赖组合主键,不能只依赖订单号。

3 NF要求非主键字段不依赖其他非主键字段。
例子:订单表,客户姓名依赖客户号,需拆分到客户表。

应用时看需求,别死守。

数据库的三大范式

三大范式,简单说就是:
一、第一范式:字段值不能拆分,得是独立的。

二、第二范式:数据记录要唯一,非主键全依赖主键。

三、第三范式:非主键字段直接关联主键,不能间接依赖。

比如学生信息表,姓名、学号等是独立的,就是第一范式。
如果姓名、学号相同,电话、地址就重复,那就是第二范式问题。
再比如员工表,部门经理姓名只和部门号有关,不能和员工号直接相关,那就得拆分出来,符合第三范式。
总之,这三大范式是为了避免数据冗余和异常,让数据库更整洁。

数据库范式如何判断 数据库范式判断

哈,数据库范式这事儿,得具体例子来说明才好懂。
我给你举个例子,你就明白了。

上周有个客人问我,他们公司的一个数据库设计,不知道是符合哪个范式。
我一看,典型的第三范式问题。

先说第一范式,就是数据表里的每一列都是最基本的单位,不能拆分。
举个例子,比如有一个员工表,里面有员工编号、姓名、性别、出生日期、邮箱地址。
这些字段都是不可分割的,不能把性别拆成男女,对吧?
然后是第二范式,它要求在满足第一范式的基础上,表中的非主属性(就是不是主键的字段)必须完全依赖于主键。
比如,员工表的主键是员工编号,姓名、性别、出生日期、邮箱地址这些字段都完全依赖于员工编号,不能只有员工编号的一部分就能决定其他字段。

最后是第三范式,它是在第二范式的基础上,要求非主属性之间不能有依赖关系。
还是拿员工表来说,假设邮箱地址依赖于姓名,这就违反了第三范式,因为姓名不是主键,它和其他非主属性(如邮箱地址)之间有依赖关系。

所以,根据这个客人的数据库设计,我们得先看它是不是每一列都是不可分割的,然后看非主属性是否完全依赖于主键,最后看非主属性之间有没有依赖。
如果这三个条件都满足,那它就达到了第三范式。

反正你看着办,根据你的需求和数据特点,选择合适的范式很重要,能提高数据库的设计质量和数据一致性。
我还在想这个问题,看看还有没有更好的方法来解释这个。

数据库范式第一第二第三范式的区别是什么

哎,跟你唠唠我当年踩的坑哈。
这数据库范式的事儿,真是头疼啊。

就说第一范式(1 NF)吧。
那年我刚开始做项目,一个傻乎乎的表设计,把“客户信息”一列,居然直接放“姓名、电话、地址”,你说能行吗?结果数据一多,查起来乱七八糟,还经常出错。
后来老大一拍桌子,不行,得拆!拆成“客户姓名”、“客户电话”、“客户地址”三列,保证每个字段就是一个独立值,不能有重复或者包含一堆玩意儿。
这就是1 NF,保证原子性,说白了就是每个小格子只能装一个简单的东西,不能混着装。
没搞定1 NF,那基本就别想走关系型数据库的路了。

再往后,到了第二范式(2 NF)。
那时候在一个电商项目上,搞一个“订单明细”表,主键是“订单号+商品号”。
结果我这边,“商品名称”和“商品价格”居然只依赖“商品号”,跟“订单号”没啥关系。
这就完犊子了,数据一更新,比如商品价格变了,这个订单明细表也得跟着改,很麻烦。
后来硬着头皮去查,搞明白,2 NF就是要求非主键字段必须完全依赖于整个主键,不能只依赖一部分。
所以那个商品信息,得拆出去,单独建个“商品表”,关联上订单明细表。
这样就解决了部分依赖的问题。
2 NF主要就是消除这种依赖不纯粹导致的冗余。

最后是第三范式(3 NF)。
这个我印象也挺深,也是在一个项目中。
搞了个“员工表”,里面有个“部门编号”,然后顺带把“部门名称”、“部门地址”也放进去了一列。
结果呢?公司搬家了,地址一改,所有员工的记录都得跟着改,真是要命。
这就是典型的传递依赖,员工(非主键)依赖部门(非主键),部门又依赖地址。
后来按照3 NF的要求,把“部门编号”和它的属性拆出去,单独建个“部门表”。
这下好了,员工表干净了,改部门信息也不影响员工信息。
3 NF就是要求非主键字段之间不能有传递依赖,必须直接依赖主键。

总的来说啊,1 NF解决的是数据粒度太粗的问题,保证每个小格子干净利落。
2 NF解决的是依赖不完整的问题,非主键得完全依赖主键。
3 NF解决的是依赖传递的问题,非主键之间不能互相依赖。
一层一层往上搞,就是为了让数据表更合理,减少重复,别动一下就全乱套。
这活儿是真不容易,当年为了搞懂这些,我熬夜查资料,跟同事扯皮,真是够了。
不过现在想想,还是得这么干,不然后面麻烦大了去了。