[范式与反范式](http://www.kancloud.cn/aakng/mysql/211272)
范式概念
符合某一种级别的关系模式的集合,即设计数据库必须遵循一定的规则,在关系型数据库中,这种规则就是范式。
提出范式是为数据库建模提供一个理论基础,它也有缺陷,于是又提出了反范式,是对范式不足之处的一些补充,而不是全盘否定。
六种范式
1NF 2NF 3NF BCNF 4NF 5NF
一般数据库建模只要遵守到3NF或者BCNF即可,5NF通常被称为完美范式。
1、1NF
数据表的每一列都是不可再分割的基本数据项,即对属性的原子性约束。
2、2NF
数据表中每行都必须可以被唯一地区分,是为防止数据重复,通常是使用一个主键来唯一标识一条记录。
满足第二范式就肯定满足第一范式。
完全依赖、部分依赖:不能存在一条记录可以仅依赖于主键的一部分属性,比如主键是身份证号和姓名两个字段组成,整条记录可以只依赖主键,因为身份证号可以唯一确定一条记录,这就不是完全依赖,而是部分依赖。
直接依赖、传递依赖(函数依赖、间接依赖):a依赖b,b依赖c,则a肯定依赖c,这就是传递依赖,比如:学生信息表(学号,姓名,班级,班主任姓名),班主任姓名依赖于班级,班级依赖于学号,所以班主任姓名传递依赖学号,直接依赖班级(因为通常认为班主任是和一个班级联系起来的)。
3、3NF
非主属性之间不能相互依赖,必须直接依赖候选关键字。
候选关键字:具有唯一标识特性的一个或多个属性,比如班号,学号。
主属性:包含在任一候选关键字中的属性。
主关键字:即主键,分为单字段主键,多字段主键。
超关键字:单字段主键。
外关键字:外键。
4、BCNF
非主属性必须直接依赖主关键字。
通常我们把建模标准锁定为3NF或BCNF就可以了,越往后,表中存的冗余信息就越少,这也是范式理论的目的所在,但是一味地追求存储更少的冗余信息不是我们的最终目的,在硬盘廉价的现在,如何能更高效地查询数据也是很重要的。
...
反范式概念
逆规范化,存在的意义就是弥补规范化,或者说是弥补范式的不足。
常用发规范技术
1、增加冗余列
就是在多个表中增加相同的列,是为了避免在查询时连接操作。
2、增加派生列
增加的列是来自其他表的数据,是由其他表数据经过计算生成,是为了在查询中减少连接操作。
3、重新组表和分割表
重新组表就是将两个表组合成一个表,从而减少连接来提高性能。
分割表通常是对表进行拆分,分为水平拆分和垂直拆分。
范式化的好处
1、范式化的更新操作比非范式化快。
2、范式化的表通常会很小,可以更好地加载到内存中,所以操作会更快。
3、由于很少有冗余,基本不需要使用distinct和group by。
范式化较高的数据库通常的缺点就是连接操作(关联操作),它可能会使内存开销瞬间提高几个档次。
对于经常会进行写操作的应用,通常建议对数据库建模实现较高的范式化。
- 数据库
- CAP定理
- 关系模型
- 关系数据库
- NoSQL
- ODBC
- JDBC
- ODBC、JDBC和四种驱动类型
- mysql
- 安装与配置
- CentOS 7 安装 MySQL
- 优化
- 比较全面的MySQL优化参考
- 1、硬件层相关优化
- 1.1、CPU相关
- 1.2、磁盘I/O相关
- 2、系统层相关优化
- 2.1、文件系统层优化
- 2.2、其他内核参数优化
- 3、MySQL层相关优化
- 3.1、关于版本选择
- 3.2、关于最重要的参数选项调整建议
- 3.3、关于Schema设计规范及SQL使用建议
- 3.4、其他建议
- 后记
- Mysql设计与优化专题
- ER图,数据建模与数据字典
- 数据中设计中的范式与反范式
- 字段类型与合理的选择字段类型
- 表的垂直拆分和水平拆分
- 详解慢查询
- mysql的最佳索引攻略
- 高手详解SQL性能优化十条经验
- 优化SQL查询:如何写出高性能SQL语句
- MySQL索引原理及慢查询优化
- 数据库SQL优化大总结之 百万级数据库优化方案
- 数据库性能优化之SQL语句优化1
- 【重磅干货】看了此文,Oracle SQL优化文章不必再看!
- MySQL 对于千万级的大表要怎么优化?
- MySQL 数据库设计总结
- MYSQL性能优化的最佳20+条经验
- 数据操作
- 数据语句操作类型
- DCL
- 修改Mysql数据库名的5种方法
- DML
- 连接
- 连接2
- DDL
- 数据类型
- 字符集
- 表引擎
- 索引
- MySQL理解索引、添加索引的原则
- mysql建索引的几大原则
- 浅谈mysql的索引设计原则以及常见索引的区别
- 常用工具简介
- QA
- MySQL主机127.0.0.1与localhost区别总结
- 视图(view)
- 触发器
- 自定义函数和存储过程的使用
- 事务(transaction)
- 范式与反范式
- 常用函数
- MySQL 数据类型 详解
- Mysql数据库常用分库和分表方式
- 隔离级别
- 五分钟搞清楚MySQL事务隔离级别
- mysql隔离级别及事务传播
- 事务隔离级别和脏读的快速入门
- 数据库引擎中的隔离级别
- 事务隔离级别
- Innodb中的事务隔离级别和锁的关系
- MySQL 四种事务隔离级的说明
- Innodb锁机制:Next-Key Lock 浅谈
- SQL函数和存储过程的区别
- mongo
- MongoDB设置访问权限、设置用户
- redis
- ORM
- mybatis
- $ vs #
- mybatis深入理解(一)之 # 与 $ 区别以及 sql 预编译
- 电商设计
- B2C电子商务系统研发——概述篇
- B2C电子商务系统研发——商品数据模型设计
- B2C电子商务系统研发——商品模块E-R图建模
- B2C电子商务系统研发——商品SKU分析和设计(一)
- B2C电子商务系统研发——商品SKU分析和设计(二)
- 数据库命名规范--通用