mysql 范式和反范式
第一范式(1NF)
强调的是列的原子性,即列不能够再分成其他几列。
第二范式(2NF)
首先是 2NF,另外包含两部分内容一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
第三范式(3NF)
首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
第三范式通常已经可以满足业务需求了,表之间的关系也比较清楚了,容易维护。但是为什么要反范式呢?
首先我们需要了解到定义数据库范式的历史背景,在20世纪70年代到80年代范式基本完善定型。在那个时候的系统下:一个硬盘的大小有限,一般也就几百兆(价格也比较高),上网的人也少,所以范式的理论强调减少依赖,降低冗余节省空间的使用。而现在最普通的硬盘都是500G,大一点的就上T了而且价格便宜,同时上网人数也增多了,数据库面临则高并发,业务逻辑复杂,低延迟的要求。很难在遵循这范式的基础上进行数据库设计开发,那么适当的降低范式,增加冗余,用空间来换时间是值得的。最低可以把范式降低到1NF。
通常在设计数据库时遵循以下原则:
1.核心业务使用范式。在类似交易有关的这种敏感核心业务中,强调数据安全和一致性,需要遵循范式保证数据唯一和一致。具体什么是核心业务视情况而定。
2.弱一致性需求——反ACID。在一些对数据一致性要求不高的场合,不必完全遵循ACID,出现适当的数据不一致是可以容忍的。如在线人数,静态页等。当下流行的NoSQL技术,就是基于弱一致性需求,降低数据完整性和一致性换取效率的。
3.空间换时间,冗余换效率。由于一条可见的记录被拆分到多个表中记录,当数据量比较大的时候,联表查询就比较费时,sql语句也变的比较复杂,难于优化。此时就需要适当的冗余了。在统计报表,视图中就是对这一条规则的体现。统计报表通常会对很多列,有的时候多达上百列,需要对几个十几个表进行联表,数度缓慢,使用人数一多可能会时数据库服务器宕机。这种情况就需要使用冗余表了,冗余表一般符合第一和第二范式。冗余表一边是定期转储。
4.避免不必要的冗余。范式理论不是说反就反的,反范式理论不是不要范式,而是在必要时创建冗余表或者总结表。不必要的冗余任然是要避免的。所有的规则都是有使用场景的,我们不应该固守规则,在某些情况下,应懂得变通。
mysql 范式和反范式的更多相关文章
- MySQL中数据中设计中的范式与反范式
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小.但是有些时候一昧的追求范式减少冗余,反而会降低数据读写 ...
- 数据库三大范式和反范式 · oldmee
后一个范式都是在满足前一个范式的基础上建立的. 1NF 无重复的列.表中的每一列都是不可分割的基本数据项.不满足1NF的数据库不是关系数据库.如联系人表(姓名,电话),一个联系人有家庭电话和公司电话, ...
- 【mysql的设计与优化专题(2)】数据中设计中的范式与反范式
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小.但是有些时候一昧的追求范式减少冗余,反而会降低数据读写 ...
- mysql数据结构优化,范式和反范式
1.范式,正常的建表,反范式,为了提高效率,适当的已空间换时间 2.垂直拆分,就是把经常用的.或者text大存储的字段单独拉出来存表 3.水平拆分,解决数据量大的问题,进行取莫的方式将数据放到相同的n ...
- MySQL三大范式和反范式
1. 第一范式确保数据表中每列(字段)的原子性.如果数据表中每个字段都是不可再分的最小数据单元,则满足第一范式.例如:user用户表,包含字段id,username,password 2. 第二范式在 ...
- MYSQL学习笔记——数据库范式及MYSQL优化整体思路
一.数据库范式 为了建立冗余较小.结构合理的 ...
- 数据库设计范式2——BC范式和第四范式
我在很久之前的一篇文章中介绍了数据库模型设计中的基本三范式,今天,我来说一说更高级的BC范式和第四范式. 回顾 我用大白话来回顾一下什么是三范式: 第一范式:每个表应该有唯一标识每一行的主键. 第二范 ...
- 数据库的范式,第一、二、三、四、五范式、BC范式
数据库的规范化(上一篇博客有写到)的程度不同,便有了这么多种范式.数据库范式是数据库设计必不可少的知识,没有对范式的理解,就无法设计出高效率.优雅的数据库,甚至设计出错误误的数据库.课本中的定义比较抽 ...
- MySQL 中的反引号(`):是为了区分 MySql 关键字与普通字符而引入的符号;一般,表名与字段名都使用反引号。
MySQL 中的反引号(`):是为了区分 MySql 关键字与普通字符而引入的符号:一般,表名与字段名都使用反引号.
随机推荐
- iOS单个应用程序的最大可用内存是多少?
iOS单个应用程序的最大可用内存是多少? StackOverflow上有人做了一些简单的测试,有限设备下迄今为止测到的结果: iPad1: 127MB/256MB/49% (大致crash临界值 ...
- int型时间字符串转日期
string re ="201611"; DateTime d1 = DateTime.ParseExact(re, "yyyyMMdd", null);
- 使用linq的好处
1.linq非常方便,把复杂的业务逻辑从数据库分离,起到了很好的优化作用 2.linq非常灵活,可以用基本统一的访问方式,访问各种数据源,对项目的管理和维护,起到了十分便捷的作用 3.用linq可以不 ...
- Java实现插入排序
package Sort; import java.util.Arrays; public class InsertionSort { public static int[] sort(int[] l ...
- My Baits入门(一)mybaits环境搭建
1)在工程下引入mybatis-3.4.1.jar包,再引入数据库(mysql,mssql..)包. 2)在src下新建一个配置文件conf.xml <?xml version="1. ...
- Java生成和操作Excel文件(转载)
Java生成和操作Excel文件 JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该A ...
- HDU 5458 Stability(双连通分量+LCA+并查集+树状数组)(2015 ACM/ICPC Asia Regional Shenyang Online)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5458 Problem Description Given an undirected connecte ...
- github Android-Universal-Image-Loader
目存在于Github上面https://github.com/nostra13/Android-Universal-Image-Loader,我们可以先看看这个开源库存在哪些特征 多线程下载图片,图片 ...
- LAMP环境搭建
安装前说明: 先安装gcc gcc-c++ make 等 可用yum install -y gcc gcc-c++ make 也可以使用rpm安装不过需要注意依赖 1.安装apache 下载链接:ht ...
- String相关的问题
基本事实:对于字符串常量,如果内容相同,Java认为它们代表同一个String对象.而用关键字new 调用的构造器,总是会创建新的对象,无论内容是否相同.字符串常量是放在常量池(或者叫常量缓冲区)里面 ...