doctrine處理分表的策略詢問
Hi,洪大師:
? ? ?我現(xiàn)接手一個(gè)項(xiàng)目的升級(jí),因?yàn)樵?xiàng)目是用的symfony2做的開發(fā),因?yàn)樽畛蹰_發(fā)的時(shí)候沒有考慮數(shù)據(jù)量的問題,用了幾年之后現(xiàn)在要對(duì)其中的幾個(gè)表做分表處理,分表的策略商定的是對(duì)主鍵進(jìn)行取模?,F(xiàn)在問題就出現(xiàn)了,因?yàn)橛胐octrine2的原因一個(gè)表就對(duì)應(yīng)一個(gè)對(duì)象,做分表就是說要重新做map,但是我找了很多的資料,都沒有講這一塊的,我想向您請(qǐng)教一下這個(gè)有沒有什么好的方法可以使用。
By shanJi
2015-03-04
這個(gè)問題沒有你想象的那么簡(jiǎn)單,因?yàn)椴还苣阕罱K怎么分,核心問題是分表之間的數(shù)據(jù)無法很好地整合成一個(gè)數(shù)據(jù)結(jié)果集,比如你對(duì)user表進(jìn)行取模分表,如何實(shí)現(xiàn)搜索所有大于10歲的用戶這種簡(jiǎn)單的操作?而且外鍵關(guān)系也會(huì)完全打亂,其他表里的user_id到底對(duì)應(yīng)的是哪個(gè)user表里的id?
從項(xiàng)目定位上,doctrine2的dbal提供了一些簡(jiǎn)單的sharding功能,但使用起來有很多的限制,你可以查看一下http://doctrine-orm.readthedocs.org/projects/doctrine-dbal/en/latest/reference/sharding.html
當(dāng)然,如果你覺得這些限制對(duì)你來說很重要,你不想失去,那就必須按照你的特定的需求去實(shí)現(xiàn)一套你自己的dbal,orm的相關(guān)部分也需要改,但是這個(gè)工作量就大了,能展開的部分太多,而且和業(yè)務(wù)結(jié)合比較緊密,在此先不做展開。
除此之外,我建議你考慮使用一些mysql proxy軟件去實(shí)現(xiàn)這個(gè)功能,這些軟件模擬了mysql的協(xié)議,對(duì)外提供一個(gè)標(biāo)準(zhǔn)的mysql服務(wù),對(duì)內(nèi)可以連接幾個(gè)分表的真實(shí)mysql數(shù)據(jù)庫。在操作起來和使用一個(gè)mysql數(shù)據(jù)庫沒有區(qū)別,但實(shí)際上卻是由mysql proxy在操作多個(gè)不同的數(shù)據(jù)庫。這種東西應(yīng)該是比較適合你的,但也有很多限制,你可以參考各自的文檔。