一、设计范示
在创建一个数据库的过程中,范化是将其转化为一些表的过程,这种方法可以使从数据库得到的结果更加明确。这样可能使数据库产生重复数据,从而导致创建多余的表。范化是在识别数据库中的数据元素、关系,以及定义所需的表和各表中的项目这些初始工作之后的一个细化的过程。
二、数据库三范示介绍
第一范式(1NF)
在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系
数据库。
所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。
例子:
一、字段1 字段2 字段3 字段4
二、字段1 字段2 字段3 字段4
字段3.1 字段3.2
第二范式(2NF)
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。
第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。
例子:(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)
这个数据库表不满足第二范式,因为存在如下决定关系: (课程名称) → (学分) (学号) → (姓名, 年龄),即存在组合关键字中的字段决定非关键字的情况。
存在问题:
1、 数据冗余:同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。
2、 更新异常:若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。
3、 插入异常: 假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。
4、 删除异常: 假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。
修改为3个表:
学生:Student(学号, 姓名, 年龄)
课程:Course(课程名称, 学分)
选课关系:SelectCourse(学号, 课程名称, 成绩)
这样的数据库表是符合第二范式的, 消除了数据冗余、更新异常、插入异常和删除异常。
第三范式(3NF)
满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
总体例子:论坛的数据库设计,有如下信息:
用户:用户名,email,主页,电话,联系地址
帖子:发帖标题,发帖内容,回复标题,回复内容
数据库设计方案:
一、用户名 email 主页 电话 联系地址 发帖标题 发帖内容 回复标题 回复内容
二、用户名 email 主页 电话 联系地址 发帖ID 发帖标题 发帖内容 回复ID 回复标题 回复内容
三、1、用户信息:用户名,email,主页,电话,联系地址
2、帖子信息:发帖ID,标题,内容
3、回复信息:回复ID,标题,内容
4、发贴:用户名,发帖ID
5、回复:发帖ID,回复ID
四、1、用户信息:用户名,email,主页,电话,联系地址
2、帖子信息:用户名,发帖ID,标题,内容
3、回复信息:发帖ID,回复ID,标题,内容
四中数据库表1显然满足所有范式的要求;
数据库表2中存在非关键字段"标题"、"内容"对关键字段"发帖ID"的部分函数依赖,即不满足第二范式的要求,但是这一设计并不会导致数据冗余和操作异常;
转载:http://flatfish2000.iteye.com/blog/453917
分享到:
相关推荐
OpenLDAP作为一种特殊的数据库,通过对读取、查询操作进行特殊的优化和处理,以保证在查询速度方面的优势,因此特别适合用来统一企业的各种认证服务,从而规 范各种业务系统的同一登录身份和口令。当然,它的缺点和...
人力资源管理管理系统普通员工具有系统属性查询、我的薪酬查询功能、我的月度考核查询、参与公司的调查,普通员工功能结构图如图3-3所示。 以管理员身份登录的用户可以查看系统属性、对密码进行修改、增加或删除系统...
例如,吴世洋等对肺部图像数据库联盟中的肺癌 CT 图像进行分割获得肺结节图像,然后利用卷积神经网络(Convolutional Neural Network,CNN)进行特征提取,最后利用 Logistic 分类器进行模型构建与测试,该方法取得...
范文星在其论文中介绍了一种基于Django框架构建的网络运维管理系统,该系统通过对运维事务的流程化处理,实现了对网络资源的系统化配置与管理。 #### 关键技术与方法 ##### Django Web开发框架 Django是一种基于...
可扩展的使用 JDBC针对不同的数据库编程,Facade提供了一种灵活的实现. 设计模式之 Composite(组合) 就是将类用树形结构组合成一个单位.你向别人介绍你是某单位,你是单位中的一个元素,别人和你做买卖,相当于 和...
【标题】"shortener:URL Shortener (Laravel) 如 Laracasts 所示(但在 Laravel 5 中完成)" 这个项目是一个实现URL缩短功能的Web应用,它基于流行的PHP框架Laravel。Laracasts是知名的在线学习平台,提供Laravel和...
- **URI范示**:请求的路径模式,支持通配符和正则表达式。 - **路由优先级**:用于解决多个路由规则匹配同一个请求时的优先级问题。 - **静态资源映射**:将URL路径映射到public目录下的静态资源。 ### 控制器 ...
[1]吴林峰,郭飞,侯艳君,范素香. Matlab在工艺点图实验教学中的运用[J].华北水利水电学院学报,2007,28(2):60-65. [2] Matlab帮助文档. The MathWorks, Inc. [3]点图原理及其应用. 中国标准出版社,2005.
提醒:在使用日期函数时,其日期值应在1753年到9999年之间,这是SQL Server系统所能识别的日期范 围,否则会出现错误。 •DATEADD() DATEADD() 函数语法如下: DATEADD (, , ) DATEADD() 函数返回指定日期...
使用MovieQL,开发者可以构建丰富的电影相关应用,例如电影推荐系统、电影数据库浏览器或者电影评分统计等。GraphQL的强大之处在于其支持分层数据获取,这意味着你可以一次查询获取多个相关资源,而无需多次HTTP请求...
例如,如果你有一个名为`math_operations.py`的模块,其中包含一个名为`add`的函数,你可以创建一个名为`test_math_operations.py`的测试文件,如下所示: ```python import unittest from math_operations import ...
在Java Web开发中,Servlet扮演着服务器端程序的角色,能够生成动态网页内容,与数据库交互,实现业务逻辑等。在本示例中,“sample-servlet”是一个用于教学目的的Servlet项目,它提供了基本的Servlet应用实例,...