針對高流量網站(如stackoverflow)進行數據庫設計和規範化的最佳做法是什麼?在高流量網站中規範化或非規範化
應該使用規範化數據庫進行記錄保存還是使用規範化技術或兩者的組合?
是否合理設計一個規範化的數據庫,作爲記錄保存,以減少冗餘,同時保持數據庫的快速搜索的另一種非標準化形式的主數據庫?
或
如果主數據庫中,但與快速的數據庫操作應用水平標準化的觀點非規範化?
或其他一些方法?
針對高流量網站(如stackoverflow)進行數據庫設計和規範化的最佳做法是什麼?在高流量網站中規範化或非規範化
應該使用規範化數據庫進行記錄保存還是使用規範化技術或兩者的組合?
是否合理設計一個規範化的數據庫,作爲記錄保存,以減少冗餘,同時保持數據庫的快速搜索的另一種非標準化形式的主數據庫?
或
如果主數據庫中,但與快速的數據庫操作應用水平標準化的觀點非規範化?
或其他一些方法?
的非規範化分貝,以減少聯接需要強烈的查詢次數是縮放的許多不同的方式之一。不得不做更少的連接意味着db的繁重程度降低,並且磁盤便宜。
這就是說,對於荒謬數額的交通良好的關係數據庫的性能是很難實現的。這就是爲什麼許多大型網站使用關鍵值存儲(例如memcached)和其他緩存機制。
The Art of Capacity Planning是相當不錯的。
首先:確定自己是什麼一塊進行交通方式:每天
比計算每分鐘和每秒的pobalbe峯值頁面瀏覽量。 之後,考慮你想要查詢的數據每個頁面視圖。數據是否可緩存?數據的動態性如何,數據有多大?
分析您的個人需求,編寫一些代碼,進行一些負載測試,優化。在大多數情況下,在需要擴展數據庫服務器之前,需要擴展Web服務器。
關係數據庫就可以了,如果全面優化,速度快得驚人,在連接表時!
一個關係數據庫可以很少打時,作爲後端,來填充緩存或填補一些非規範化的數據表。我不會將違法化作爲默認方法。
(你提到的搜索,看看如Lucene的或類似的東西,如果你需要全文搜索。)
最好的最佳實踐的答案肯定是:這取決於 ;-)
對於我正在開發的項目,我們已經採用了非規範化表格路線,因爲我們預計我們的主要表格將具有較高的寫入讀取比率(而不是所有用戶擊中相同的表格,我們已將它們非規格化並將每個「用戶集」設置爲使用特定的分片)。您可能會發現閱讀http://highscalability.com/有關「大型網站」如何應對音量的示例 - 最近發佈了Stack Overflow。
加盟的表現受到高估。 Oracle等數據庫產品的構建非常高效。當真正的罪魁禍首是一個糟糕的數據模型或糟糕的索引策略時,聯盟往往被認爲表現糟糕。人們也會忘記,在插入或更新數據時,非規範化數據庫執行得非常糟糕。
要記住的關鍵是您正在構建的應用程序的類型。大多數着名的網站都不像常規的企業應用程序。這就是Google,Facebook等不使用關係數據庫的原因。最近有很多關於這個話題的討論,其中I have blogged about。
所以,如果你建立一個網站,該網站主要是關於交付的半結構化內容shedloads你可能不希望使用關係數據庫,去歸一化或以其他方式爲。但是,如果你正在建立一個高度交易的網站(比如在線銀行),你需要一個保證數據安全性和完整性的設計,並且做得很好。這意味着至少有第三種正常形式的關係數據庫。
如果您沒有正確緩存,則無關緊要。
你可以聽在這個題目由堆棧溢出的創作者thier播客在討論:
http://itc.conversationsnetwork.org/shows/detail3993.html
磁盤空間很便宜,但磁盤性能肯定是沒有的。使用非規範化設計時,通常最終會在更寬的表上插入或更新更大量的數據,這往往會導致性能問題。 – 2010-03-14 01:44:08