Normalization/Denormalization
范式化设计
Normalization 概念
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
Normalization 优点
- 节省存储空间,并减少不必要的更新
Normalization 缺点
- 查询缓慢:⼀个完全范式化设计的数据库会经常⾯面临“查询缓慢”的问题,因为数据库越范式化,就需要 Join 越多的表
几种范式
- 第一范式:1NF(First Normal Form)
消除非主属性对键的部分函数依赖
- 第二范式:2NF(Second Normal Form)
消除非主要属性对键的传递函数依赖
- 第三范式:3NF(Third Normal Form)
消除主属性对键的传递函数依赖
- BC 范式:BCNF(Boyce-Codd Normal Form)
主属性不依赖于主属性
反范式化设计
Denormalization 概念
数据“Flattening”,不使用关联关系,⽽而是在文档中保存冗余的数据拷贝
Denormalization 优点
- 读取性能好,查询快,无需 join 操作
Denormalization 缺点
- 浪费空间
- 一条数据的改动,可能会引起很多数据的更新
小结
- 关系型数据库一般优先考虑范式化设计
- 非关系型数据库一般优先考虑反范式化设计
- 范式化设计节省了存储空间,但是存储空间却越来越便宜;范式化简化了更新,但是数据“读”取操作可能更多
- 反范式化设计数据库会通过压缩尽量减少空间占用,如 Elasticsearch 通过压缩 _source 字段,减少磁盘空间的开销
数据库事务
事务的概念
数据库事务(Database Transaction,简称“事务”)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。这个过程中的所有操作要么都成功,要么都不成功。
ACID
ACID 是事务的四个特性,指的是 atomicity,原子性;consistency,一致性;isolation,隔离性;durability,持久性。
原子性(Atomicity)
指所有在事务中的操作要么都成功,要么都不成功,所有的操作都不可分割,没有中间状态。一旦某一步执行失败,就会全部回滚到初始状态。
一致性(Consistency)
指的是逻辑上的一致性,即所有操作是符合现实当中的期望的。具体参考下一节
隔离性(Isolation)
即不同事务之间的相互影响和隔离的程度。比如,不同的隔离级别,事务的并发程度也不同,最强的隔离状态是所有的事务都是串行化的(serializable)(即一个事务完成之后才能进行下一个事务),这样并发性也会降到最低,在保证了强一致性的情况下,性能也会受很大影响,所以在实际工程当中,往往会折中一下。
持久性(Durability)
可以简单地理解为事务执行完毕后数据不可逆并持久化存储于存储系统当中
CAP
CAP 理论主要是针对分布式存储系统的,C 是指 Consistency 一致性,A 是指 Availability 可用性,P 是指 Partition tolerance 分区容忍性。CAP 定理认为分布式系统中这三个特性最多只能同时满足两个特性。
一致性(Consistency)
指在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
可用性(Availability)
在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
分区容忍性(Partition tolerance)
即当节点之间无法正常通信时,就产生了分区,而分区产生后,依然能够保证服务可用,那么我们就说系统是分区容忍的。显然如果节点越多,且备份越多,分区容忍度就越高(因为即便是其中一个或多个节点挂了,仍然有其它节点和备份可用)。
理解一致性(此 C 非 彼 C)
实际上我们通常说的数据库事务的一致性和分布式系统的一致性并不是一个概念。这里可以区分成“内部一致性”和“外部一致性”。“内部一致性”搞数据库的人很少这么说,一般就直接说一致性,更准确的说是“Consistency in ACID”(“事务 ACID 属性中的一致性”);“外部一致性”是针对分布式系统而言的,分布式领域提及的 Consistency 表示系统的正确性模型,著名的也是臭名昭著的 CAP 理论中的 C 就是这个范畴的。这主要是由于分布式系统写入和读取都可能不在同一台机器上,而这必然会有一段时间导致不同机器上所存的数据不一致的情况,这就是所谓的“不一致时间窗口”。
Microsoft Access
- 在安装 32 位 access 的机器上安装 64 位的 access 驱动,会报兼容性错误,解决方案如下:(摘自这里)
1、使用 "/passive" 命令来安装,例如 "C:\directory path\AccessDatabaseEngine_x64.exe" /passive
2、安装完成后,查看注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Common\FilesPaths,删除 mso.dll
内容声明
本文是 walker 根据网络内容整理,包括但不限于以下文章
- 范式化与反范式化主要摘自:阮一鸣《Elasticsearch 核心技术与实战》第 49 课·对象及 Nested 对象
- ACID 与 CAP 的内容主要摘自:理解数据库的事务,ACID,CAP 和一致性
相关阅读
- ACID 和 CAP 的详尽比较
- NoSQL 的四大类型
- 数据库排名:DB-Engines Ranking