数据建模:三大范式和反范式

匆匆过客 提交于 2020-03-09 09:29:57

范式是数据库规范化的⼀个⼿段,是数据库设计中的⼀系列原理和技术,⽤于减少数据库中的数据冗余,并增进数据的⼀致性。

数据规范化通常是将⼤表分成较⼩的表,并且定义它们之间的关系。这样做的⽬的是为了避免冗余存放数据,并确保数据的⼀致性。添加、删除和修改数据等操作可能需要修改多个表,但只需要修改⼀个地⽅即可保证所有表中相关数据的⼀致性。由于数据分布在多个表之间,因此检索信息可能需要根据表之间的关系联合查询多个表。

数据规范化的实质是简单写、复杂读。写⼊操作⽐较简单,对于不同的信息,分别修改不同的表即可;⽽读取数据则相对复杂,检索数据的时候,可能需要编写复杂的SQL来联合查询多个表。

第一范式(1NF)

第⼀范式是指数据库表的每⼀列(属性)都是不可分割的基本数据项,这就要求数据库的 每⼀列都只能存放单⼀值,即实体中的某个属性不能有多个值或不能有重复的属性。

第⼀范式是对关系模式的基本要求。

关键点: 每⼀列都只能存放单⼀值

例如:我们开发微博时的 User 表和微博表,⼀个⽤户可以发表多个微博,但设计时需要将⽤户 数据和微博数据单独存放。
在这里插入图片描述

第二范式(2NF)

第⼆范式(2NF)是在第⼀范式(1NF)的基础上建⽴起来的,⼀个数据表符合第⼆范式的前提是该数据表符合第⼀范式。

它的规则是要求数据表⾥的所有数据都要和该数据表的主键有完全相依的关系; 如果有哪些数据只和主键的⼀部分有关的话,就得把它们独⽴出来变成另⼀个数据表。

关键点: ⾮主键字段完全依赖于主键

错误示例:
⼀个微博表,content 字段依赖 wb_id,⽽不依赖主键 user_id
在这里插入图片描述

第三范式(3NF)

第三范式要求所有⾮主键属性都只和主键有相关性,⽽⾮主键属性之间应该是独⽴⽆关的。
更通俗⼀点讲,⾮主键列必须直接依赖于主键,不能存在传递依赖。即不能存在: ⾮主键列 A 依赖于⾮主键列 B,⾮主键列 B 依赖于主键的情况。

第三范式(3NF)是第⼆范式(2NF)的⼀个⼦集,即满⾜第三范式(3NF)必须满⾜第⼆范式(2NF)

关键点: 消除传递依赖 (⾮主字段不依赖于其它⾮主字段)

错误范例:
⼀个订单表,总价字段 total 依赖另外两个字段,所以应该去掉
在这里插入图片描述

反范式

反范式是试图通过增加冗余数据或通过分组数据来优化数据库读取性能的过程。在某些情况下,反范式是解决数据库性能和可伸缩性的极佳策略。

范式化的设计是在不同的有关系的表中存储不同的信息,如果需要查询信息往往需要连接多个表,如果连接的表很多,将会导致很多随机I/O,那么查询可能会⾮常慢。

⼀种做法是反范式的数据表设计。由于多了冗余数据,因此数据的⼀致性需要靠数据库约束或应⽤程序来保证。传统商业数据库⼀般通过施加数据库约束来确保数据的⼀致性,⽽互联⽹数据库⼀般靠应⽤程序来确保数据的⼀致性。

例如,在微博表中,除了增加作者 id 外,还可以把作者姓名同时加进来。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!