doctrine处理分表的策略询问

来源:8-1 使用框架操作数据库的几个基本需求

老子是山鸡

2015-02-28 17:11

Hi,洪大师:

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


By shanJi

写回答 关注

1回答

  • 洪涛
    2015-03-04 09:13:13

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



    老子是山鸡

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

    2015-03-07 21:18:23

    共 1 条回复 >

洪大师带你解读Symfony 2框架

洪大师教你玩转强大的框架-Symfony2,提高代码性能

20610 学习 · 245 问题

查看课程

相似问题