通过逐步改善一个问题表来理解数据库设计三范式

很多人喜欢用简短深奥的语言描述数据库三范式,也喜欢用分离的方法来理解三范式,本文就用简单语言、用一个例子连贯起来理解它。

准备

这里有个任务,要记录每次客户拜访的相关信息:

客户拜访信息表:

编号 时间 地点 名字 性别和年龄 地点所属区
001 2015-12-10 东圃 小红 男,50岁 天河区
002 2015-12-13 市桥 小蓝 女,40岁 番禺区

当然这个是个有问题的表,下面我们通过三范式一步步优化这个设计。

第一范式出场

  • 要求:列是原子的,即属性是原子的,并且该属性的对应的值只能有一个。
  • 分析:很明显上表不符合,因为性别和年龄这个属性可以分成性别年龄两个属性。
  • 解决:将性别和年龄属性分成性别年龄两个属性。

通过上面分析优化后得到结果如下:

客户拜访信息表:

编号 时间 地点 名字 性别 年龄 地点所属区
001 2015-12-10 东圃 小红 50岁 天河区
002 2015-12-13 市桥 小蓝 40岁 番禺区

第二范式出场

  • 要求:
    • 满足第一范式。
    • 每一个非主键,对可能的主键完全依赖。
  • 分析:第二点要求什么意思呢,也就是说,假设有两个属性可以作为表联合主键,那么其他属性都要完全依赖他们两个,而不是只依赖其中的一个。那么看上面的客户拜访信息表,可以发现编号可以作为主键,这个没问题,但同时 [时间地点] 也可以作为表的联合主键,发现地点所属区这个属性其实只依赖地点这个属性而没有依赖时间属性。
  • 解决:可以分分离出区域信息表,这样就不会出现上面分析中的问题。

通过上面分析优化后得到结果如下:

客户拜访信息表:

编号 时间 地点 名字 性别 年龄
001 2015-12-10 东圃 小红 50岁
002 2015-12-13 市桥 小蓝 40岁

区域信息表:

地点 地点所属区
东圃 天河区
市桥 番禺区

第三范式出场

  • 要求:
    • 满足第二范式。
    • 对于一个可能的主键,其他属性只依赖它而不依赖其他非主键属性。
  • 分析:可以看到上面的客户拜访信息表是不符合第三范式的,因为对于主键编号或者联合主键 [时间地点] ,性别年龄显然也可以依赖于名字
  • 解决:可以进一步分离出客户信息表,这样就不会出现上面分析中的问题。

通过上面分析优化后得到结果如下:

拜访信息表:

编号 时间 地点 名字
001 2015-12-10 东圃 小红
002 2015-12-13 市桥 小蓝

区域信息表:

地点 地点所属区
东圃 天河区
市桥 番禺区

客户信息表:

名字 性别 年龄
小红 50岁
小蓝 40岁

总结

三个范式其实是层层递进的,就是说满足后面范式之前必须满足前面范式。一般来讲,数据库满足到第三范式就够用了。其实都是万变不离其宗:为了更好的维护和扩展,对数据库来讲是为了更好地进行CRUD(增删改查)。

本文章必富客制作,转载请注明出处