当前位置:  数据库>oracle

数据库范式详解

    来源: 互联网  发布时间:2017-06-06

    本文导语: 数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。反之则是乱七八糟,不仅给数据库的编程人员制造麻烦...

数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。

范式说明

1.1 第一范式(1NF)无重复的列

所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。

说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。

例如,如下的数据库表是符合第一范式的:

字段1

字段2

字段3

字段4

而这样的数据库表是不符合第一范式的:

字段1

字段2

字段3

字段4

   

字段3.1

字段3.2

           

数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。很显然,在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。

1.2 第二范式(2NF)属性完全依赖于主键 [ 消除部分子函数依赖 ]

如果关系模式R为第一范式,并且R中每一个非主属性完全函数依赖于R的某个候选键, 则称为第二范式模式。

第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键、主码。

例如员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。

简而言之,第二范式(2NF)就是非主属性完全依赖于主关键字。

所谓完全依赖是指不能存在仅依赖主关键字一部分的属性(设有函数依赖W→A,若存在XW,有X→A成立,那么称W→A是局部依赖,否则就称W→A是完全函数依赖)。如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。

假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合关键字(学号, 课程名称),因为存在如下决定关系:

(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)

这个数据库表不满足第二范式,因为存在如下决定关系:

(课程名称) → (学分)

(学号) → (姓名, 年龄)

即存在组合关键字中的字段决定非关键字的情况。

由于不符合2NF,这个选课关系表会存在如下问题:

(1) 数据冗余:

同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。

(2) 更新异常:

若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。

(3) 插入异常:

假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。

(4) 删除异常:

假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。

把选课关系表SelectCourse改为如下三个表:

学生:Student(学号, 姓名, 年龄);

课程:Course(课程名称, 学分);

选课关系:SelectCourse(学号, 课程名称, 成绩)。

这样的数据库表是符合第二范式的, 消除了数据冗余、更新异常、插入异常和删除异常。

另外,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。

更多详情见请继续阅读下一页的精彩内容:


    
 
 

您可能感兴趣的文章:

  • Oracle 数据库(oracle Database)性能调优技术详解
  • Oracle数据库中分区功能详解
  • 服务器存储快照和数据库快照详解
  • 基于mysql数据库的密码问题详解
  • mysql jdbc连接mysql数据库步骤及常见参数详解
  • sqlserver数据库导入数据操作详解(图)
  • 深入数据库通用的连接方式详解
  • 将ACCESS数据库迁移到SQLSERVER数据库两种方法(图文详解)
  • 详解远程连接Mysql数据库的问题(ERROR 2003 (HY000))
  • 安装Linux与Oracle数据库步骤详解
  • 详解Linux平台下的Oracle数据库编程
  • oracle联机数据库备份详解
  • C#读取数据库返回泛型集合详解(DataSetToList)
  • 深入SQL Server 跨数据库查询的详解
  • Sql Server 判断表或数据库是否存在的实例详解
  • 解析为何要关闭数据库连接,可不可以不关闭的问题详解
  • jdbc操作数据库的基本流程详解
  • 优化MySQL数据库中的查询语句详解
  • Linux系统下的Oracle数据库编程详解
  • Oracle数据库使用及命名规则的详解
  • oracle数据库tns配置方法详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 基于Key-Value的NOSQL数据库Redis的数据结构及常用相关命令介绍
  • 如何监控数据库的数据,如果数据库数据更改,就通知Server
  • 文档数据库mongodb与列式数据库hbase详细比较
  • 如何从数据库中或文本文件中提取数据到另一个数据库中?
  • SQL Server 2008如何进行数据库分离和附加详细介绍
  • 用JDBC连接Oracle数据库时,如何向数据库中写日期型数据(格式)?谢了!
  • nosql数据库levedb介绍及levedb最新版1.18下载安装
  • 我从JSP页将数据插入到oracle数据库中,为何汉字插入后数据库中显示为乱码呢?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 散分:Jbuilder6开发数据库应用请问你们都用什么数据库? 免费的数据库有那些?
  • php中内置的mysql数据库连接驱动mysqlnd简介及mysqlnd的配置安装方式
  • 数据在页面写不进数据库,也不可以从数据库中读出是什么原因?
  • ORACLE数据库常用字段数据类型介绍
  • mysql 本地数据库如何从远程数据库导数据
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • 公司要给客户做报表,从数据库返回数据,他们死活要返回的格式为Excel格式,请问我怎样才能把数据库返回的数据存为Excel的格式?
  • 删除数据库中重复记录方法介绍及代码参考
  • 开发java下的数据库程序,用什么数据库引擎?
  • Mongodb数据库服务的开启与关闭详细介绍
  • 请问各位朋友:在JAVA的数据库应用管理系统中,如何不在操作系统忠建立数据源便能连接数据库(如ACCESS、MS SQL 等等
  • 如何实现 coreos 下Docker 与分布式数据库结合
  • sql 语句 取数据库服务器上所有数据库的名字
  • sql数据库如何查询修改数据库恢复模式?
  • 应该怎么样将一个对象放入到数据库里?还有怎么将图片放进数据库?急~~
  • sql server 2005删除用户时“数据库主体在该数据库中拥有架构,无法删除”错误的解决办法
  • linux上安装oracle 数据库后,是否能写shell程序实现数据库的自动启动。
  • 使用php语句将数据库*.sql文件导入数据库
  • sql数据库修改数据库用户
  • java数据库连接池和数据库连接示例
  • 对数据库的查询结果resultset进行修改后,怎么将修改的信息传回给数据库
  • java中的数据库结果集可以被赋值吗,可以通过结果集的方法来更新数据库字段吗?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,