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)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...
随机推荐
- pycharm设置主题
步骤很简单: 1.下载皮肤主题(jar) 去 http://www.themesmap.com/ 选择自己喜欢的主题下载 2.导入皮肤主题 导入方法:file–>Import Setting–& ...
- ☆ [HNOI2012] 永无乡 「平衡树启发式合并」
题目类型:平衡树启发式合并 传送门:>Here< 题意:节点可以连边(不能断边),询问任意两个节点的连通性与一个连通块中排名第\(k\)的节点 解题思路 如果不需要询问排名,那么并查集即可 ...
- java编译过程(字节码编译和即时编译)
Javac编译与JIT编译 简介: 编译包括两种情况: 1,源码编译成字节码 2,字节码编译成本地机器码(符合本地系统专属的指令) 解释执行也包括两种情况: 1,源码解释执行 2,字节码解释执行 解释 ...
- [https]公司导入自签名证书实现https监控
https://www.v2ex.com/t/143012
- 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers (数位dp)
题目链接:https://ac.nowcoder.com/acm/contest/163/J 题目大意:给定一个数N,求区间[1,N]中满足可以整除它各个数位之和的数的个数.(1 ≤ N ≤ 1012 ...
- EM算法(Expectation Maximization Algorithm)初探
1. 通过一个简单的例子直观上理解EM的核心思想 0x1: 问题背景 假设现在有两枚硬币Coin_a和Coin_b,随机抛掷后正面朝上/反面朝上的概率分别是 Coin_a:P1:-P1 Coin_b: ...
- kubernetes云平台管理实战: 服务发现和负载均衡(五)
一.rc控制器常用命令 1.rc控制器信息查看 [root@k8s-master ~]# kubectl get replicationcontroller NAME DESIRED CURRENT ...
- Fiddler--Filters
本篇主要介绍Fiddler中Filters(过滤器)选项功能. 先看看Filters的界面: 一.模块一 当勾选“Use Filters”,Filters才开始工作:否则Filters中的设置内容将无 ...
- Git上传文件容量大小限制
使用Git LFS突破git的100M容量限制. 1.安装Git LFS https://git-lfs.github.com./ 2.安装后把里面的git-lfs.exe放到你要上传的项目文件夹 3 ...
- 关于stm32的数据类型
常见的uint16_t.uint32_t.u8.u16等 定义在stm32f10x.h文件中,这个文件是定义相关数据类型和结构体的头文件.