第一范式(1NF)
强调的是列的原子性,即列不能够再分成其他几列。

第二范式(2NF)

首先是 2NF,另外包含两部分内容一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。

第三范式(3NF)

首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。

第三范式通常已经可以满足业务需求了,表之间的关系也比较清楚了,容易维护。但是为什么要反范式呢?

首先我们需要了解到定义数据库范式的历史背景,在20世纪70年代到80年代范式基本完善定型。在那个时候的系统下:一个硬盘的大小有限,一般也就几百兆(价格也比较高),上网的人也少,所以范式的理论强调减少依赖,降低冗余节省空间的使用。而现在最普通的硬盘都是500G,大一点的就上T了而且价格便宜,同时上网人数也增多了,数据库面临则高并发,业务逻辑复杂,低延迟的要求。很难在遵循这范式的基础上进行数据库设计开发,那么适当的降低范式,增加冗余,用空间来换时间是值得的。最低可以把范式降低到1NF。

通常在设计数据库时遵循以下原则:

1.核心业务使用范式。在类似交易有关的这种敏感核心业务中,强调数据安全和一致性,需要遵循范式保证数据唯一和一致。具体什么是核心业务视情况而定。

2.弱一致性需求——反ACID。在一些对数据一致性要求不高的场合,不必完全遵循ACID,出现适当的数据不一致是可以容忍的。如在线人数,静态页等。当下流行的NoSQL技术,就是基于弱一致性需求,降低数据完整性和一致性换取效率的。

3.空间换时间,冗余换效率。由于一条可见的记录被拆分到多个表中记录,当数据量比较大的时候,联表查询就比较费时,sql语句也变的比较复杂,难于优化。此时就需要适当的冗余了。在统计报表,视图中就是对这一条规则的体现。统计报表通常会对很多列,有的时候多达上百列,需要对几个十几个表进行联表,数度缓慢,使用人数一多可能会时数据库服务器宕机。这种情况就需要使用冗余表了,冗余表一般符合第一和第二范式。冗余表一边是定期转储。

4.避免不必要的冗余。范式理论不是说反就反的,反范式理论不是不要范式,而是在必要时创建冗余表或者总结表。不必要的冗余任然是要避免的。所有的规则都是有使用场景的,我们不应该固守规则,在某些情况下,应懂得变通。

mysql 范式和反范式的更多相关文章

  1. MySQL中数据中设计中的范式与反范式

    设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小.但是有些时候一昧的追求范式减少冗余,反而会降低数据读写 ...

  2. 数据库三大范式和反范式 · oldmee

    后一个范式都是在满足前一个范式的基础上建立的. 1NF 无重复的列.表中的每一列都是不可分割的基本数据项.不满足1NF的数据库不是关系数据库.如联系人表(姓名,电话),一个联系人有家庭电话和公司电话, ...

  3. 【mysql的设计与优化专题(2)】数据中设计中的范式与反范式

    设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小.但是有些时候一昧的追求范式减少冗余,反而会降低数据读写 ...

  4. mysql数据结构优化,范式和反范式

    1.范式,正常的建表,反范式,为了提高效率,适当的已空间换时间 2.垂直拆分,就是把经常用的.或者text大存储的字段单独拉出来存表 3.水平拆分,解决数据量大的问题,进行取莫的方式将数据放到相同的n ...

  5. MySQL三大范式和反范式

    1. 第一范式确保数据表中每列(字段)的原子性.如果数据表中每个字段都是不可再分的最小数据单元,则满足第一范式.例如:user用户表,包含字段id,username,password 2. 第二范式在 ...

  6. MYSQL学习笔记——数据库范式及MYSQL优化整体思路

    一.数据库范式                                                                               为了建立冗余较小.结构合理的 ...

  7. 数据库设计范式2——BC范式和第四范式

    我在很久之前的一篇文章中介绍了数据库模型设计中的基本三范式,今天,我来说一说更高级的BC范式和第四范式. 回顾 我用大白话来回顾一下什么是三范式: 第一范式:每个表应该有唯一标识每一行的主键. 第二范 ...

  8. 数据库的范式,第一、二、三、四、五范式、BC范式

    数据库的规范化(上一篇博客有写到)的程度不同,便有了这么多种范式.数据库范式是数据库设计必不可少的知识,没有对范式的理解,就无法设计出高效率.优雅的数据库,甚至设计出错误误的数据库.课本中的定义比较抽 ...

  9. MySQL 中的反引号(`):是为了区分 MySql 关键字与普通字符而引入的符号;一般,表名与字段名都使用反引号。

    MySQL 中的反引号(`):是为了区分 MySql 关键字与普通字符而引入的符号:一般,表名与字段名都使用反引号.

随机推荐

  1. varsh4.1 安装清除cache

    yum install automake autoconf ncurses-devel libxslt groff pkgconfig python-docutils readline-devel - ...

  2. visual studio 2015 + Cordova 开发环境搭建

    简单的写一些,备忘,太折腾了,特别是通过代理上网的我们国内的开发者 1.当然是安装Visual Studio 2015,别忘了选择Tools For Apache Cordova. 对于通过Proxy ...

  3. nodejs的request创建的get和post请求,带参数

    1.导入request : var request = require('request'); 2.get请求 request({ timeout:5000, // 设置超时 method:'GET' ...

  4. PostgreSQL Replication之第一章 理解复制概念(1)

    PostgreSQL Replication系列翻译自PostgreSQL Replication一书 在本章中,将会介绍不同的复制概念,您会了解哪些类型的复制对哪一种实用场景是最合适的. 在本章的最 ...

  5. echarts 图表应用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. iOS 如何在Label中显示html的文本

    if (self.messageModel) { NSString * htmlString = self.messageModel.contentText; NSAttributedString * ...

  7. input中空格后的数据不显示

    bug,input中空格后的数据不显示     昨天在修bug,有一个bug是用户修改的个人信息的地址栏,输入有空格的话,空格后面的内容存不上,而且没有报错,奇怪了,只好跟踪下. 页面上的输入框就是个 ...

  8. VIM 常用快捷键

    一,光标移动 大家不要觉得光标移动不重要,其实它是基础,更好的光标移动,复制,粘贴,删除等才能更加的得心应手,进入了编辑器里面后,鼠标就不能用了. 光标移动 h 或 向左箭头键(←) 20h或者20( ...

  9. mbed学习之 PWMOUT

    PWM通过一个周期内不同占空比来表征模拟量,应用非常广泛.mbed中提供了一个PWM类,来对PWM进行操作,可以分别设置占空比,周期,以及脉冲宽度. 因为这里是使用单片机内部TIM来生成PWM波的,所 ...

  10. Array类

    class Array Arrays are ordered, integer-indexed collections of any object. Array indexing starts at ...