问题描述
公司现在有多个系统:客服系统、订单系统、营销系统等,这些系统的数据经常要关联查询,怎么保证查询速度呢?目前我们是用ETL工具实现数据同步,比如把订单系统的订单数据同步到客服系统数据库,但是这样就增加了系统的复杂性,如果把所有数据同步到一个数据库会不会数据量太大了?不知道有没有更好的解决办法。
解决方案
采用共享数据库是一个比较快的方法,但是实际上增加了系统之间的耦合性。比如订单系统因为增加了一个字段,可能会对营销系统造成影响,所以建议的方式是采用服务间调用的方式。 但是题主采用ETL的方式我觉得是比较差的方式:A:采用数据库共享:即订单系统可以直接查营销系统的数据库,ETL实际上有延迟的问题,如果觉得不太安全可以将营销系统的数据库复制出一个库出来(如果是MySQL的话使用主从模式,这样比ETL要好一些);B:题主说的ETL方式:一般ETL用在进行后台的数据统计上面,对数据的实时性不敏感,比如做数据报表、离线的数据分析等;C:相互之间提供调用的接口,但是从题主提到的几个子系统来看,几个系统是不应该关联的。因此建议的方式是将界面部分提取出来,几个系统做成服务。 如WebSystem、OrderSystem、CustomerSystem、etc。WEBSystem依赖下面几个子系统,而子系统之间不相互依赖,这样是比较好的。
解决方案二:
好不容易拆分的系统, 楼主你又想把系统合并。。?这种系统集成性的问题,必须通过接口方式去走, 具体要是看你的业务而定。
解决方案三:
将数据复制到hadoop上,在hadoop上计算完毕后,再将结果表复制回数据库
解决方案四:
CQRS 读写分离
解决方案五:
做读写分离,提供一个专门的冗余数据库(专门用来查询)。客服系统、订单系统、营销系统的数据插入和更新时实时同步到这个冗余数据库来。各个系统要查询自己系统的数据直接连自己的库就行了,比如客服系统要查询客服数据直接连客服数据库。如果客服系统要查询订单数据、营销数据,或者联合查询客服数据、订单数据和营销数据,那么就连那个冗余数据库。这样既可以分担各个系统的数据库的负载,又可以提高查询的效率。
解决方案六:
如果不是为了做报表分析之类的,系统间的交互尽量不要用数据库共享,否则耦合性加大,容易出问题建议系统间定义交互的接口
解决方案七:
如果数据库是oracle,做dblink很简单,在一个数据库库中建立与其他数据库的dblink,像查本库表一样查询其他数据库的表;如果不是oracle数据库,那么可以在oracle数据库库上安装插件,link其他数据库(如:sql server)的表。希望对你有帮助。
解决方案八:
不知道你的数据库是oracle还是什么别的。oracle的话很简单,可以做dblink,在一个数据库中建立视图,关联所有link的数据库表,做关联查询。如果是其他数据库需要安装插件做dblink。希望能达到你的效果。
解决方案九:
sql貌似可以连别的数据库
解决方案十:
是不可以将一些数据查到内存中(redis memcache),这样查询的话会比较快。关联关系的话,数据库表行存为map (key是主键 value对应数据库表一行的,存成list)。另外数据库表如果太大的话是不是可以按照时间分表。
解决方案十一:
数据库是最好的方法。
解决方案十二:
系统之间提供数据交互的接口