第一范式(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. 使用linq的好处

    1.linq非常方便,把复杂的业务逻辑从数据库分离,起到了很好的优化作用 2.linq非常灵活,可以用基本统一的访问方式,访问各种数据源,对项目的管理和维护,起到了十分便捷的作用 3.用linq可以不 ...

  2. SLP测试记录

    个人感觉来说这个游戏对我没有什么吸引力...完全不知道用户需求在哪...是我最不喜欢的一个游戏 不过听制作团队之前的介绍,这应该不算是一个游戏,而是一个游戏练习器?所以从游戏的角度来评判的话感觉有很多 ...

  3. option(recompile)

    Ref: http://www.cnblogs.com/CareySon/archive/2013/05/04/PlanCacheInSQLServerPart2.html https://msdn. ...

  4. HTML5的postMessage使用记要////////////////////////////zzzzzzzz

    2014-11-09 20:17:27http://jo2.org/html5-js-postmessage-tips/--点击数:2710     HTML5提出了一个新的用来跨域传值的方法,即po ...

  5. svg gradient

    SVG和canvas中是一样的,都是使用标准的HTML/CSS中的颜色表示方法,这些颜色都可以用于fill和stroke属性. 基本有下面这些定义颜色的方式: 1. 颜色名字: 直接使用颜色名字red ...

  6. 谁也无法挡住我访问Google---使用Nginx反向代理攻略

    展示最终成果: 浏览器打开​ http://www.manda13.com/(慢搭搜索)这个是自己搭建的百度网盘搜索,欢迎测试 点击右上角“原版Google”,就可以访问Google. 是不是很方便. ...

  7. app推送中的通知和消息区别

    最近在做mqtt及其他消息推送的功能,推送服务挺多的,小米推,极光推,华为推,个推等,当然还有苹果的apns.感觉都差不多,尝试了apns,小米推和个推,各个厂家都提供的有sdk,demo. 关于通知 ...

  8. 论文阅读(Weilin Huang——【TIP2016】Text-Attentional Convolutional Neural Network for Scene Text Detection)

    Weilin Huang--[TIP2015]Text-Attentional Convolutional Neural Network for Scene Text Detection) 目录 作者 ...

  9. html5,单击文字自动获得焦点

    <p><label for=""></label>这样单击后自动获得焦点</p>

  10. newtonsoft.json 序列化,反序列化

    public class Book { public string BookID { get; set; } public DateTime PublishDate { get; set; } pub ...