为了账号安全,请及时绑定邮箱和手机立即绑定

doctrine处理分表的策略询问

Hi,洪大师:

     我现接手一个项目的升级,因为原项目是用的symfony2做的开发,因为最初开发的时候没有考虑数据量的问题,用了几年之后现在要对其中的几个表做分表处理,分表的策略商定的是对主键进行取模。现在问题就出现了,因为用doctrine2的原因一个表就对应一个对象,做分表就是说要重新做map,但是我找了很多的资料,都没有讲这一块的,我想向您请教一下这个有没有什么好的方法可以使用。


By shanJi

正在回答

2 回答

这个问题没有你想象的那么简单,因为不管你最终怎么分,核心问题是分表之间的数据无法很好地整合成一个数据结果集,比如你对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在操作多个不同的数据库。这种东西应该是比较适合你的,但也有很多限制,你可以参考各自的文档。



1 回复 有任何疑惑可以回复我~
#1

老子是山鸡 提问者

非常感谢您的回复,我目前通过生命周期的钩子和__get() 模拟的一下,暂时能够勉强满足需求。您说的那个自己去实现一套DBAL ,这个是在doctrine的接口上改写?还是直接改他源码? 有没有相关的资料呢? 那个sharding的我看了,不是很符合我们的需求。谢谢您对我问题的解答。
2015-03-07 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

doctrine处理分表的策略询问

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信