数据库范式总结

标签: Database 数据库 范式 | 发表时间:2013-02-12 14:01 | 作者:四火
出处:http://www.raychase.net

文章系本人原创,转载请保持完整性并注明出自 《四火的唠叨》

数据库范式总结 数据库表结构设计时,遵从一定的范式(NF,Noraml Form)可以减少数据冗余和操作异常。

第一范式(1NF)

1NF指的是每个属性值都是不可再分的。

满足1NF的关系被称为规范化的关系,1NF也是关系模式应具备的最起码的条件。

比如有这样一张表user的两列:

  • name
  • phone_number

phone_number这一列只存储一个电话号码,如果一条数据同时存储了住宅电话和手机号码,比如:“010-65576558,13765556765”,那么这个属性是可以再分的,违背了1NF。

第二范式(2NF)

2NF要求去除局部依赖。

也就是说,表中的属性完全依赖于全部主键,而不是部分主键。

比方说user表包含下面几列:

  • user_id
  • name
  • phone_number
  • job_id
  • job_description

其中job_description依赖于job_id,而不是全部主键(user_id,job_id),所以违背了2NF。这时可以把job部分单独抽取成一张job表,去除冗余。

第三范式(3NF)

3NF要求消除非主属性对候选键的传递依赖。

比如user表现在组成如下:

  • user_id
  • name
  • classification

仅有user_id是主键,用户姓名依赖于主键user_id,根据姓名name来给用户分类,而用户可能重名,因此name是允许重复的,再有用户分类classification依赖于用户姓名。这张表已经满足了2NF,即属性依赖于全部主键user_id,但是形成了从classification到非候选键name再到主键user_id的传递依赖,不符合3NF。

BC范式(BCNF)

3NF中只是排除了非主属性对候选键的传递依赖,于是更进一步,BCNF还要求消除主属性对候选键在内的传递依赖。

user表现在变成这样:

  • user_id
  • card_id
  • passport_id

其中护照号passport_id是主键,身份证号card_id和用户号user_id都是候选键,存在主属性passport_id到card_id再到候选键user_id的传递依赖。

第四范式(4NF)

4NF是要消除多值依赖。

在关系模式中,函数依赖不能表示属性值之间的一对多联系,这些属性之间有些虽然没有直接关系,但存在间接的关系,把没有直接联系、但有间接的联系称为多值依赖的数据依赖。

比如user表:

  • user_id
  • position
  • salary_level

user_id是主键,薪水等级salary_level看似被用户id直接确定,但其实薪水等级是根据职位position来确定的,和用户本身无直接关系,这就是多值依赖。

第五范式(5NF)、DK范式(DKNF)和第六范式(6NF)

5NF要求消除连接依赖,并且必须保证数据完整。多值依赖是连接依赖的特殊情况,定义稍复杂。这几种范式已经很少涉及。

在保证数据完整性基础上,通常达到3NF,有时达到2NF已经足够了,追求过高的NF级别会导致混乱的库表,大量的多表连接查询,性能低下。

文章系本人原创,转载请保持完整性并注明出自 《四火的唠叨》

分享到:
你可能也喜欢:

相关 [数据库 范式] 推荐:

数据库范式总结

- - 四火的唠叨
文章系本人原创,转载请保持完整性并注明出自 《四火的唠叨》. 数据库表结构设计时,遵从一定的范式(NF,Noraml Form)可以减少数据冗余和操作异常. 1NF指的是每个属性值都是不可再分的. 满足1NF的关系被称为规范化的关系,1NF也是关系模式应具备的最起码的条件. 比如有这样一张表user的两列:.

数据库设计的三大范式

- 文斌 - 博客园-首页原创精华区
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则. 在关系型数据库中这种规则就称为范式. 范式是符合某一种设计要求的总结. 要想设计一个结构合理的关系型数据库,必须满足一定的范式. 在实际开发中最为常见的设计范式有三个:. 如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式.

数据库设计Step by Step (10)——范式化

- Bloger - 博客园-首页原创精华区
引言:前文(数据库设计Step by Step (9)——ER-to-SQL转化)讨论了如何把ER图转化为关系表结构. 本文将介绍数据库范式并讨论如何范式化候选表. 我们先来看一下此刻处在数据库生命周期中的位置(如下图所示). 前几篇博文中我们详细的讨论了ER建模的方法. 精心设计的ER模型将帮助我们直接得到范式化的表或只需稍许修改即为范式化的表,设计、绘制ER图的重要性也体现在这里.

数据库sharding

- - 数据库 - ITeye博客
当团队决定自行实现sharding的时候,DAO层可能是嵌入sharding逻辑的首选位置,因为在这个层面上,每一个DAO的方法都明确地知道需要访问的数据表以及查询参数,借助这些信息可以直接定位到目标shard上,而不必像框架那样需要对SQL进行解析然后再依据配置的规则进行路由. 另一个优势是不会受ORM框架的制约.

数据库索引

- - CSDN博客推荐文章
索引是由用户创建的、能够被修改和删除的、实际存储于数据库中的物理存在;创建索引的目的是使用户能够从整体内容直接查找到某个特定部分的内容. 一般来说,索引能够提高查询,但是会增加额外的空间消耗,并且降低删除、插入和修改速度. 1.聚集索引:表数据按照索引的顺序来存储的. 2.非聚集索引:表数据存储顺序与索引顺序无关.

数据库事务

- - 数据库 - ITeye博客
事务传播发生在类似以下情形:. 假设methodB的配置是:. 如果methodA在事务里,那么methodB也在这个事务中运行. 如果methodA不在事务里,那么methodB重新建立一个事务运行. 如果methodA在事务里,那么methodB也在这个事务中运行. 如果methodA不在是事务里,那么methodB在非事务中运行.

数据库优化

- - 数据库 - ITeye博客
程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点: . a) SQL的使用规范: .   i.尽量避免大事务操作,慎用holdlock子句,提高系统并发能力.   ii.尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然后再做连接.   iii.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该改写;如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作.

数据库调优

- - 数据库 - ITeye博客
1、1、调整数据结构的设计. 这一部分在开发信息系统之前完成,程序员需要考虑是否使用ORACLE数据库的分区功能,对于经常访问的数据库表是否需要建立索引等. 这一部分也是在开发信息系统之前完成,程序员在这一步需要考虑应用程序使用什么样的体系结构,是使用传统的Client/Server两层体系结构,还是使用Browser/Web/Database的三层体系结构.

MySQL数据库的修复

- Xin - 博客园-首页原创精华区
找到mysql的安装目录的bin/myisamchk工具,在命令行中输入:. 然后myisamchk 工具会帮助你恢复数据表的索引. 好象也不用重新启动mysql,问题就解决了. 当你试图修复一个被破坏的表的问题时,有三种修复类型. 如果你得到一个错误信息指出一个临时文件不能建立,删除信息所指出的文件并再试一次--这通常是上一次修复操作遗留下来的.