doctrine處理分表的策略詢問
Hi,洪大師:
? ? ?我現接手一個項目的升級,因為原項目是用的symfony2做的開發,因為最初開發的時候沒有考慮數據量的問題,用了幾年之后現在要對其中的幾個表做分表處理,分表的策略商定的是對主鍵進行取?!,F在問題就出現了,因為用doctrine2的原因一個表就對應一個對象,做分表就是說要重新做map,但是我找了很多的資料,都沒有講這一塊的,我想向您請教一下這個有沒有什么好的方法可以使用。
By shanJi
Hi,洪大師:
? ? ?我現接手一個項目的升級,因為原項目是用的symfony2做的開發,因為最初開發的時候沒有考慮數據量的問題,用了幾年之后現在要對其中的幾個表做分表處理,分表的策略商定的是對主鍵進行取?!,F在問題就出現了,因為用doctrine2的原因一個表就對應一個對象,做分表就是說要重新做map,但是我找了很多的資料,都沒有講這一塊的,我想向您請教一下這個有沒有什么好的方法可以使用。
By shanJi
2015-02-28
舉報
2015-03-04
這個問題沒有你想象的那么簡單,因為不管你最終怎么分,核心問題是分表之間的數據無法很好地整合成一個數據結果集,比如你對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在操作多個不同的數據庫。這種東西應該是比較適合你的,但也有很多限制,你可以參考各自的文檔。