
数据库设计三大范式实践应用详解
下载需积分: 14 | 211KB |
更新于2024-12-13
| 7 浏览量 | 举报
收藏
数据库设计三大范式应用实例剖析
数据库设计三大范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入、删除和更新操作异常。今天我们将对这三大范式进行通俗的说明,并以笔者曾经设计的简单论坛的数据库为例来讲解怎样将这些范式应用于实际工程。
**第一范式(1NF)**
第一范式是数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。例如,如下的数据库表是符合第一范式的:
| 字段1 | 字段2 | 字段3 | 字段4 |
| --- | --- | --- | --- |
而这样的数据库表是不符合第一范式的:
| 字段1 | 字段2 | 字段3 | 字段4 | 字段3.1 | 字段3.2 |
| --- | --- | --- | --- | --- | --- |
很显然,在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。
**第二范式(2NF)**
第二范式是数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖,也即所有非关键字段都完全依赖于任意一组候选关键字。假定选课关系表为SelectCourse(学号,姓名,年龄,课程名称,成绩,学分),关键字为组合关键字(学号,课程名称),因为存在如下决定关系:
(学号,课程名称)→(姓名,年龄,成绩,学分)
这个数据库表不满足第二范式,因为存在如下决定关系:
(课程名称)→(学分)
(学号)→(姓名,年龄)
即存在组合关键字中的字段决定非关键字的情况。由于不符合2NF,这个选课关系表会存在如下问题:
(1)数据冗余:同一门课程由n个学生选修,“学分”就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。
(2)更新异常:若调整了某门课程的学分,数据表中所有行的“学分”值都要更新,否则会出现同一门课程学分不同的情况。
(3)插入异常:假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有相关的数据行,无法插入新的课程信息。
**第三范式(3NF)**
第三范式是数据库表中不存在传递函数依赖,也即如果A依赖于B,而B依赖于C,那么A不能依赖于C。例如,假定我们有一个订单表Order(客户号,订单日期,订单金额),其中客户号是关键字。假定我们又有一个客户表Customer(客户号,客户姓名,客户地址),其中客户号也是关键字。这个订单表存在以下决定关系:
客户号→订单日期
客户号→订单金额
订单日期→订单金额
这个订单表不满足第三范式,因为存在以下传递函数依赖:
客户号→订单日期→订单金额
因此,这个订单表会存在以下问题:
(1)数据冗余:客户信息重复记录在每个订单中。
(2)更新异常:若调整了某个客户的信息,所有相关订单的客户信息都要更新。
(3)插入异常:假设要插入一个新的订单,暂时还没有相关的客户信息。这样,由于还没有相关的客户信息,无法插入新的订单信息。
数据库设计三大范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入、删除和更新操作异常。因此,在设计数据库时,我们必须遵守这些规范,以确保我们的数据库是简洁的、结构明晰的、高效的。
相关推荐




















xielittle
- 粉丝: 19
最新资源
- PACKIT:开源网络数据包生成工具简介
- 学习班招生创意横幅设计模板下载
- 西安电子科技大学线性代数全真试题解析
- 学生项目 'shortly-deploy' 的合作开发成果展示
- Java打造的ProjectFreeTV客户端:视频观看与下载新体验
- 钢琴培训班招生海报设计创意与制作
- 双周课表管理新助手:jPK精良排课软件专用版
- Project Cv-分布式系统的开源媒体元数据管理
- 智慧金融与大数据:全方位解决方案和应用案例
- CharityNow:慈善组织和个人的Android应用解决方案
- 期末考试必备:计算机网络复习资料精华整理
- 跨平台开发环境构建指南:Tempo_HD交互式地图与Cadence_HD项目
- 大学实验室团队管理系统开发及应用指南
- Matthew Spangenberg: 探索其UX设计投资组合及技术实现
- RailsAPI: 构建中Rails的API项目介绍
- cb-node:打造高效通用区块链节点服务器解决方案
- 国庆节小报设计素材包:源文件PSD与JPG格式
- Delphi 7.3.4.3版本发布,全面升级安装体验
- byte-me开源项目: Perl编写的IPtables配额系统
- 儿童生日海报设计创意与制作指南
- 2021 COG夏季工作坊:编程技能亲身体验
- Linux期末复习指南:题型总结与实验PPT汇总
- XEvePro:一个命令行XML事件处理工具
- Java定制版本GEP 3.0.1的发布与许可证说明