Sql server 三大范式 :
概念: 在设计数据库的时候应该遵循三大原则,这里的三大原则也就是我们经常说到的三大范式,三大范式是数据库实际所需要满足的规范。
我在百度了数据库的范式之后发现,其实数据库一共有个范式,第一范式、第二范式…第六范式,
但是我们在一般项目中,使用到第三范式就足够了,范式越高,反而会带来一定的麻烦:操作困难,性能越差。
下面我将用三个例子来分析这三大范式的特点以及他们之间的区别:
下面我将用三个例子来分析这三大范式的特点以及他们之间的区别:
第一范式:
定义:数据库表中的字段都是单一属性的,不可再分。
简单的说,每一个属性都是原子项,不可分割。
我们经常提到的数据库都是关系型数据库, 所以“第一范式”是关系模型应具备的最起码的条件,如果数据库不满足第一范式,那么就不能叫第一范式。
——-也就是说,关系数据库一定满足第一范式。
例子:
下面我将列举俩个表,我们可以先对比他们的不同,然后来分析哪个表满足”第一范式”
第一种表的设计
第二种表的设计:
分析:
第一种表是不满足”第一范式”的,因为我们的第一范式的特点是:
数据库表中的字段都是单一属性的,不可再分
我们可以看到第一种设计方式中的地址可以继续拆分,
可以继续拆分为省份,市区,和具体地址,所以不满足我们的 第一范式
第二范式:
定义: 要求数据库表中每列都与主键有关系,而不能只与主键的某部分有关系,主键与非主键应遵循完全函数依赖关系,也就是“完全依赖”
注:什么是函数依赖,详见百度百科(http://baike.baidu.com/view/40008.htm
<http://baike.baidu.com/view/40008.htm>)。
重点: 第二范式 是建立在第一范式的基础上的,所以必须要满足第一范式
而且表中的非主键信息不是由整个主键决定时也不能成立
下面俩个表,表示快递单号与商品编号为联合主键:
第一种设计方式:
第二种设计方式:
分析 :
我们要结合“第二范式”的特点:“完全依赖”并且观察上面的俩个表我们可以发现:
表中的快递单号 和 商品编号为联合主键, 但是在我们表一中商品名称,价格(单价) 只与“商品编号有关系”
所以这就产生了“部分依赖” ,所以不满足“第二范式”
第二个表是满足条件的。
第三范式:
定义:属性不能传递依赖于主键
不能存在传递依赖,除了主键外,其他字段必须依赖主键
(注:什么是传递依赖详细看百度:
https://baike.baidu.com/item/%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E4%BE%9D%E8%B5%96/9816957?fr=aladdin
<https://baike.baidu.com/item/%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E4%BE%9D%E8%B5%96/9816957?fr=aladdin>
)
具体的 示例:
第一种设计方式:
第二种设计方式:
分析:
我们观察这俩个表的设计方式,根据“第三范式”的特点:
“不能存在传递依赖”
我们可以发现: 宿舍依赖学号 费用依赖宿舍 所以有错
第二种表的设计是符合“第三范式”
现在应该对“三大范式”有了一个跟深的理解了吧?
如果哪里有不同见解,欢迎留言
热门工具 换一换