首页 > 数据库

数据库范式问题

时间:2009-05-25 11:46:13  作者:玄机逸士  我要投稿
Linux初探欢迎您的投稿,投放方法请点击这里查看,我们会定期赠送精美小礼品给优秀的投稿作者。海纳百川 取则行远!LinuxGoo欢迎您的到来。
在实际工作中,我们进行data modeling的时候,经常用到2NF和3NF,范式的概念很抽象不好理解,那我们就用实际的例子来进行说明吧: 第一范式(1NF): 数据库表中的字段都......

在实际工作中,我们进行data modeling的时候,经常用到2NF和3NF,范式的概念很抽象不好理解,那我们就用实际的例子来进行说明吧:

第一范式(1NF):
数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。例如,如下的数据库表是符合第一范式的:
字段1 字段2 字段3 字段4
如果将字段3(比如考试成绩为95分),分拆为字段3.1(为95中的9) 字段3.2(为95中的5) ,这样的数据库表结构就不符合第一范式了:
字段1 字段2 字段3.1 字段3.2 字段4
很显然,在当前的任何关系数据库管理系统(DBMS)中,dummy也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。


第二范式(2NF):
数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。

假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合关键字(学号, 课程名称),因为存在如下决定关系:
  (学号, 课程名称) → (姓名, 年龄, 成绩, 学分)
  这个数据库表不满足第二范式,因为存在如下决定关系:
  (课程名称) → (学分)
  (学号) → (姓名, 年龄)
  即存在组合关键字中的字段决定非关键字的情况。
  由于不符合2NF,这个选课关系表会存在如下问题:
  (1) 数据冗余:
  同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。
  (2) 更新异常:
  若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。

如果您需转载 数据库范式问题,请注明来自LinuxGoo.com,其版权归原作者所有。请广大网友留言时遵纪守法,使用文明用语。如果您在应用中有什么问题,请在下面留言,我们会尽快解答。
来顶一下
近回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
相关文章
栏目热门