doctrine处理分表的策略询问
Hi,洪大师:
我现接手一个项目的升级,因为原项目是用的symfony2做的开发,因为最初开发的时候没有考虑数据量的问题,用了几年之后现在要对其中的几个表做分表处理,分表的策略商定的是对主键进行取模。现在问题就出现了,因为用doctrine2的原因一个表就对应一个对象,做分表就是说要重新做map,但是我找了很多的资料,都没有讲这一块的,我想向您请教一下这个有没有什么好的方法可以使用。
By shanJi
Hi,洪大师:
我现接手一个项目的升级,因为原项目是用的symfony2做的开发,因为最初开发的时候没有考虑数据量的问题,用了几年之后现在要对其中的几个表做分表处理,分表的策略商定的是对主键进行取模。现在问题就出现了,因为用doctrine2的原因一个表就对应一个对象,做分表就是说要重新做map,但是我找了很多的资料,都没有讲这一块的,我想向您请教一下这个有没有什么好的方法可以使用。
By shanJi
2015-02-28
这个问题没有你想象的那么简单,因为不管你最终怎么分,核心问题是分表之间的数据无法很好地整合成一个数据结果集,比如你对user表进行取模分表,如何实现搜索所有大于10岁的用户这种简单的操作?而且外键关系也会完全打乱,其他表里的user_id到底对应的是哪个user表里的id?
从项目定位上,doctrine2的dbal提供了一些简单的sharding功能,但使用起来有很多的限制,你可以查看一下http://doctrine-orm.readthedocs.org/projects/doctrine-dbal/en/latest/reference/sharding.html
当然,如果你觉得这些限制对你来说很重要,你不想失去,那就必须按照你的特定的需求去实现一套你自己的dbal,orm的相关部分也需要改,但是这个工作量就大了,能展开的部分太多,而且和业务结合比较紧密,在此先不做展开。
除此之外,我建议你考虑使用一些mysql proxy软件去实现这个功能,这些软件模拟了mysql的协议,对外提供一个标准的mysql服务,对内可以连接几个分表的真实mysql数据库。在操作起来和使用一个mysql数据库没有区别,但实际上却是由mysql proxy在操作多个不同的数据库。这种东西应该是比较适合你的,但也有很多限制,你可以参考各自的文档。
举报