1. 程式人生 > >資料庫的垂直劃分和水平劃分

資料庫的垂直劃分和水平劃分

資料庫的水平劃分和垂直劃分很早以前就接觸了,只是沒有實踐,沒有什麼體會,只有最近兩年才有接觸,今天也和大家聊聊。

垂直劃分 

按照功能劃分,把資料分別放到不同的資料庫和伺服器。

當一個網站開始剛剛建立時,可能只是考慮一天只有幾十或者幾百個人訪問,資料庫可能就個db,所有表都放一起,一臺普通的伺服器可能就夠了,而且開發人員也非常高興,而且信心十足,因為所有的表都在一個庫中,這樣查詢語句就可以隨便關聯了,多美的一件事情。但是隨著訪問壓力的增加,讀寫操作不斷增加,資料庫的壓力絕對越來越大,可能接近極限,這時可能人們想到增加從伺服器,做什麼叢集之類的,可是問題又來了,資料量也快速增長。

這時可以考慮對讀寫操作進行分離,按照業務把不同的資料放到不同的庫中。其實在一個大型而且臃腫的資料庫中表和表之間的資料很多是沒有關係的,或者更加不需要(join)操作,理論上就應該把他們分別放到不同的伺服器。例如使用者的收藏夾的資料和部落格的資料庫就可以放到兩個獨立的伺服器。這個就叫垂直劃分(其實叫什麼不重要)。


當部落格或者收藏夾的資料不斷增加後,應該怎麼辦,這樣就引出了另外一個做法,叫水平劃分。

水平劃分

則把一個表的資料劃分到不同的資料庫,兩個資料庫的表結構一樣。怎麼劃分,應該根據一定的規則,可以根據資料的產生者來做引導,上面的資料是由人產生的,可以根據人的id來劃分資料庫。然後再根據一定的規則,先獲知資料在哪個資料庫。

其實很多大型網站都經歷了資料庫垂直劃分和水平的劃分的階段。其實這個可以根據經驗來確定,不一定由某些硬性的規則。

以剛才的部落格為例,資料可以根據userid的奇偶來確定資料的劃分。把id為基數的放到A庫,為偶數的放B庫。




 

這樣通過userId就可以知道使用者的部落格的資料在哪個資料庫。其實可以根據userId%10來處理。還可以根據著名的HASH演算法來處理。

當初看手機之家的架構是發現他們是:

水平切分:對資料進行水平分割。

a.最好分到同一個資料庫。

b.一種已經證明是切實可行的方案:主表+輔表。

c.有3種類型:主表不打散、主表打散無輔表、主表打散有輔表。

d.但對程式設計師來說,TA看到的只是一張表,不妨稱之為虛表(邏輯表)? ,這張虛表實際上可能是由N張實表(物理表)組成的。

哈哈,我還是喜歡把資料分到不同的資料庫,這個可以按照業務來和環境來定吧。

在說句題外話,如果是大型資料庫,還可以做讀寫分離等。