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)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...
随机推荐
- 第六十六天 js操作高级
1.对象使用的高级 对象的key为字符类型,value为任意类型 var obj ={ name:"name", "person-age":18 } // 访问 ...
- JS异常
当 JavaScript 引擎执行 JavaScript 代码时,会发生各种错误. 可能是语法错误,通常是程序员造成的编码错误或错别字. 可能是拼写错误或语言中缺少的功能(可能由于浏览器差异). 可能 ...
- 机器学习---线性回归(Machine Learning Linear Regression)
线性回归是机器学习中最基础的模型,掌握了线性回归模型,有利于以后更容易地理解其它复杂的模型. 线性回归看似简单,但是其中包含了线性代数,微积分,概率等诸多方面的知识.让我们先从最简单的形式开始. 一元 ...
- 皮尔逊相关系数(Pearson Correlation Coefficient, Pearson's r)
Pearson's r,称为皮尔逊相关系数(Pearson correlation coefficient),用来反映两个随机变量之间的线性相关程度. 用于总体(population)时记作ρ (rh ...
- Django 分页组件替换自定义分页
Django的分页器(paginator) 总之不太好用我们还是用自己的好一些 自定义分页器 分页实现源码 """ 自定义分页组件 """ ...
- 51nod 1318 最大公约数与最小公倍数方程组(2-SAT)
题意 给你 \(n\) 个元素,\(m\) 个方程. 每个方程形如 \[ \begin{align} \gcd(x_i, y_i)=c_i\\ \mathrm{lcm}(x_i,y_i) = d_i ...
- 绕过阿里云waf进行SQL注入
做个笔记吧,某SQL注入点的绕过,有阿里云waf的. 首先遇到是个搜索框的注入点: 演示下: 针对搜索框,我们的sql语句一般是怎么写的? 本地演示:select * from product whe ...
- 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建三:配置spring并测试
这一部分的主要目的是 配置spring-service.xml 也就是配置spring 并测试service层 是否配置成功 用IntelliJ IDEA 开发Spring+SpringMVC+M ...
- 基于alpine制作php镜像
alpine包搜索https://pkgs.alpinelinux.org/ 安装依赖库 apk add --no-cache xxx 可以基于php apline镜像自行增加或删除扩展. https ...
- LFYZ-OJ ID: 1028 背包问题
背包问题 题目描述 简单的背包问题.设有一个背包,可以放入的重量为s.现有n件物品,重量分别为w1,w2-,wn,(1≤i≤n)均为正整数,从n件物品中挑选若干件,使得放入背包的重量之和正好为s.找到 ...