6

我正在設計一個數據庫,我想規範化數據庫。在一個查詢中,我將加入大約30-40張表格。如果它變得非常流行,這會不會損害網站的性能?這將是主要的查詢,並且將被調用50%的時間。其他查詢我將加入兩張表格。規範化是否真的損害了高流量網站的性能?

我現在可以選擇正常化或不正常化,但如果規範化在未來成爲問題,我可能不得不重寫軟件的40%,這可能需要很長時間。在這種情況下,正常化是否真的受傷?我應該在現在有空的時候反規範化嗎?

+2

您不應該冒這樣大規模的重寫(40%的代碼)的風險。如果你開始規範化,但通過視圖來提供大部分代碼所必需的抽象...那麼在你需要將你的視圖作爲抽象層應該呈現的方案中非規範化時,它應該避免大部分代碼更改。 – 2010-04-24 00:46:34

+1

當您需要更新非規格化表格時,請注意涉及的開銷(涉及工作量) - 如果您更改客戶端地址,而不是在一個地點更改它,您現在必須掃描非規範化表格中的每一行以更改它。也許一個視圖是你最好的選擇,如果這仍然太慢,那麼分配更多的硬件資源到數據庫。 – slugster 2010-04-24 01:41:32

+1

我想知道爲什麼你首先需要30-40張桌子 - 以及爲什麼需要加入這些桌子。這對我來說並不合適,所以我想讓你解釋表格在做什麼。 – 2010-04-24 14:29:00

回答

4

我引述如下: 「正常化的正確性,反規範化的速度 - 並且只在必要時」

我是指你:In terms of databases, is "Normalize for correctness, denormalize for performance" a right mantra?

HTH。

+3

+1。你不規範化數據庫 - _always_從3NF開始。如果_,只有if_,則回覆到較低的速度,這是必要的。並確保你瞭解後果和解決方案。有許多方法可以緩解非規範化引發的問題(觸發器,計算列等)。另外看起來YAGNI :-) – paxdiablo 2010-04-24 00:18:22

+0

所以你認爲30-40表將不會是一個問題加入?此外,如果規範化確實成爲問題,是否可以添加更好的硬件來抵消規範化成本? – Luke101 2010-04-24 00:34:25

+1

@Luke:不,這可能是一個連接40個表的問題,你應該考慮去規範化(但是隻有在問題出現之後,而不是預期可能不存在的問題 - 測量,不要猜測)。但是我非常喜歡3NF模式,它需要連接這麼多表。根據我的經驗,我從來沒有遇到過這種極端的情況。也許如果你在這方面增加了更多細節,我們可以更好地理解並提供更有針對性的建議。 – paxdiablo 2010-04-24 01:12:33

0

不要進行早期優化。非規範化不是加速網站的唯一途徑。你的緩存策略也是非常重要的,如果30-40表的查詢是相當靜態的數據,緩存結果可能證明是一個更好的優化。

另外,考慮到讀取次數的寫入次數。如果您爲每次插入或更新執行大約10次讀取,則可以說數據相當靜態,因此您應該將其緩存一段時間。

如果最終使您的模式非規範化,您的寫入操作也將變得更加昂貴,並且可能會讓速度變慢。

在進行太多優化之前真正分析您的問題,並等待查看系統瓶頸的位置,因爲您可能最終會驚訝於您應該首先優化哪些內容。

+0

30-40表格根本不會是靜態的。在正常的一天,我們預計會有1000次更新和插入。 – Luke101 2010-04-24 00:32:32

+1

每天進行1000次更新的次數少於每分鐘1次。我會稱之爲相當靜態的。 – Gabe 2010-04-24 03:23:39

+0

同意。而且,假設你讀取的次數多於寫入的次數,那麼緩存策略將證明是非常重要的。 – jamesaharvey 2010-04-24 13:10:53

3

當性能是一個問題,還有比非規範化通常是更好的選擇:

  • 創建的相關表相應的索引和統計
  • 緩存
  • 物化視圖(MS SQL Server中索引視圖)
  • 除了在大多數情況下使用的規範化表格(需要編寫同步代碼,它可以作爲三元組運行)之外,還有一個表格的非規範化副本(專用於需要它們的查詢) gger或預定作業,具體取決於您需要的數據精度)
1

標準化可能會損害性能。然而,這並不是過早反規範化的理由。

從完全標準化開始,然後您會看到是否有任何性能問題。按照你所描述的速度(每天1000次更新/插入),我認爲除非桌子很大,否則你不會遇到問題。

即使有大量您可以使用的數據庫優化選項(索引,準備存儲過程,物化視圖,...)。

1

也許我在這裏錯過了一些東西。但是如果你的架構要求你在一個查詢中加入30到40個表格,那麼這個查詢就是你網站的主要用途,那麼你就有更大的問題。

我同意他人,不要過早地優化您的網站。但是,您應該優化體系結構以解釋您的主要用例。對於運行時間超過50%的查詢,40個表連接未優化IMO。

相關問題