业务分库,垂直拆分,水平拆分
常见的分库方式有水平性和垂直性。一般来说,就是按照用户属性(地市或者ID的hash)进行分库,或者按照业务功能块进行分库。
水平分库方式:根据用户属性(如地市)拆分物理数据库。一种常见的方式是将全省划分为几个大区。
垂直分库方式:根据业务维度和数据的访问量等,进行数据的分离,剥离为多个数据库。例如,将一些公用的配置信息存储到一个数据库中进行单独维护。
垂直划分
按照功能划分,把数据分别放到不同的数据库和服务器。
其实在一个大型而且臃肿的数据库中表和表之间的数据很多是没有关系的,或者更加不需要(join)操作,理论上就应该把他们分别放到不同的服务器。例如用户的收藏夹的数据和博客的数据库就可以放到两个独立的服务器。这个就叫垂直划分。
当博客或者收藏夹的数据不断增加后,应该怎么办,这样就引出了另外一个做法,叫水平划分。
水平划分
则把一个表的数据划分到不同的数据库,两个数据库的表结构一样。怎么划分,应该根据一定的规则,可以根据数据的产生者来做引导,上面的数据是由人产生的,可以根据人的id来划分数据库。然后再根据一定的规则,先获知数据在哪个数据库。
以刚才的博客为例,数据可以根据userid的奇偶来确定数据的划分。把id为基数的放到A库,为偶数的放B库。
这样通过userId就可以知道用户的博客的数据在哪个数据库。其实可以根据userId%10来处理。还可以根据著名的Hash算法来处理。
注意:
a.最好分到同一个数据库。
b.一种已经证明是切实可行的方案:主表+辅表。
c.有3种类型:主表不打散、主表打散无辅表、主表打散有辅表。
d.但对程序员来说,TA看到的只是一张表,不妨称之为虚表(逻辑表)? ,这张虚表实际上可能是由N张实表(物理表)组成的。
参考:
http://blog.csdn.net/xingjing1226/article/details/51907220
http://blog.csdn.net/zljjava/article/details/38422387