`
lirig
  • 浏览: 235440 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

数据库的垂直划分和水平划分

阅读更多


数据库的水平划分和垂直划分很早以前就接触了,只是没有实践,没有什么体会,只有最近两年才有接触,今天也和大家聊聊。


垂直划分 


按照功能划分,把数据分别放到不同的数据库和服务器。


当一个网站开始刚刚创建时,可能只是考虑一天只有几十或者几百个人访问,数据库可能就个db,所有表都放一起,一台普通的服务器可能就够了,而且开发人员也非常高兴,而且信心十足,因为所有的表都在一个库中,这样查询语句就可以随便关联了,多美的一件事情。但是随着访问压力的增加,读写操作不断增加,数据库的压力绝对越来越大,可能接近极限,这时可能人们想到增加从服务器,做什么集群之类的,可是问题又来了,数据量也快速增长。


这时可以考虑对读写操作进行分离,按照业务把不同的数据放到不同的库中。其实在一个大型而且臃肿的数据库中表和表之间的数据很多是没有关系的,或者更加不需要(join)操作,理论上就应该把他们分别放到不同的服务器。例如用户的收藏夹的数据和博客的数据库就可以放到两个独立的服务器。这个就叫垂直划分(其实叫什么不重要)。


当博客或者收藏夹的数据不断增加后,应该怎么办,这样就引出了另外一个做法,叫水平划分。

 

水平划分

 

则把一个表的数据划分到不同的数据库,两个数据库的表结构一样。怎么划分,应该根据一定的规则,可以根据数据的产生者来做引导,上面的数据是由人产生的,可以根据人的id来划分数据库。然后再根据一定的规则,先获知数据在哪个数据库。

其实很多大型网站都经历了数据库垂直划分和水平的划分的阶段。其实这个可以根据经验来确定,不一定由某些硬性的规则。

以刚才的博客为例,数据可以根据userid的奇偶来确定数据的划分。把id为基数的放到A库,为偶数的放B库。




 


这样通过userId就可以知道用户的博客的数据在哪个数据库。其实可以根据userId%10来处理。还可以根据著名的HASH算法来处理。

 

当初看手机之家的架构是发现他们是:

水平切分:对数据进行水平分割。

a.最好分到同一个数据库。

b.一种已经证明是切实可行的方案:主表+辅表。

c.有3种类型:主表不打散、主表打散无辅表、主表打散有辅表。

d.但对程序员来说,TA看到的只是一张表,不妨称之为虚表(逻辑表)? ,这张虚表实际上可能是由N张实表(物理表)组成的。

 

哈哈,我还是喜欢把数据分到不同的数据库,这个可以按照业务来和环境来定吧。

 

在说句题外话,如果是大型数据库,还可以做读写分离等。
 

 

  • 大小: 21 KB
  • 大小: 8.9 KB
23
2
分享到:
评论
21 楼 lirig 2012-11-14  
zyz251314 写道
soleghost 写道
垂直分库-->水平分库-->读写分离

垂直分库:按照业务垂直划分。比如:可以按照业务分为资金、会员、订单三个数据库。需要解决的问题:跨数据库的事务、jion查询等问题。
水平分库:按照规则划分,一般水平分库是在垂直分库之后的。比如每天处理的订单数量是海量的,可以按照一定的规则水平划分。需要解决的问题:数据路由、组装。
读写分离:对于时效性不高的数据,可以通过读写分离缓解数据库压力。需要解决的问题:在业务上区分哪些业务上是允许一定时间延迟的,以及数据同步问题。



我首先想问下   当垂直划分的时候   我的订单数据里面关联了会员信息,当页面要显示会员信息该怎么办?  我是应该在订单数据库里面做数据冗余还是关联查询,或者还有其他什么更好的方式呢?

不会关联查询,一般会员信息会写到缓存中。或者一次性查询多个
20 楼 zyz251314 2012-11-10  
soleghost 写道
垂直分库-->水平分库-->读写分离

垂直分库:按照业务垂直划分。比如:可以按照业务分为资金、会员、订单三个数据库。需要解决的问题:跨数据库的事务、jion查询等问题。
水平分库:按照规则划分,一般水平分库是在垂直分库之后的。比如每天处理的订单数量是海量的,可以按照一定的规则水平划分。需要解决的问题:数据路由、组装。
读写分离:对于时效性不高的数据,可以通过读写分离缓解数据库压力。需要解决的问题:在业务上区分哪些业务上是允许一定时间延迟的,以及数据同步问题。



我首先想问下   当垂直划分的时候   我的订单数据里面关联了会员信息,当页面要显示会员信息该怎么办?  我是应该在订单数据库里面做数据冗余还是关联查询,或者还有其他什么更好的方式呢?
19 楼 soleghost 2010-04-07  
垂直分库-->水平分库-->读写分离

垂直分库:按照业务垂直划分。比如:可以按照业务分为资金、会员、订单三个数据库。需要解决的问题:跨数据库的事务、jion查询等问题。
水平分库:按照规则划分,一般水平分库是在垂直分库之后的。比如每天处理的订单数量是海量的,可以按照一定的规则水平划分。需要解决的问题:数据路由、组装。
读写分离:对于时效性不高的数据,可以通过读写分离缓解数据库压力。需要解决的问题:在业务上区分哪些业务上是允许一定时间延迟的,以及数据同步问题。
18 楼 jd2bs 2010-04-07  
对于报表需求的话 仅用垂直划分就很杯具了

很多应用 刚开始几年没人关心报表 后来提出来的概率还是挺大的

这种情况一般 要用到专门的report DB
数据由后台job 异步生产

17 楼 mercyblitz 2010-04-05  
javafan_303 写道
想问下,数据库的水平切分和数据库的分区有什么不同?我怎么感觉分区就是实现的水平切分的功能啊~~

分区类似,分区是数据库实现的,技术性的。水平分库是策略性的。
16 楼 mercyblitz 2010-04-05  
hongkong 写道
水平划分,比如100W条记录的数据表,按规则命名成不同的表(放在同一数据库)
以减少数据量,是这样吧。
分到不同的库感觉没什么必要

有必要,数据库可放置在不同的存储媒介,这样,单点的IO就减少了。
15 楼 mercyblitz 2010-04-05  
banfry 写道
假如客户信息水平分布在不同的库中,那在统计客户总数、模糊查询客户的时候怎么处理呢?


分页查找。类似这种客户总数的统计信息一致性要求不是那个强,因此可以离线查询或者单独保存。
14 楼 hell_liul 2010-04-05  
我有个疑问哈?就是如果采用集群,为什么数据量就会增长呢?
13 楼 seu_yong 2010-04-04  
感觉垂直划分还好,毕竟是不同的业务数据。但是水平划分的话,一旦确定划分依据之后,经常出现划分规则只能满足绝大部分的业务需求,但是还是会有些业务功能无法很方便的实现,所需的数据可能分步在所有分表上,通过数据聚合的方式实现又有性能上的问题,特别是那种分页查询。请教下老大是否也会遇到这种问题?是否有比较好的解决方案啊?
12 楼 javafan_303 2010-04-02  
想问下,数据库的水平切分和数据库的分区有什么不同?我怎么感觉分区就是实现的水平切分的功能啊~~
11 楼 lirig 2010-03-31  
banfry 写道
假如客户信息水平分布在不同的库中,那在统计客户总数、模糊查询客户的时候怎么处理呢?

水平划分的数据的规则要根据客户来划分。可以邮件或者QQ我:814562275
10 楼 banfry 2010-03-31  
假如客户信息水平分布在不同的库中,那在统计客户总数、模糊查询客户的时候怎么处理呢?
9 楼 lirig 2010-03-29  
hongkong 写道
水平划分,比如100W条记录的数据表,按规则命名成不同的表(放在同一数据库)
以减少数据量,是这样吧。
分到不同的库感觉没什么必要


应该是这样的:一个业务数据库中其中有些表的数据到达几十个亿后,而且每天访问压力也过大,这样就把原来的数据根据一定的规则分成两个或者多个库,表结构一样,很明确,访问压力从原来的一个库变成几个库,这样也减轻了。而且是多个服务器,io也减少了。
8 楼 hongkong 2010-03-29  
水平划分,比如100W条记录的数据表,按规则命名成不同的表(放在同一数据库)
以减少数据量,是这样吧。
分到不同的库感觉没什么必要
7 楼 mathfox 2010-03-29  
请问你说水平划分 和 oracle hash分区有什么区别吗?
6 楼 lirig 2010-03-28  
国内很多网站都按照业务把数据库分开,不过分开后还会按照水平再分,按照水平分后可能还得进行读写分离,读写分离还要考虑能不能起到恰到好处的作用。
5 楼 scholers 2010-03-28  
大型网站的垂直划分是比较多的,比如阿里的很多网站。
4 楼 weiruan85 2010-03-28  
淘宝貌似就有读写分离
3 楼 xieye 2010-03-28  
期待更多文章
2 楼 hengstart 2010-03-28  
说的好,我要收藏了!

相关推荐

    数据库垂直拆分与水平拆分概念

     垂直拆分是要把表按模块划分到不同数据库表中(当然原则还是不破坏第三范式),这种拆分在大型网站的演变过程中是很常见的。当一个网站还在很小的时候,只有小量的人来开发和维护,各模块和表都在一起,当网站...

    分布式数据库系统-复习.doc

    水平分片 垂直分片 混合分片 分布式数据库中的数据分布策略有: 、 、 和 四层。 集中式 分割式 复制式 混合式 分布式数据库是多层模式结构,一般划分为 、 、 和 四层。 全局外层 全局概念层 局部概念层 局部内层 ...

    Java数据库编程宝典3

    第1部分 介绍数据库、SQL和JDBC 第1章 关系型数据库 1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 1.1.4 主键 1.1.5 外键 1.1.6 关系 1.1.7 视图 1.1.6 范式...

    面向垂直划分数据库的隐私保护分布式聚类算法 (2008年)

    针对垂直划分的分布式数据库提出了一种基于隐私保护的分布式聚类算法PPDC-VP,该算法基于K-Means的思想实现分布式聚类。并且聚类过程中应用扰乱技术保护本站点真实信息不被传送到其它站点,从而达到隐私保护的目的。...

    高级数据库系统习题答案.docx

    划分表中的内容表达的是应用系统潜在的垂直分片规则。 查询表达式的运算有两种方法,分别是流水线方法和实体化方法 事务的持久性是指事务一旦成功执行,它对数据库施加的更新就是永久的,即使系统出现故障也不会改变...

    向外扩展SQL Server 实现更高扩展性

    使用水平数据划分,数据库结构在数据库实例方面没有变化。通常,数据库之间唯一的不同在于实例包含的数据不同。开发出中间层应用程序,使得实例间的数据得到适当维护,是这种解决方案的特点。可能很难决定如何在...

    Java数据库编程宝典2

    第1部分 介绍数据库、SQL和JDBC 第1章 关系型数据库 1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 1.1.4 主键 1.1.5 外键 1.1.6 关系 1.1.7 视图 1.1.6 范式...

    Java数据库编程宝典1

    第1部分 介绍数据库、SQL和JDBC 第1章 关系型数据库 1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 1.1.4 主键 1.1.5 外键 1.1.6 关系 1.1.7 视图 1.1.6 范式...

    CH3 分布式数据库的设计

    在系统设计中,最基本问题就是分布式数据库的分布问题,即如何对分布式数据库进行逻辑划分和实际物理分配。数据的逻辑划分称数据分片。本章主要针对数据分布进行介绍,以关系数据库为例来说明。 两种设计策略( Top-...

    分布式数据库的设计与实现.doc

    (2)在全局数据与教务处、总务处等各部门之间,数据是按照其应用功能来划分的,所 以采用了垂直分片的方式。在数据库服务器与web数据库服务器的数据关系中,情况也是 相同,也采用了垂直分片的方式。 3、数据库...

    Java数据库编程宝典4

    第1部分 介绍数据库、SQL和JDBC 第1章 关系型数据库 1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 1.1.4 主键 1.1.5 外键 1.1.6 关系 1.1.7 视图 1.1.6 范式...

    分布式数据库系统复习材料.doc

    分片、分布处理、授权、事务恢复等的必要信息 17、数据分片有三种基本方法:水平分片、垂直分片、混合分片 18、定义各类片段要遵守的规则:完备性条件、可重构条件、不相交条件 19、所谓数据分布是指分布式数据库中...

    数据库应用设计.doc

    分裂的方法有水平分裂和垂直分裂两种, 其中水平分裂是依据实体的(某个属性取值)将一个实体分解为若干个实体。 7、利用ER方法进行数据库概念设计时,一般分三步进行:首先设计局部ER模式,然后将 各局部ER模式综合...

    高级数据库课后习题答案

    (2) 解释关系数据库系统中关系表与文件的关系。 (3) 如果有一个大文件需要频繁执行顺序扫描,那么,为该文件选择哪种页存储方式最合适? (4) 分别描述持久化指针解引用(dereference)和指针混写的这两个基本...

    第七章-分布式数据库系统.docx

    分片的方式主要有下面三种: (1) 水平分片:按一定的条件把全局关系的所有元组划分成若干不相交的子集,每个子集为关系的一个片段。 (2) 垂直分片:把一个全局关系的属性集分成若干子集,并在这些子集上做...

    分布式数据库系统体系结构.pdf

    2)分布式数据库系统体系结构 数据存储 分布式数据储存分为数据分布和数据分⽚。 数据分布: 数据分布也称为"数据分配",是指数据在计算机⽹络各场地上的分配策略。数据的分配策略主要有: 1. 集中式:所有数据均...

    分布式数据库设计.pdf

    分布式数据库设计 分布式数据库设计 DDB设计的两个问题 1)分段 – 分割关系成"段" ;逻辑上 2)分配 – 将段置放到站点 ;物理存储上 ⽬标 – 优化响应时间/吞吐量/费⽤/… 分段元则 假若有全局关系R 被分段为⼦...

    MySQL数据库优化之分表分库操作实例详解

    垂直拆分就是要把表按模块划分到不同数据库表中(当然原则还是不破坏第三范式),这种拆分在大型网站的演变过程中是很常见的。当一个网站还在很小的时候,只有小量的人来开发和维护,各模块和表都在一起,当网站不断...

    基于springboot+html的超市进存销管理系统.zip

    它支持水平扩展(如通过分片、复制等技术)和垂直扩展(如增加硬件资源),以应对大规模数据存储和高并发访问的需求。 安全性与管理工具 MySQL提供了一系列安全措施,如用户账户管理、访问权限控制、SSL/TLS加密...

Global site tag (gtag.js) - Google Analytics