<bdo id="vljxk"><rt id="vljxk"><noframes id="vljxk"><noframes id="vljxk"><noframes id="vljxk"><rt id="vljxk"></rt><rt id="vljxk"></rt><noframes id="vljxk"><rt id="vljxk"><delect id="vljxk"></delect></rt><noframes id="vljxk"><rt id="vljxk"></rt><noframes id="vljxk"><noframes id="vljxk"><rt id="vljxk"></rt>

當前位置:首頁 >  站長 >  網站運營 >  正文

大型網站架構系列之三 多對多關系的優化設計

 2008-09-18 14:02  來源:   我來投稿 撤稿糾錯

  阿里云優惠券 先領券再下單

接上篇,大型網站架構系列之二 底層架構概論

上篇以用戶數據表為例介紹了基本的數據分割方案以及基本的配置方案。但是在2.0時代,這種簡單的列表索引已經遠遠實現起來是問題的,多對多關 系將是最常見的關系?,F在我們針對web2.0數據中廣泛存在的多對多關系進行闡述和具體行為判斷,比如一個很簡單的例子,在2.0時代,好友功能是最常 被用到的,每個用戶會有很多的好友,同時也會是很多人的好友,那么這個數據量將會是用戶數的平方的級別。同樣,對于文章標簽,每個文章可以有多個標簽,而 每個標簽又可以有多個文章,這又是一個幾何乘積,數據量又會是個天文數字。

傳統的處理方案有兩種,一種是通過SEARCH的方法來實現,一種是通過另建一個索引表,存貯對應的ID以進行存貯。對于第一種方案,因為要涉 及大量的LIKE查詢,性能不敢恭維,第二種的情況下,數據庫的行的數量也是驚人海量級別的,并且要跨表跨區查詢,還要維護數據的唯一性,數據處理過程相 當的復雜性能也就不言而喻了。

文入正題,下面對數據多對多關系舉出來具體的解決方案,我們這里以標簽和文章之間的多對多關系為例來講解,大家可以舉一反三的思考群組和用戶之間,相冊和被圈用戶之間等等復雜的多對多關系。

首先濾清一下流程,我們以傳統方案的第二種為例,在傳統的數據庫設計中我們是如下走的:當一篇博文發布的時候并插入標簽的時候一般是三步走(也 可以理解為四步,以為還要判斷標簽是否存在的問題),第一步插入文章數據庫并獲取文章的ID,第二步插入標簽數據庫同時查詢標簽是否存在,如果存在就取出 標簽的ID,否則的話插入新標簽并取出ID,第三部,將文章的ID和標簽的ID插入索引表來建立關聯。如果這個時候在索引表上建立了索引的話就是災難性 的,特別是在數據量大的情況下,盡管它可以有效的提高查詢速度,但是發布的速度可能就會讓人無法忍受了。

我們處理的方法也是三部曲,對多對多關系進行進一步的處理。

用標簽的時候,我們用的最多的就是查詢標簽下的文章和顯示文章的標簽,所以我們實現這例就成了。

第一步,拋棄索引表。

對文章做冗余字段,加一個TAG列,我們可以講TAG的標簽如下寫[TagID,TagName]| [TagID,TagName]| [TagID,TagName] 同樣 對于TAG表,我們做如下冗余加個Article字段,如下內容[ArticleID,Title]| [ArticleID, Title]| [ArticleID, Title],在需要增加的時候我們只要APPEND一下就可以了,至于ARTICLE的結構和TAG的結構可以參考我上一篇文章的介紹。其實根據需要還 可以存貯更多。

有人會問,為什么要存貯TagName和ArticleTitle呢,其實是為了避免跨表查詢和INNERJOIN查詢來做的,In查詢和跨表查詢會造成全表遍歷,所以我們在執行的時候In查詢是必須要找到一個有效的替代方法的。

第二部:異步加載。

在設計模式下我們常思考的是單件模式,我們采用另類的單件模式來處理,也就是把文章和標簽之間的索引作為專門的進程來做,異步的實現。

為了避免文章在發布的時候以為要檢查TAG表而造成的線程擁堵,我們需要采取延遲加載的方案來做。服務器應該維護一個進程專業的對標簽和文章地段的查詢和索引,我們在發布文章的時候應該把標簽同步這一塊托管給另外的一個程序進行處理,并進行索引。

第三部:標簽緩存索引:

對于頻繁的判斷標簽去或者熱門的標簽我們還可以組織一套有效的索引,比如對于標簽“瘋狂代碼”和”傲博知識庫”,我們用樹來把它表示出來。對于 瘋狂代碼我們索引一個瘋,其實用程序表達就是瘋狂代碼[0],同樣傲博知識庫就是傲博知識庫[0]。而在數組”瘋”中存貯以瘋開頭的標簽組,以”傲”的數 組中存貯以”傲”開頭的標簽。如果量更大的話還可以再做二級索引。

這涉及另外一個話題了就是分詞,上面是一個簡單的分詞方案,大家在進行GOOGLE搜索的時候應該很輸入它的Suggest方法吧,就是這個道理。最終講標簽有效的索引,并提取熱門的作為一個全局靜態變量,我們就可以繞過數據查詢這一關,對第二部的單件模式又是一個進化。

以上是對多對多關系的一個簡單的架構說明,肯定有人會問,如果這樣做的話工作量不是太大了嗎,分詞處理什么的,對每個多對多關系進行處理。

OK,咱們可以進一步的把它來抽象化,我們用TableA 表示Article表,用TagbleT表示Tag表,我們可以講字段抽象化出來,也就是一個ID,一個Tag的String 同理對于標簽表也是如此。朋友們應該可以理解我的意思了。

對,就是做個代碼生成器把對應的多對多關系給生成出來,這個很好寫的,幾個Append就可以搞定。如果想更方便的處理,那么把這個東西做成單件的模式抽象化出來,然后再違反一下原則,做成基類,其他關系繼承這個基類。。。。。剩下的應該很簡單了,具體實現大家思考吧。

請參照第二篇的文章進行進一步優化設計來實現更高的負載性能

下章接著講述數據分割和散列方面的內容

瘋狂代碼原創發布,同步發布于 和

轉載請注明出處

申請創業報道,分享創業好點子。點擊此處,共同探討創業新機遇!

相關文章

  • SEO優化設計,如何處理網站動態參數

    在SEO的日常工作中,我們常常認為,要想擅長某件事,首先必須利用它的工具。這里的“工具”關鍵是指我們網站本身的形式,在影響網站結構的諸多因素中,URL的動態參數是關鍵。

  • 網站標題優化設計的細則和相關說明

    網頁頁面的標題,從SEO這行業問世到現在,全是一個對綜合排名影響非常重要的因素。而怎樣對網頁頁面的標題做優化是每一位SEO從業人員務必關心的問題,遺憾的是多數人卻沒有尤其的了解這邏輯關系

  • 404頁面優化設計

    404頁面就是在用戶訪問你的網站的某個地址的時候,如果這個地址不存在或者內容刪除后,展現給用戶看的頁面。如果我們沒有設置404頁面,就會讓蜘蛛認為這條鏈接是一個死胡同進而停止抓取,這對于我們的網站的傷害還是很大的。

  • 站在用戶的角度來優化設計別讓他“發呆”

    在互聯網迅速發展的時代,網站建設似乎陷入了一個尷尬的境地。站長朋友們想要對網站進行優化,但是思來想去都無從下手。那么,不妨考慮下優化你的用戶界面,提升用戶體驗。一個好的用戶界面設計能夠將網頁和用戶連結,通過設計(如順手的導航、流暢的交互)讓用戶對網站產生好感。盡管網頁設計以實用為主,但依然可以為用戶

    標簽:
    優化設計
  • 網站優化設計:網站SEO排名的敲門

    大家好,我是虛子雨。對于SEO做久了的站長來說,我們肯定會知道一個好的網站不僅僅需要我們在視覺上沖擊用戶,也要在精神上讓用戶得到感受,這就是我們常說的用戶體驗,但是怎么做用戶體驗更有利于我們網站的SEO推廣呢?這就需要我們在網站設計的時候做好優化工作,因為

    標簽:
    優化設計

熱門排行

信息推薦