0.参考文献:
http://jacki6.iteye.com/blog/774866
http://baike.baidu.com/view/402020.htm
1.范式说明
1.1 第一范式(1NF)无重复的列
所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能同时有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。
在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。在当前的任何关系数据库管理系统(DBMS)中,不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。
举例1:
一张学生表Student(stuNo,stuName,age,age,sex)是不符合第一范式的,因为有重复列age属性。去除重复列age以后的Student(stuNo,stuName,age,sex)是符合第一范式的。
1.2 第二范式(2NF)属性完全依赖于主键 [ 消除部分子函数依赖 ]
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。例如员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是唯一的,因此每个员工可以被唯一区分。这个唯一属性列被称为主关键字或主键、主码。
第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是属性完全依赖于主键。
这里说的主关键字可能不只有一个,有些情况下是存在联合主键的,就是主键有多个属性。
举例2:
以学生选课为例,每个学生都可以选课,并且有这一门课程的成绩,那么如果将这些信息都放在一张表StuGrade(stuNo,stuName,age,sex,courseNo,courseName,credit,score)。
如果不仔细看,我们会以为这张表的主键是stuNo,但是当我们看到最后一个score属性以后,在想想如果没有课程信息,那么哪里有学生成绩信息呢。所以这张表的主键是一个联合主键(stuNo,corseNo),这个联合属性能够唯一确定score属性。那么再看其他信息,比如stuName只需要stuNo就能够唯一确定,courseName只需要courseNo就能够唯一确定,因此这样就存在了部分依赖,不符合第二范式。如果要让学生课程成绩信息满足第二范式,那么久需要将这张表拆分成多张表,一张学生表Studnet(stuNo,stuName,age,sex),一张课程表Course(courseNo,courseName,credit),还有最后一张学生课程成绩表StuGrade(stuNo,courseNo,score)。
这样就符合第二范式了。
1.3 第三范式(3NF)属性不依赖于其它非主属性 [ 消除传递依赖 ]
满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
举例3:
每一个员工都有一个所属部门,假如有一个员工信息表Employee(emp_id,emp_name,emp_age,dept_id,dept_name,dept_info)。
这张员工信息表的主键是emp_id,因为这个属性能够唯一确定其他所有属性,比如知道员工编号emp_id以后,肯定能够知道员工姓名,所属部门编号,部门名称和部门介绍。所以这里dept_id不是主属性,而是非主属性。但是,我们又可以发现dept_name,dept_info这两个属性也可以由dept_id这个非主属性决定,即dept_name依赖dept_id,而dept_id依赖emp_id,这样就存在了传递依赖。而且我们可以看出传递依赖的一个明显缺点就是数据冗余非常严重。
那么如何解决传递依赖问题,其实非常简单,我们只需要将dept_name,dept_info这连个属性删除就可以了,即Employee(emp_id,emp_name,emp_age,dept_id),然后再创建一个部门表Dept(dept_id,dept_name,dept_info)。
这样如果要搜索某一个员工的部门信息dept_info,可以通过数据库连接来实现,查询语句如下:
select e.emp_id,e.emp_name,d.dept_name from Employee e,Dept d where e.dept_id=d.dept_id
注意点:
- 数据库连接会带来一部分的性能损失
- 并不是数据库范式越高越高
- 有时会在数据冗余与范式之间做出权衡,在实际的数据库开发过程中,往往会允许一部分的数据冗余来减少数据库连接。
转自:http://www.cnblogs.com/xwdreamer/archive/2012/05/17/2506039.html
相关推荐
- **设计原则**:遵循第三范式,减少数据冗余,确保数据一致性。 - **实体关系图**:设计清晰的ER图,明确表之间的关系。 #### 五、前端与后端交互 - **Ajax**:Asynchronous JavaScript and XML(异步JavaScript...
1. 面向过程与面向对象的比较 面向过程编程是一种传统的编程范式,它侧重于通过步骤和过程来解决问题。这种方法将程序视为一系列有序的函数调用,其中每个函数处理特定任务。面向过程的建模方法如结构化分析和设计...
1. **3NF 简介**:3NF 数据仓库建模旨在减少数据冗余,提高数据的一致性和准确性。与操作型数据库不同,数据仓库主要用于数据分析,而不是实时交易处理。3NF 建模强调的是数据的规范化,确保每个表都处于第三范式...
**AOP**(Aspect Oriented Programming,面向切面编程)是一种编程范式,它旨在通过将横切关注点(如日志记录、安全控制等)从业务逻辑中分离出来,从而提高代码的可维护性和可读性。以下是一些C#中的AOP框架: 1. ...
根据提供的文件信息,我们可以深入探讨离散数学中的合式公式的转换问题,特别是涉及析取范式(Disjunctive Normal Form, DNF)与合取范式(Conjunctive Normal Form, CNF)的概念及其转换方法。下面将详细阐述这些...
- **规范化**:通过消除冗余数据减少数据不一致性的风险,常见的规范化级别包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)等。 - **索引设计**:合理设计索引可以提高查询效率,但过多的索引也会增加系统的负担。...
4. **面向过程的编程范式**:虽然 Rust 支持多种编程范式,但其核心结构更接近于面向过程的风格。 5. **肩负时代使命**:如同 C 语言曾经推动计算机科学的发展一样,Rust 语言也承担着引领新一代软件开发的责任。 #...
6. **数据库范式**:介绍数据库规范化理论,如第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及BCNF,防止数据冗余和异常。 7. **数据库安全性**:讨论如何保护数据库,包括用户权限管理、访问控制、审计和...
- 3NF(第三范式):在2NF基础上,消除非主属性对候选键的传递依赖。 - 规范化:通过分解关系来消除异常,提高数据一致性。 二、SQL Server 2000简介 - SQL Server 2000提供SQL语言进行数据查询、更新和管理。 ...
- **第三范式 (3NF)**:进一步消除传递函数依赖。 - **BCNF (Boyce-Codd 范式)**:消除所有非主键列对任何候选键的部分和传递函数依赖。 - **第四范式 (4NF)**:消除多值依赖。 - **第五范式 (5NF)**:消除所有...
- **第一范式(1NF)**:确保表中的每个单元格包含单一的不可分割的数据项。 - **第二范式(2NF)**:除了满足第一范式之外,还要确保所有非主属性完全依赖于主键。 - **第三范式(3NF)**:进一步确保任何非主...
2. 正则表达式和范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和BCNF(巴斯-科德范式),以及消除冗余的重要性。 3. 数据依赖:函数依赖、多值依赖和超越依赖,以及规范化过程。 四、数据库设计 1. ...
综上所述,"JVM语言简介-JVM,Java,Scala [视频]"这个资源将深入讲解JVM的工作原理,Java语言的基础和高级特性,以及Scala如何在JVM上运行。对于想要深入理解和优化Java应用,或者学习Scala的人来说,这是一个非常...
- 正范式理论:探讨第一范式(1NF)、第二范式(2NF)、第三范式(3NF)直至BCNF(博科斯范式),理解规范化的重要性。 - 数据库设计:学习如何进行需求分析,创建ER图,转换为关系模式,以及进行逻辑设计和物理...
1. **对象导向与协议导向编程** - Swift作为一种面向对象的语言。 - Swift作为协议导向语言。 - 总结协议导向编程与面向对象编程。 - 面向对象编程与协议导向编程的比较。 - 协议与协议扩展对比超类。 - 实现...
【SQL Server 2005关系数据库简介】 SQL Server 2005是微软公司推出的一款关系型数据库管理系统,它基于强大的关系模型理论,提供了一套完善的数据库解决方案。本章主要介绍了关系数据库的基础知识以及SQL Server ...
在Oracle5-数据库设计.pptx中,可能涵盖了概念数据模型(如ER图)、逻辑数据模型和物理数据模型的转换,以及范式理论(1NF, 2NF, 3NF等)。良好的数据库设计还能考虑性能优化,如合理创建索引、分区等策略。 通过这...
易语言支持多种编程范式,包括面向过程、面向对象和组件编程,具有丰富的内置函数和模块,能够满足不同层次用户的编程需求。 二、格式转换基础 格式转换通常涉及到文件的读取、解析、编码转换和写入等步骤。在飞讯...
- 文法的乔姆斯基体系:分类文法为四种类型,即0型、1型、2型和3型,对应于不同的语言复杂度。 第3章 有穷状态自动机: - 确定性有穷自动机(DFA)和非确定性有穷自动机(NFA):两种主要的自动机模型,它们接受和...
const sum = _.reduce([1, 2, 3], function(memo, num) { return memo + num; }, 0); console.log(sum); // 输出: 6 ``` ##### 4. `reduceRight` (alias: `foldr`) - **功能**:类似于`reduce`,但按照逆序处理...