一道Baidu在線試題:論壇數據庫設計

一個簡單的論壇系統,以數據庫儲存以下數據: 
用戶名,email,主頁,電話,聯繫地址,發帖標題,發帖內容,回覆標題,回覆內容。 
天天論壇訪問量300萬左右,更新帖子10萬左右。 
請給出數據庫表結構設計,並結合範式簡要說明設計思路。
面試

    這是我看見的百度面試題,之前也在cdsn上面看見過相似的問題,沒有仔細想就寫了本身的看法和答案,很惋惜我之前的想法是錯誤的;算是誤人子弟阿,鬱悶!所以我仍是先把和幾個朋友討論的結果和本身的想法作一個總結,算是彌補我之前想法形成別人曲解的過錯;
    首先,咱們先來分析一下這道面試題:用戶名,email,主頁,電話,聯繫地址,發帖標題,發帖內容,回覆標題,回覆內容。這些字段能夠基本歸爲三類:
    一、用戶基本信息:用戶名(UserName),email(Email),主頁(HomePage),電話(Tel),聯繫地址(Address);
    二、發帖主題信息:發帖標題(Title),發帖內容(Content);
    三、回覆信息:回覆標題(RTitle),回覆內容(RContent);
     以上一步有基本開發經驗的人都知道,只是對基本的信息進行劃分;相信將用戶基本信息存放在一張表內不會有什麼好討論的,我建立一張表叫T_Users,並創建主鍵UserID,用戶基本信息所須要存放的內容都放置在此表內;那麼是應該把發帖主題和回覆信息分別建立兩張表存放數據呢仍是應該存放在一張表內?字段內容仍是比較接近的,所以從數據冗餘的角度看,一張表和兩張表在此方面的區別並不影響設計;假設按照大多數論壇的設計思路,將二、3設計成兩個表T_Topics和T_Reverts後,再來分析看看是否合適這裏的要求;
    如今「天天論壇訪問量300萬左右,更新帖子10萬左右」對這句話進行分析,纔是這個面試題的關鍵所在。面試題顯然要求在操做數據庫的性能方面要有更高的要求。而對數據庫的操做而言,檢索數據的性能基本不會對數據形成很大的影響(精確查找的狀況下),而對錶與表之間的鏈接卻會產生巨大的影響,特別在有巨量數據的表之間;而對數據庫的鏈接也是至關消耗性能的操做(這在ADO.NET的教程中都屢次提醒的);所以對問題的定位基本能夠肯定:在顯示和檢索數據時,儘可能減小數據庫的鏈接以及表與表之間的鏈接;
    解決問題的指導性原則找到了,那就來看看,從上面的設計中,有哪一些地方會產生咱們提到的表與表之間的鏈接;(鏈接數據庫的次數儘可能減小到每打開一個頁面只鏈接一次數據庫就能夠獲得全部的數據)一、用戶基本信息中的用戶名在發帖主題列表以及打開一個主題查看回復內容時上面會有所顯示,須要在T_Users和其餘兩張表進行鏈接;二、在打開一個主題查看回復內容時,須要在T_Topics和T_Reverts之間進行鏈接;其餘應該是不須要產生表與表之間的鏈接;按照面試題來推測:T_Users的數據量應該在1萬-10萬之間,T_Topics應該在100-1000萬之間,T_Reverts應該在1000萬-1億之間;從上面兩類鏈接能夠看出來,T_Users和T_Topics會在列表頁面鏈接一次;T_Users、T_Topics和T_Reverts三張表會鏈接一次;我說不上來第一種鏈接是否能夠容許(至少在我開發的系統裏面都是容許的),可是另外三張錶鏈接是絕對不會容許的!特別是T_Topics和T_Reverts兩表之間的鏈接會產生很大的性能損耗,所以須要避免這樣的狀況產生。
    那怎麼樣的設計能夠避免T_Topics和T_Reverts兩表之間的鏈接呢?前面已經進行了分析:能夠考慮把發帖主題和回覆信息存放在一張表(T_Infos)裏面,看看是否能夠解決這個問題;咱們設計一個字段(Flag)來標記是主題仍是回覆的內容;設計一個字段(ParentID,主題此字段爲ID值)來指定是哪個特定主題的回覆;在開打回覆信息時,只須要按照所知道的主題ID,就能夠檢索到這個主題的內容以及全部的回覆內容,上面指出的問題就能夠解決!
    爲了性能,咱們再一次對T_Users和T_Infos鏈接對性能的影響進行一下細緻的分析,能夠經過在T_Infos表內增長UserName字段來解決和它的鏈接,這樣至少在顯示時,性能可以獲得保證;可是這樣的設計由於UserName字段是冗餘的,所以在用戶修改UserName的時候就會產生同步數據的問題,這個須要程序來進行彌補,並是咱們認爲用戶不會常常性的修改他的用戶名這樣的前提下;
    所以這道面試題的答案應該是設計兩張表,用戶基本信息表T_Users和內容表T_Infos,這兩張表的鏈接仍是經過UserID,可是T_Infos中增長UserName這個字段來增長性能!
    上面的面試題算是分析完了,可是從這道題目的分析中咱們能夠看出來,這樣的設計是創建在「一個簡單的論壇系統」這樣的基礎上的極端事例,在咱們真實的世界中,不太會有不少的人喜歡這樣簡單的論壇,並且這樣的論壇在擴展性方面會產生很大的限制;這算不算這道題目是應試教育的產物呢?並且在設計的時候不只僅是爲了適應如今系統的需求還須要提供未來新的要求的變化,所以在實際的開發過程當中間並不推薦使用這道面試題的答案。 數據庫

相關文章
相關標籤/搜索