范式
来源:互联网 发布:修改数据库system密码 编辑:程序博客网 时间:2024/06/06 13:22
1nf,2nf,3nf,bcnf我觉得这些对数据库表的设计很有帮助的,可以减少删除,修改产生错误,以及减少数据的冗余。由于对这些不是很了解,所有查找网上资料并归纳总结。
1nf:第一范式,关系型数据库都要满足的要求。及可以找到主键
2nf:第二范式,在1nf基础上,满足非关键字完全依赖关键字,及部分依赖都不行!是不是有点懵比?看下网上的一个例子:
例子:(学号, 姓名, 年龄, 课程名称, 成绩, 学分)
候选键只有一个,就是(姓名,课程名称),则主键就是(姓名,课程名称)
存在如下决定关系:
1:(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)
2:(课程名称) → (学分)
3:(学号) → (姓名, 年龄)
其中,姓名、年龄、学分是部分依赖于主键的,而成绩是完全依赖于主键的,存在部分依赖关系,所以不满足第二范式。
原博客也介绍了一些概念:(1) 数据冗余:
同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。
(2) 更新异常:
若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。
(3) 插入异常:
假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据 库。
(4) 删除异常:
假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同 时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。
问题就在于存在非主属性对主键的部分依赖
3nf:第三范式,存在非关键字对其他非关键字有依赖关系。看下例子:例子:表:(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话)
该表中候选字段只有“学号”,于是“学号”做主键。由于主键是单一属性,所以不存在非主属性对主键的部分函数依赖的问题,所以必然满足第二范式。但是存在如下传递依赖
(学号) → (所在学院) → (学院地点, 学院电话)
学院地点和学院电话传递依赖于学号,而学院地点和学院电话都是非关键字段,即表中出现了“某一非关键字段可以确定出其它非关键字段”的情况,于是违反了第三范式。
bcnf:关键字中存在候选键,例子:假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:
(仓库ID, 存储物品ID) →(管理员ID, 数量)
(管理员ID, 存储物品ID) → (仓库ID, 数量)
所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:
(仓库ID) → (管理员ID)
(管理员ID) → (仓库ID)
仓库I是决定因素,但仓库ID不包含候选键(candidate key,也就是候选码,简称码)。
同样的,管理员ID也是决定因素,但不包含候选键。
所以该表不满足BCNF
满足第一范式后,如果不存在部分依赖,则是第二范式,再不存在传递依赖,则是第三范式
- 范式
- 范式
- 范式
- 范式
- 范式
- 范式
- 范式
- 范式
- 范式
- 范式
- 范式
- 范式
- 范式
- 范式
- 范式
- 范式
- 范式
- 范式
- 技巧:知晓当前到底是在哪个活动
- JavaScript返回上一页代码区别:
- MUI显示原生等待框
- HDU 6181 Two Paths (次短路)
- [容易] DAG的拓扑排序
- 范式
- 如何在服务器上搭建一个lamp(Linux(CentOS7)+Apache+MySQL+PHP)环境
- ApplicationInfo 存储信息放上来是方便查看
- LAMP之apache源码安装
- java Arrays.asList com.google.common.collect.Lists.newArrayList 效率问题
- HTTP协议中PUT和POST使用区别
- js 合并json数组中有同一key值的json
- 学习Opencv 2.4.9(二) ---操作像素
- 字符串