SQL反模式学习笔记9 元数据分裂
目标:支持可扩展性。优化数据库的结构来提升查询的性能以及支持表的平滑扩展。
反模式:克隆表与克隆列
1、将一张很长的表拆分成多张较小的表,使用表中某一个特定的数据字段来给这些拆分出来的表命名。
2、将一个列拆分成多个之列,使用别的列中的不同值给拆分出来的列命名。
为了达到减少每张表记录数的目的,你不得不创建一些有很多列的表,或者创建很多很多表。但是在2个方案中,
你会发现随着数据量的增长,会有越来越多的表或者列。
缺点:(1)不断产生新的表。要将数据拆分到不同的表中,需要一个规则来定义哪些数据属于哪些表。
(2)管理数据完整性(不同的表定义不同的约束)。
(3)同步数据时,需要多个操作步骤。
(4)确保唯一性:需要确保所有被分隔出来的表中的主键都是唯一的。如果你需要从一张表中移动一条记录到令一张表中,
需要保证被移动记录的主键值不会和目标表中的主键记录冲突。
(主键如果是自增长的Int类型,则很难保证Id一致;如果是Guid类型,则容易控制)。
(5)跨表查询:时间时间的增长,创建了越来越多的表,就需要不断的更新程序代码来引入这些新创建的表。
(6)同步元数据:如果将表进行了拆分,当新增加一个列的数据,需要再所有的表中增加这个新的列。
(7)管理引用完整性:分隔表及时作为一张关联表而不是父表,也可能引起一些问题。
(8)标识元数据分裂列:列也可能根据元数据分类。可以创建一个含有很多列的表,这些列安装他们的类别扩展。
如何识别反模式:当出现以下情况时,可能是反模式
1、我们需要每……创建一张表或者列?
2、数据库支持的最大数量的表或者列是多少?
3、发现程序添加记录失败了:因为王佳伟新的一年添加新表了
4、如何查询很多张表?每张表的列都是一样的。
【如果你需要查询很多结构一样的表,就应该讲数据全部存储在一个表中,使用一个额外的属性列来分组数据】
5、如何将表名称作为一个表里传递?在查询是需要根据辩分动态的生成这些表名称。
合理使用反模式:
手动分隔表的一个合理使用场景是“归档数据”-----将历史数据从日常使用的数据库中移除。
通常在过期数据的查询变的非常稀少的情况下,才会进行如此的操作。
如果你没有时间同时查询当前数据和历史数据的需求,将老数据从当前活动的表转移到其他地方是很合适的操作。
将数据归档到与当前表结构相兼容的新表中,既能支持偶尔做数据分析时的查询,同时能让日常数据查询边的非常高效。
【 备份并回复一个中等规模的数据库比操作一个存储着TB级数据的数据库要方便得多。
尽管将数据对象模型化并将整个对象中的所有东西映射到一个单独的数据库中的做法没有错,但是合理地将大小超过
临界值的数据库拆分开能简化数据库管理的工作。
】
解决方案:分区并标准化
当一张表的数据量变的非常巨大是,除了手动拆分这张表,可以使用水平分区、垂直分区以及使用关联表来提升查询性能。
1、水平分区(或者叫分片):根据数据行来对表进行拆分。同时不用担心那些分隔表所带来的缺陷。
仅需要定义一些规则来拆分一张逻辑表,数据库会为你管理余下所有的工作。
物理上来说,表的确的被拆分了,但你依旧可以向查询单一表那样执行SQL查询语句。
2、垂直分区:当某些列非常庞大或者很少使用的时候,对表进行按列拆分会比较有优势。
Blob类型与Text类型的列大小是可变的,可能非常大。为了提高存储于查询性能,这些数据库会自动地将
这些类型的列和表中的其他列分开进行存储。如果进行一个不包含Blob类型与Text类型的查询,就可以
更高效的获取其他的列,查询性能有所提高。
3、解决元数据分裂列:创建关联表
结论:别让数据繁衍元数据。
SQL反模式,系列学习汇总
18、SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题
SQL反模式学习笔记9 元数据分裂的更多相关文章
- SQL反模式学习笔记1 开篇
什么是“反模式” 反模式是一种试图解决问题的方法,但通常会同时引发别的问题. 反模式分类 (1)逻辑数据库设计反模式 在开始编码之前,需要决定数据库中存储什么信息以及最佳的数据组织方式和内在关联方式. ...
- SQL反模式学习笔记5 外键约束【不用钥匙的入口】
目标:简化数据库架构 一些开发人员不推荐使用引用完整性约束,可能不使用外键的原因有一下几点: 1.数据更新有可能和约束冲突: 2.当前的数据库设计如此灵活,以至于不支持引用完整性约束: 3.数据库为外 ...
- SQL反模式学习笔记3 单纯的树
2014-10-11 在树形结构中,实例被称为节点.每个节点都有多个子节点与一个父节点. 最上层的节点叫做根(root)节点,它没有父节点. 最底层的没有子节点的节点叫做叶(leaf). 中间的节点简 ...
- SQL反模式学习笔记2 乱穿马路
程序员通常使用逗号分隔的列表来避免在多对多的关系中创建交叉表, 将这种设计方式定义为一种反模式,称为“乱穿马路”. 目标: 存储多属性值,即多对一 反模式:将多个值以格式化的逗号分隔存储在一个字段中 ...
- SQL反模式学习笔记4 建立主键规范【需要ID】
目标:建立主键规范 反模式:每个数据库中的表都需要一个伪主键Id 在表中,需要引入一个对于表的域模型无意义的新列来存储一个伪值,这一列被用作这张表的主键, 从而通过它来确定表中的一条记录,即便其他的列 ...
- SQL反模式学习笔记6 支持可变属性【实体-属性-值】
目标:支持可变属性 反模式:使用泛型属性表.这种设计成为实体-属性-值(EAV),也可叫做开放架构.名-值对. 优点:通过增加一张额外的表,可以有以下好处 (1)表中的列很少: (2)新增属性时,不需 ...
- SQL反模式学习笔记7 多态关联
目标:引用多个父表 反模式:使用多用途外键.这种设计也叫做多态关联,或者杂乱关联. 多态关联和EAV有着相似的特征:元数据对象的名字是存储在字符串中的. 在多态关联中,父表的名字是存储在Issue_T ...
- SQL反模式学习笔记8 多列属性
目标:存储多值属性 反模式:创建多个列.比如一个人具有多个电话号码.座机号码.手机号码等. 1.查询:多个列的话,查询时可能不得不用IN,或者多个OR: 2.添加.删除时确保唯一性.判断是否有值:这些 ...
- SQL反模式学习笔记10 取整错误
目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...
随机推荐
- vue中@contextmenu在pc和mac中的区别
项目中有用到右键菜单,故用了@contextmenu,由于本人是用的PC电脑,所以一切正常, 但是有同事用mac测试了一下,问题随之而来,MAC上右键按下就触发了, PC上面是鼠标抬起才会触发,所以这 ...
- 【ARC101F】Robots and Exits 树状数组
题目大意 有 \(n\) 个机器人和 \(m\) 个出口. 这 \(n\) 个机器人的初始位置是 \(a_1,a_2,\ldots,a_n\),这 \(m\) 个出口的位置是 \(b_1,b_2,\l ...
- zabbix误报交换机重启
交换机的sysUpTime是由一个32-bit的counter来计数的,单位是0.01秒,所以最大时间为496天,过了496天就溢出,变成0,然后又重新计算时间,所以zabbix误报. snmpwal ...
- Souvenir Shop 解题报告
Souvenir Shop 魔幻题目,这谁搞得到啊... 考场上完全sb了写了个线段树合并,想必我是个复杂度分析都没学过的入门级选手 发现这个网格图dag它的出度最多只有2 如果按照先走朝上的一条边进 ...
- wiki
GRANT ALL PRIVILEGES ON confluence.* TO 'confluence'@'localhost' IDENTIFIED BY '%SaRK%TDpU#CyT6i';
- hdu 1848 简单SG函数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1848 Problem Description 任何一个大学生对菲波那契数列(Fibonacci num ...
- java String转int int转化为String
String转int String str = "123"; int a = Integer.parseInt(str); System.out.println(a); Integ ...
- 全基因组关联分析(GWAS)扫不出信号怎么办(文献解读)
假如你的GWAS结果出现如下图的时候,怎么办呢?GWAS没有如预期般的扫出完美的显著信号,也就没法继续发挥后续研究的套路了. 最近,nature发表了一篇文献“Common genetic varia ...
- elk插件以及分词器安装
ElasticSearch-Head 安装配置因为安装 ElasticSearch-Head 需要使用到 npm 包管理器,所以需要我们提前安装好 NodeJS ,安装 NodeJS 的方法可以参考: ...
- 金融量化分析【day112】:均值回归策略
一.均值回归策略 1.什么是回归策略 二.归一标准化 import numpy as np a = np.random.uniform(100,5000,1000) b = np.random.uni ...