数据库设计反范式.pdf
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
数据库设计反范式 1.范式 1.1 1NF-3NF 定义 1NF确保原⼦性(Atomicity)原⼦性的粒度、原⼦性的价值(1范式:单值,并且把值当做单值⽤,建议不要把值 拆开) 2NF检查对键的完全依赖价值在在于控制数据冗余和查询性能 3NF检查属性的独⽴性 规范化的价值合理规范化的模型可应对需求变 更 规范化数据重复降⾄最少 为什么要有三范式? 不会发⽣插⼊(insert)、删除(delete)和更新(update)操作异常。 控制数据冗余和提⾼查询性能 更好的进⾏数据有效性 检查,提⾼存储效率。 范式的满⾜便于数据⼀致性的控制 如何控制冗余? 使⽤三范式 缺点 范式化的表,在查询的时候经常需要很多的关联,因为单独⼀个表内不存在冗余和重复数据。这导致多次的关联,增加查询代价 可能 使⼀些索引策略⽆效。因为范式化将列存放在不同的表中,⽽这些列在⼀个表中本可以属于同⼀个索引。 1.2 反范式(逆范式)打破范式 定义,为什么要有反范式? 等级越⾼的范式设计出来的表越多,可能会增加查询所需时间。当我们的业务所涉及 的表⾮常多,经常会有多表连接,并且我们对表的操作要时间上要尽量的快,这时可以考虑我们使⽤"反范式"。 反范式⽤空间来换取时 间,引⼊受控的数据冗余,当查询时可以减少或者是避免表之间的关联 优点 可以避免关联,因为所有的数据⼏乎都可以在⼀张表上显⽰; 可以设计有效的索引; 缺点 提⾼了对数据冗余的维护,为了保证数据的⼀ 致性(可以⽤触发器来解决这个问题,某个表被修改后触发另⼀个表的更新) 反范式的7种模式,并举例。 ⼀对⼀:合并表 如果双⽅都是完全参与,那么某个表直接可以作为另⼀张表的属性直接合并。若有⼀⽅是 部分参与,把完全参与的并⼊部分参与的会出现空值,将部分参与并⼊完全参与的可以。若双⽅都是部分参与,⼀定会出现空值,这样就很 难确定主键 例⼦:员⼯表(员⼯编号,姓名,住址,薪⽔,科室编号) 亲属表(员⼯编号,亲属姓名,亲属电话),其中亲属表中只登记⼀位亲 属,如果要查询张三的亲属的电话,就要连接两张表,所以将两张表合并以减少连接。 ⼀对多:复制⾮关键字以减少连接 适⽤条件:当两张表连接时,最主要的事务都与某个⾮键值相关 例⼦:两个表(⽤户id,好友id)和(⽤户 id,⽤户昵称,⽤户邮箱,联系电话)符合3NF,如果需查询某个⽤户的好友(昵称)名单,此时需对2个表进⾏连接查询,可以把第⼀个表修改成(⽤户 id,好友id,好友昵称)这样只需要查询第⼀个表就可获取所有好友昵称. ⼀对多:复制关键字以减少连接 复制⼀对多关系中的外键,使需要通过第三张表连接的两张表直接关连在⼀起 在⼀对多的关系中,将另 ⼀实体表的主键复制到多的实体表当外键,减少join表的数量 例⼦:每个部门租了⼀些录像带,每盘录像带是有租赁协议的。这样有三张表:部门(部门编号),租的录像(录像带编号,部门编号),租赁 协议,见下图关系表 \ 多对多:关系⾥⾯复制值以减少连接 引⼊⼀张新表,多对多被拆成两个⼀对多(满⾜3NF)。 假设要查询,演员演了哪些电影,为了避免 三张表连接,就在role表中复制电影名称以减少连接 \ 引⼊重复组 引⼊重复组,重复组⼀般不超过10个 (对于⼀个多值属性,如果多值的数量不多⼩于等于10) 例⼦:customer 可能有多个 address。⼀般是customer⼀张表,address⼀张表,address中存储它对应的customer的ID那么每次付款的时候,需要再查找address 表来得到customer的所有地址。可以在customer后⾯加addr1、addr2字段,但不知道要加多少个,不好。较为常见的做法是,在 customer表中引⼊⼀条addr字段,放最常⽤地址,address表中存储所有地址。 提取表 extract table的表中内容和原表可能都相同,只是组织结构不同,有可能⼀个是为了查询⽽建的表(将经常被查询的数据提前计算 出来存⼊该表,会有⼤量冗余,但是提⾼效率),另⼀个是为了update的,⼀定程度上实现了读写分离。 ⽐如有学⽣表,宿舍表,为了查学 ⽣的住宿费,需要连接两表。此时可以提取出⼀张⽤于查询的表,其中包含了学⽣姓名,住宿费⽤以及其他字段,⽅便查询。 使⽤分区表 可以将表分解成更少的分区。 ⽔平分区:跨多个(较⼩)的表分配记录。这种形式分区是对表的⾏进⾏分区,通过这样的⽅式 不同分组⾥⾯的物理列分割的数据集得以组合,从⽽进⾏个体分割(单分区)或集体分割(1个或多个分区)。所有在表中定义的列在每个数据集 中都能找到,所以表的特性依然得以保持。 例⼦:⼀个包含⼗年发票记录的表可以被分区为⼗个不同的分区,每个分区包含的是其中⼀年 的记录。 垂直分区:跨多个(较⼩)表分布列。 PK复制,以便重建。
- 粉丝: 83
- 资源: 9357
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助