第一范式 1NF
任何属性都是不可分割.
范例:
学生{身份证号,姓名,性别,出生日期,年龄,所属系{系名,系主任}}
这里的所属系 就是可以分割的.
分解成:
学生{身份证号,姓名,性别,出生日期,年龄,系ID}系{系ID,系名,系主任}
不满足第一范式可能造成得问题:
- 信息冗余,每个学生记录都包含系信息,造成空间资源得浪费;
- 插入异常,如果是新系没有学生就无法添加系信息;
- 删除异常,如果将某系的学生全部删除,该系也不复存在了;
例外,但分解也不是绝对的.
学生中增加 家庭地址 属性,
比如 江苏省苏州市姑苏区菉葭巷31号
本来可以分解成 省,市,区 ,但这还得根据业务需要判断是否需要这样分解.
第二范式 2NF
在1NF的基础上,消除部分函数依赖,任何非主属性必须完全依赖于候选码
候选码→以被选为主码的属性或属性组
范例:
成绩(学生ID,课程ID,分数,课程名)
候选码(学生ID,课程ID)
(学生ID,课程ID) → 分数
课程ID → 课程名
可以看到,课程名仅依赖于课程ID,并不是完全依赖于候选码
分解:
(学生ID,课程ID,分数)
(课程ID,课程名)
不满足第二范式可能造成的问题
- 数据冗余,和1NF一样
- 更新异常,如果课程ID对应的课程名更改了,则有很多行需要更新
- 插入异常,如果一门新课程ID,课程名未考试,则课程不复存在
- 删除异常,如果将某课程全部学生删除,则课程也没了
第三范式 3NF
满足2NF,消除非主属性对于非主属性的传递依赖
范例:
学生{身份证号,姓名,性别,出生日期,年龄)
这里面可以看出关系模式{
身份证号→姓名,
身份证号→性别,
身份证号→出生日期
身份证号→年龄,
出生日期→年龄}
这里的{出生日期→年龄}就属于非主属性对非主属性的依赖
消除把年龄删去就好了.
学生{身份证号,姓名,性别,出生日期}
不消除第三范式可能的问题:
- 数据冗余,和1NF一样
- 在部分案例中并能完全消除,插入,删除,更新异常.需要看具体案例
例外,
就本例来讲,年龄删去后,当需要年龄时,就需要用出生日期计算,这里会消耗计算机资源,在客户端或服务器端.
本文详细介绍了数据库设计中的第一范式(1NF)、第二范式(2NF)和第三范式(3NF),通过实例说明了各范式的概念、不满足范式可能引发的问题及如何进行规范化处理。讨论了在特定情况下是否需要进行分解的决策,并指出规范化虽有助于避免数据冗余和异常,但可能增加计算成本。
296

被折叠的 条评论
为什么被折叠?



