SQL server要多表存储原因和范式的概念和理解

用多个表存储数据:设计数据库时就有一条很重要的规则,减少冗余的数据,数据表是用来存储数据的,也就需要符合这个规则。
例:一个学生的基本信息是固定的,考试成绩会有很多门,那么用一个表存储,就会使基本信息重复很多次,造成了大量的冗余数据。
 
范式:范式这个概念逻辑概念性很强,有什么第一范式----一直到第六范式,范式应该是指设计数据库时的规则,为了更好的设计数据库,便于查询等操作,减少数据的冗余度。
 
第一范式:1NF,记录的每一个分量都是不可分割的基本数据项。例如;如果联系方式这个字段下还有子字段:电话、QQ、E-MAIL等,那么就是可以分割的数据项,不满足第一范式。
 
第二范式:2NF,条件--满足第一范式,增加规则:每一个非主属性要完全函数依赖于码。书上的码,我把它理解为被完全依赖的一个字段,例如:
学号,姓名,性别,来源地,联系方式,课号,课程名称,考试成绩
这么多字段满足第一范式,但是不满足第二范式,因为课号,课程名称不完全依赖于码(学号),而且课号也是码之一,考试成绩既依赖于学号又依赖于课号。所以就要建立3个表。
Student (学号,姓名,性别,来源地,联系方式)   学号作为码
Course(课号,课程名称) 课号作为码
Score(学号,课号,成绩) 学号和课号作为码
 
第三范式:3NF,条件--满足第二范式,增加规则:每一个非主属性都不传递依赖于码的要求。
学号,姓名,性别,来源地,所属院系,院系主任
其中院系主任有很多重复的部分,因为院系主任依赖于所属院系传递的依赖的码,所以数据表建立应该如下:
X1(学号,姓名,性别,来源地,所属院系)
X2(所属院系,院系主任)
 
疑问:上述第二范式中的表符合第三范式吗?个人觉得是满足第三范式的,因为期间也不传递依赖性。
 
但是如果按照这种方式建立
Student (学号,姓名,性别,来源地,联系方式)
Score(学号,课号,课程名称,成绩)
个人觉得不符合第二范式,原因是课程名称和成绩不都完全依赖与学号,课号,课号也是不完全依赖于学号的,课号可以单独做为码,课号作为码的整体都不完全依赖于学号,所以不具备2NF的规则。
当然也不符合3NF,课程名称依赖于课号传递码。
难道是巧合?这里的不满足第二范式和第三范式的原因都在一个点上,将
Course(课号,课程名称) 建立出来,那么既解决了第二范式问题又解决了第三范式问题。
 
总结:第一范式:数据项不可分割。
第二范式:满足1NF,并且数据项完全依赖于码X1或者作为码的数据项X2也完全依赖于码,X2可以传递码作为依赖附带其他数据项。
第三范式:满足2NF,并且将完全依赖于码X1的码X2所传递的依赖性下的数据项以码X2作为码重新建立数据表。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值