数据库范式小结

曾经学过一边数据库原理,但学的程度仅限于考个试,特别是对范式这部分的论述,课本上简直是学术的不能再学术,完全处于背概念和看不懂的坑爹状态。甚至当时对其理解都是觉得这种看上去高大上的东西没必要深究,一心只记得去学crud是sql语句去了,以至于后来接触了sqlserver,mysql,mongodb,redis等好几种数据库了,却对原理一知半解,所以这段时间打算重学一遍数据库原理。今天看了范式相关,自己用自己意思理解总结,好更适合应用一些。

范式概念与目标

简单的说范式就是一种设计数据库时遵循的模式,其主要为了:

1.减少冗余(主要原因)

2.消除异常(次要包括插入异常,更新异常,删除异常)

之后我们以一个老生常谈的电商数据表来分别为其实现三大范式。该数据表如下:

商品编号 商品名 数量 产地 经销商编号 经销商名 经销商地址
0001 香蕉 110 海南 003 A公司 南京路11号
0002 苹果 80 陕西 006 B公司 青年路82号
0003 草莓 90 山东 002 C公司 新华路20号
0004 荔枝 50 海南 003 A公司 南京路11号

此外需要注意的是,每个上级范式都是层层递进的:即第二范式需要先满足第一范式,第三范式需要先满足第二范式。

第一范式

第一范式:字段是最小的的单元不可再分(所谓满足原子性)
如原始表就是一个满足第一范式的数据表:

商品表

商品编号 商品名 数量 产地 经销商编号 经销商名 经销商地址
0001 香蕉 110 海南 003 A公司 南京路11号
0002 苹果 80 陕西 006 B公司 青年路82号
0003 草莓 90 山东 002 C公司 新华路20号
0004 荔枝 50 海南 003 A公司 南京路11号

第二范式

第二范式:表中的字段必须完全依赖于全部主键而非部分主键

对此要求的话,对于上述表:如果以商品编号为主键,如第一列中的0001的A公司和第四列0004的A公司冲突,不满足第二范式,故我们需要对上表进行拆分成这样两个表:

商品表

商品编号 商品名 数量 产地 经销商编号
0001 香蕉 110 海南 003
0002 苹果 80 陕西 006
0003 草莓 90 山东 002
0004 荔枝 50 海南 003

经销商表

经销商编号 经销商名 经销商地址
003 A公司 南京路11号
006 B公司 青年路82号
002 C公司 新华路20号

第三范式

第三范式:每列都和主键直接相关,而不是间接相关。
以下数据库表也满足了第三范式。

商品表

商品编号 商品名 数量 产地 经销商编号
0001 香蕉 110 海南 003
0002 苹果 80 陕西 006
0003 草莓 90 山东 002
0004 荔枝 50 海南 003

经销商表

经销商编号 经销商名 经销商地址
003 A公司 南京路11号
006 B公司 青年路82号
002 C公司 新华路20号

BC范式

BC范式:BC范式是第三范式的一种特殊情况,即每个表中只有一个候选主键。上面商品图中:商品编号和商品名同时可以作为主键;经销商表中:所有字段都不同,故都可以作为主键。所以上面数据库设计不满足BC范式。

总结

一般情况下,应用范式越高,则数据库表越多,在数据库表多的情况下,带来的问题主要是查询时要连接多个表增加了查询复杂度。

所以需要在降低查询性能的前提下,适量的应用范式以降低冗余即可。一般情况下第二到第三范式就足够,可以按照查询复杂度与冗余度选择适合的范式设计数据库。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

😉😐😡😈🙂😯🙁🙄😛😳😮:mrgreen:😆💡😀👿😥😎😕