【干货】浅谈分布式数据库中间件之分库分表——中间件小哥
https://segmentfault.com/a/1190000015627336
DDM——Distributed DataBase Middleware(分布式数据库中间件)
分库分表,顾名思义分库就是把原本存储于一个库的数据分块存储到多个库上,分表把原本存储于一个表的数据分块存储到多个表上。
关于分库分表,我们将从什么是数据分片及如何进行分片两方面对DDM分库分表做一个阐释。
什么是数据分片?
分片是解决数据库存储容量限制的直接途径。
分片包括垂直分片与水平分片两种方式。
垂直分片:
垂直分片又叫纵向分割,即以逻辑表为单位,把原有数据库切分成多个数据库。切分后不同的表存储在不同的数据库上。
垂直分片与业务架构设计有密切的联系。比如从业务领域对系统进行架构优化,分成多个子业务系统,各个子业务系统耦合度较低。子业务系统间以接口方式进行数据通信和数据交换。
垂直拆分后业务清晰,拆分规则明确,系统之间容易整合与扩展。一般用于数据库上层架构设计。

可以看到垂直分片后各个模块之间直接独立,简洁清晰明了,各个模块之间几乎没有不必要的关联,对于开发工作的开展与推进具有积极的作用。
水平分片:
水平分片又叫横向分割,即以逻辑表中的数据行记录为单位,把原有逻辑数据库切分成多个物理数据库分片,表数据记录分布存储在各个分片上。
水平分片主要用业务架构无法继续细分,而数据库中单张表数据量太大,查询性能下降的场景。通过水平分片,即解决单库容量问题,同时提高并发查询性能。

如何进行分片:
首先最重要的就是分片的原则,这是分片的规则与最终的验证正确性的基准。
主要分为三个点:
完备性
如果全局关系 R 划分为片段 R1,R2....Rn ,则对于R中任意数据项d(d属于R),一定存在于d属于Ri (1<=i<=n)
可重构性
所有片段必须可以重新构成全局数据
不相交性
划分的各片段所包含的数据的交集为空
水平分片的例题:
1.设有雇员关系 EMP{ENO,ENAME,SALARY,DNO},其中,ENO为雇员编号,ENAME为雇员姓名,SALARY为雇员工资,DNO为雇员所在的部门的部门编号,其中元组如下。
| ENO | ENAME | SALARY | DNO |
| 001 | 张三 | 1500 | 201 |
| 002 | 李四 | 1400 | 202 |
| 003 | 王五 | 800 | 203 |
按下面分片条件进行分段:
E1:满足(DNO=201)的所有元组
E2:满足(DNO=202)的所有元组
E3:满足(DNO<>201 AND DNO<>202) (其中<>在书写时应该接上了,其表示的意思就是非的意思)
从上面的分片可知,将关系EMP分成了三个子关系,按照部门号进行了分割。
故分片属性为:部门编号DNO
分片条件为:
E1: DNO=201
E2: DNO=202
E3: DNO<>201 AND DNO<>202
各关系的内容为:
E1:
| 001 | 张三 | 1500 | 201 |
E2:
| 002 | 李四 | 1400 | 202 |
E3:
| 003 | 王五 | 800 | 203 |
根据水平分片定义,满足:
1)E1 E2 E3与EMP具有相同的关系模式
2)E1∪E2∪E3=EMP
3)E1∩E2=空 E1∩E3=空 E2∩E3=空
因此,E1 E2 E3是EMP的水平分片。
注意:! 若一个关系的分片不是基于关系本身的属性 ,而是根据另一个与其具有关联关系的属性来划分,这种划分称作:导出水平划分。
2.设有雇员关系 EMP{ENO,ENAME,SALARY,DNO}和关系WORKS{ENO,PRJNO,HOURS},ENO为雇员编号,PRJNO为雇员参与的项目编号,HOURS为雇员参与项目的小时数,两个元组如下:
EMP元组
| ENO | ENAME | SALARY | DNO |
| 001 | 张三 | 1500 | 201 |
| 002 | 李四 | 1400 | 202 |
| 003 | 王五 | 800 | 203 |
WORKS元组
| ENO | PRJNO | HOURS |
| 001 | 1 | 240 |
| 002 | 1 | 480 |
| 003 | 2 | 300 |
要求:将WORKS按DNO进行水平分片,得到的导出水平分片为 W1 W2 W3
W1:满足(DNO=201)的所有元组
W2:满足(DNO=202)的所有元组
W3:满足(DNO<>201 AND DNO<>202)
则分片条件同EMP的水平分片条件
分片属性:部门的编号DNO
分片条件:
W1: DNO=201
W2: DNO=202
W3: DNO<>201 AND DNO<>202
各子关系的内容是:
W1:
| 001 | 1 | 240 |
W2:
| 002 | 1 | 480 |
W3:
| 003 | 2 | 300 |
根据水平分片定义,满足:
1)W1 W2 W3与EMP具有相同的关系模式
2)W1∪W2∪W3=EMP
3)W1∩W2=空 W1∩W3=空 W2∩W3=空
因此,W1 W2 W3是WORKS的水平分片。
垂直分片的例题:
垂直分片的条件:
1)Attr(R1)∪Attr(R2)∪........Attr(Rn)=Attr(R)
2){R1,R2,R3......Rn}是关系R的无损分解
3)Attr(R1)∩Attr(R2)∩Attr(R3)∩........∩Attr(Rn)=主键
1.设有雇员关系 EMP{ENO,ENAME,BIRTH,SALARY,DNO},其中,ENO为雇员编号,ENAME为雇员姓名,BIRTH为雇员出生日期,SALARY为雇员工资,DNO为雇员所在的部门的部门编号,其中元组如下。
| ENO | ENAME | BIRTH | SALARY | DNO |
| 001 | 张三 | 1960.5.2 | 1500 | 201 |
| 002 | 李四 | 1957.3.5 | 1400 | 202 |
| 003 | 王五 | 1985.2.4 | 800 | 203 |
假设存在 E1{ENO,ENAME,BIRTH} 和 E2{ENO,SALARY,DNO} ,则E1和E2中元组分别是:
E1
| ENO | ENAME | BIRTH |
| 001 | 张三 | 1960.5.2 |
| 002 | 李四 | 1957.3.5 |
| 003 | 王五 | 1985.2.4 |
E2:
| ENO | SALARY | DNO |
| 001 | 1500 | 201 |
| 002 | 1400 | 202 |
| 003 | 1200 | 203 |
根据垂直分片条件可知:
1)E1和E2是EMP的无损分解
2)E1∪E2=EMP
3)E1∩ E2={ENO}
因此,满足垂直分片条件,故E1和E2是EMP的垂直分片。
混合分片:就是既包含水平分片又包含垂直分片
简单谓词与小项谓词:
查询谓词 分出 简单谓词和小项谓词
简单谓词:只含有一个操作符号的查询谓词成为简单谓词
比如 "DNO=201"和"SALARY>1000"为简单谓词
小项谓词:有多个简单谓词组成的查询谓词称为小项谓词
比如:"DNO=201 ^ SALARY>1000"为小项谓词




