- 浏览: 890645 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (687)
- java (127)
- servlet (38)
- struts (16)
- spring (22)
- hibernate (40)
- javascript (58)
- jquery (18)
- tomcat (51)
- 设计模式 (6)
- EJB (13)
- jsp (3)
- oracle (29)
- RUP (2)
- ajax (3)
- java内存管理 (4)
- java线程 (12)
- socket (13)
- path (5)
- XML (10)
- swing (2)
- UML (1)
- JBPM (2)
- 开发笔记 (45)
- Note参考 (15)
- JAXB (4)
- Quartz (2)
- 乱码 (2)
- CSS (2)
- Exception (4)
- Tools (7)
- sqlserver (3)
- DWR (7)
- Struts2 (47)
- WebService (2)
- 问题解决收藏 (7)
- JBOSS (7)
- cache (10)
- easyUI (19)
- jQuery Plugin (11)
- FreeMarker (6)
- Eclipse (2)
- Compass (2)
- JPA (1)
- WebLogic (1)
- powerdesigner (1)
- mybatis (1)
最新评论
-
bugyun:
受教了,谢谢
java 正则表达式 过滤html标签 -
xiongxingxing_123:
学习了,感谢了
java 正则表达式 过滤html标签 -
wanmeinange:
那如果无状态的。对同一个任务并发控制怎么做?比如继承Quart ...
quartz中参数misfireThreshold的详解 -
fanjieshanghai:
...
XPath 元素及属性查找 -
tianhandigeng:
还是没明白
quartz中参数misfireThreshold的详解
范式应用
我们来逐步搞定一个论坛的数据库,有如下信息:
(1) 用户:用户名,email,主页,电话,联系地址
(2) 帖子:发帖标题,发帖内容,回复标题,回复内容
第一次我们将数据库设计为仅仅存在表:
用户名 email 主页 电话 联系地址 发帖标题 发帖内容 回复标题 回复内容
这个数据库表符合第一范式,但是没有任何一组候选关键字能决定数据库表的整行,唯一的关键字段用户名也不能完全决定整个元组。我们需要增加"发帖ID"、"回复ID"字段,即将表修改为:
用户名 email 主页 电话 联系地址 发帖ID 发帖标题 发帖内容 回复ID 回复标题 回复内容
这样数据表中的关键字(用户名,发帖ID,回复ID)能决定整行:
(用户名,发帖ID,回复ID) → (email,主页,电话,联系地址,发帖标题,发帖内容,回复标题,回复内容)
但是,这样的设计不符合第二范式,因为存在如下决定关系:
(用户名) → (email,主页,电话,联系地址)
(发帖ID) → (发帖标题,发帖内容)
(回复ID) → (回复标题,回复内容)
即非关键字段部分函数依赖于候选关键字段,很明显,这个设计会导致大量的数据冗余和操作异常。
我们将数据库表分解为(带下划线的为关键字):
(1) 用户信息:用户名,email,主页,电话,联系地址
(2) 帖子信息:发帖ID,标题,内容
(3) 回复信息:回复ID,标题,内容
(4) 发贴:用户名,发帖ID
(5) 回复:发帖ID,回复ID
这样的设计是满足第1、2、3范式和BCNF范式要求的,但是这样的设计是不是最好的呢?
不一定。
观察可知,第4项"发帖"中的"用户名"和"发帖ID"之间是1:N的关系,因此我们可以把"发帖"合并到第2项的"帖子信息"中;第5项"回复"中的"发帖ID"和"回复ID"之间也是1:N的关系,因此我们可以把"回复"合并到第3项的"回复信息"中。这样可以一定量地减少数据冗余,新的设计为:
(1) 用户信息:用户名,email,主页,电话,联系地址
(2) 帖子信息:用户名,发帖ID,标题,内容
(3) 回复信息:发帖ID,回复ID,标题,内容
数据库表1显然满足所有范式的要求;
数据库表2中存在非关键字段"标题"、"内容"对关键字段"发帖ID"的部分函数依赖,即不满足第二范式的要求,但是这一设计并不会导致数据冗余和操作异常;
数据库表3中也存在非关键字段"标题"、"内容"对关键字段"回复ID"的部分函数依赖,也不满足第二范式的要求,但是与数据库表2相似,这一设计也不会导致数据冗余和操作异常。
由此可以看出,并不一定要强行满足范式的要求,对于1:N关系,当1的一边合并到N的那边后,N的那边就不再满足第二范式了,但是这种设计反而比较好!
对于M:N的关系,不能将M一边或N一边合并到另一边去,这样会导致不符合范式要求,同时导致操作异常和数据冗余。
对于1:1的关系,我们可以将左边的1或者右边的1合并到另一边去,设计导致不符合范式要求,但是并不会导致操作异常和数据冗余。
结论
满足范式要求的数据库设计是结构清晰的,同时可避免数据冗余和操作异常。这并意味着不符合范式要求的设计一定是错误的,在数据库表中存在1:1或1:N关系这种较特殊的情况下,合并导致的不符合范式要求反而是合理的。
在我们设计数据库的时候,一定要时刻考虑范式的要求。
我们来逐步搞定一个论坛的数据库,有如下信息:
(1) 用户:用户名,email,主页,电话,联系地址
(2) 帖子:发帖标题,发帖内容,回复标题,回复内容
第一次我们将数据库设计为仅仅存在表:
用户名 email 主页 电话 联系地址 发帖标题 发帖内容 回复标题 回复内容
这个数据库表符合第一范式,但是没有任何一组候选关键字能决定数据库表的整行,唯一的关键字段用户名也不能完全决定整个元组。我们需要增加"发帖ID"、"回复ID"字段,即将表修改为:
用户名 email 主页 电话 联系地址 发帖ID 发帖标题 发帖内容 回复ID 回复标题 回复内容
这样数据表中的关键字(用户名,发帖ID,回复ID)能决定整行:
(用户名,发帖ID,回复ID) → (email,主页,电话,联系地址,发帖标题,发帖内容,回复标题,回复内容)
但是,这样的设计不符合第二范式,因为存在如下决定关系:
(用户名) → (email,主页,电话,联系地址)
(发帖ID) → (发帖标题,发帖内容)
(回复ID) → (回复标题,回复内容)
即非关键字段部分函数依赖于候选关键字段,很明显,这个设计会导致大量的数据冗余和操作异常。
我们将数据库表分解为(带下划线的为关键字):
(1) 用户信息:用户名,email,主页,电话,联系地址
(2) 帖子信息:发帖ID,标题,内容
(3) 回复信息:回复ID,标题,内容
(4) 发贴:用户名,发帖ID
(5) 回复:发帖ID,回复ID
这样的设计是满足第1、2、3范式和BCNF范式要求的,但是这样的设计是不是最好的呢?
不一定。
观察可知,第4项"发帖"中的"用户名"和"发帖ID"之间是1:N的关系,因此我们可以把"发帖"合并到第2项的"帖子信息"中;第5项"回复"中的"发帖ID"和"回复ID"之间也是1:N的关系,因此我们可以把"回复"合并到第3项的"回复信息"中。这样可以一定量地减少数据冗余,新的设计为:
(1) 用户信息:用户名,email,主页,电话,联系地址
(2) 帖子信息:用户名,发帖ID,标题,内容
(3) 回复信息:发帖ID,回复ID,标题,内容
数据库表1显然满足所有范式的要求;
数据库表2中存在非关键字段"标题"、"内容"对关键字段"发帖ID"的部分函数依赖,即不满足第二范式的要求,但是这一设计并不会导致数据冗余和操作异常;
数据库表3中也存在非关键字段"标题"、"内容"对关键字段"回复ID"的部分函数依赖,也不满足第二范式的要求,但是与数据库表2相似,这一设计也不会导致数据冗余和操作异常。
由此可以看出,并不一定要强行满足范式的要求,对于1:N关系,当1的一边合并到N的那边后,N的那边就不再满足第二范式了,但是这种设计反而比较好!
对于M:N的关系,不能将M一边或N一边合并到另一边去,这样会导致不符合范式要求,同时导致操作异常和数据冗余。
对于1:1的关系,我们可以将左边的1或者右边的1合并到另一边去,设计导致不符合范式要求,但是并不会导致操作异常和数据冗余。
结论
满足范式要求的数据库设计是结构清晰的,同时可避免数据冗余和操作异常。这并意味着不符合范式要求的设计一定是错误的,在数据库表中存在1:1或1:N关系这种较特殊的情况下,合并导致的不符合范式要求反而是合理的。
在我们设计数据库的时候,一定要时刻考虑范式的要求。
发表评论
-
在Oracle查询语句中怎样手动指定索引
2011-09-16 01:08 1240select /*+ index(tablename inde ... -
数据库范式(1NF 2NF 3NF BCNF)详解一
2011-08-28 13:35 4559数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数 ... -
ORACLE数据库TM(表级)锁小结
2011-08-24 14:32 2218SQL语句 表锁模 ... -
Oracle中NVARCHAR2和VARCHAR2的区别
2011-05-20 10:16 2861Oracle中NVARCHAR2和VARCHAR2的区别 【 ... -
Oracle中connect by prior用法
2011-03-08 17:18 891connect by prior 是结构化 ... -
【总结】oracle恢复误删除数据,解除锁定的等sql语句
2011-03-08 16:55 1078转载请注明出处:http://renjie120.iteye. ... -
授予oracle导入用户表权限
2010-12-13 15:38 1094给用户增加导入数据权 ... -
如何写批处理文件自动将数据导入oracle数据库
2010-12-13 14:30 3298Oracle数据库的自动导入 ... -
如何使用PLSQL Developer从oracle数据库 导入导出数据
2010-12-13 14:26 4120如何使用PLSQL Developer从oracle数据库 导 ... -
oracle内存优化
2010-12-01 21:54 974内存2G的优化策略。 SGA最大大小:1300 -
让sql语句不排序,按照in语句的顺序返回结果
2010-12-01 21:47 1751oracle写法: Select * from we ... -
拯救oracle刚被误删的数据
2010-12-01 21:43 10942.误删除所有记录并且提交更改。SQL>delete f ... -
强制停止oracle正在执行的job
2010-12-01 21:40 1979一:温柔的方法:1、查看所有job;select * from ... -
oracle中connect by prior实现递归查询
2010-12-01 14:15 1160收集的几条在oracle中通过connect by prior ... -
oracle高级查询实例,提升效率
2010-12-01 13:57 956使用Oracle特有的查询语法, 可以达到事半功倍的效果。 ... -
oracle DBA必需掌握的常用命令集锦
2010-12-01 13:39 990第一章:日志管理 1.forcing log swit ... -
Oracle性能优化技巧
2010-12-01 12:21 771今天没事来说说oracle性能优化的技巧。。 1.选用适合的 ... -
alce表空间使用情况查询
2010-12-01 12:16 8651.查询oracle表空间的使用情况 select b.f ... -
几条有用sql
2010-12-01 12:14 613查找数据库中所有字段 以对应的表 select C.colu ... -
SYS_REFCURSOR一例
2010-09-29 12:25 27341.看见很多人调试过程依然使用DBMS_OUTPUT.PUT_ ...
相关推荐
### 数据库范式详解 #### 一、第一范式(1NF) 第一范式强调的是数据库表中的每一列都是不可分割的基本数据项,也就是说,在一个表中,每一列都应该是原子性的,不能再细分。例如,如果一个表中有一个字段表示地址...
数据库范式1NF 2NF 3NF BCNF(实例) 设计范式(范式,数据库设计范式,数据库的设计范式)是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。关系数据库中的关系...
"关系型数据库1NF~6NF,BCNF详解" 关系型数据库的范式是指数据库中数据组织和存储的方式,它直接影响着数据库的性能、可维护性和可扩展性。了解关系型数据库的各种范式是非常重要的,它可以帮助我们设计和优化...
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列...
数据库范式主要包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及BCNF(Boyce-Codd范式)。下面我们详细介绍这些范式及其相互之间的转换方法。 ##### 第一范式(1NF) - **定义**:如果关系模式R属于第...
"Java面试中数据库三范式详解" 数据库设计范式是指在设计数据库时需要遵守的一些基本规则,以确保数据的一致性、完整性和简洁性。在 Java 面试中,数据库三范式是常见的考察点,本文将对三范式进行详细的解释,并以...
### 数据库范式详解 #### 一、基础知识 在深入探讨数据库范式之前,我们需要先了解几个基础概念。 ##### 实体(Entity) 实体是指现实世界中客观存在的、可以被区别的事物。例如:“一个学生”、“一本书”、...
### 数据库范式详解 #### 一、基础知识 在深入探讨数据库范式之前,我们先来了解一下几个重要的基本概念。 **实体(Entity)**: 实体指的是现实世界中能够被区分和独立存在的对象或事物。例如,“学生”、“课程...
### 数据库中的范式理论详解 #### 一、范式理论概述 范式理论是数据库设计中的一个重要概念,主要用于指导数据库的设计与优化,确保数据的一致性和减少数据冗余。该理论最早由被称为“关系数据库之父”的E.F.Codd...
范式是衡量数据库结构合理性和优化程度的重要标准,通常包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BC范式(BCNF)以及第四范式(4NF)。这些范式旨在减少数据冗余、消除异常并确保数据的一致性,但在...
文章中的一些概念候选码主属性函数依赖完全函数依赖部分函数依赖传递函数依赖什么是范式范式的分类第一范式(1NF)第二范式(2NF)第三范式(3NF)巴斯-科德范式(BCNF)第四范式(4NF)第五范式(5NF) 文章中的...
从1NF到3NF再到BCNF,每一步都在逐步减少数据的复杂性,提高数据库的整体性能。在实际应用中,根据具体的需求和场景选择合适的范式级别是非常重要的。合理的范式设计不仅可以简化查询,还可以有效避免数据更新异常等...
### 关系型数据库范式详解 #### 范式的概念与意义 关系型数据库的设计遵循一系列规范化原则,称为“范式”。范式是确保数据库结构合理、数据冗余最小化和数据完整性的一种方法论。通过规范化,数据库可以避免数据...
### 数据库三范式详解 在数据库设计领域中,遵循一系列规范来构建高效、合理的关系型数据库至关重要。这些规范称为“范式”,旨在减少数据冗余并提高数据完整性。范式按照递进的方式进行规范,越高级别的范式对...
在实际的数据库设计中,通常会追求更高的范式,如BCNF(博科斯范式)和4NF(第四范式),以进一步优化数据结构和减少冗余。然而,过分追求范式可能导致查询效率下降,需要在规范化和性能之间找到平衡。在设计数据库...
本文将详细介绍四种主要的范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及布尔依斯范式(BCNF),并探讨它们如何帮助设计高效、健壮的数据库系统。 #### 二、第一范式(1NF) 1NF是最基础的范式,...
本文主要介绍1NF、2NF、3NF以及BCNF,并通过实例解析如何应用这些范式。 #### 二、第一范式(1NF) **定义:** 在1NF中,要求关系中的每个属性都是原子性的,即不能再被细分为更小的数据单位。换句话说,表中的每一列...
其中最常用的规范化级别就是第一范式(1NF)、第二范式(2NF)和第三范式(3NF),这三种范式被称为“三范式”。 #### 第一范式(1NF) 第一范式是所有数据库设计的基础,要求数据库表中的每一列都是不可分割的...
SQL三个范式是数据库设计中重要的理论基础,它们分别是第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。这些范式确保了数据库的规范化,避免数据冗余和操作异常,从而提高数据的完整性和一致性。 1. **第一...