1

可以說我有以下DB結構:
Normalized DB structure
和我的應用程序需要顯示的文章列表的所有細節(型號,產品系列,品牌,生產商)。爲此,我需要做更多JOIN來獲得所需的數據。數據庫設計和性能:使用冗餘FK提高性能可以嗎?

那是正確的,如果我增加創建冗餘FKS的文章表像跟蹤應用程序的性能?它實際上是否會提高性能?
DB structure with redundant FKs

+0

我不明白怎麼會減少連接的數量。您仍然需要連接所有表以獲取所有詳細信息,但只有連接*順序*會有所不同(除非您僅對**有興趣,而對詳細表中的其他列不感興趣) – 2012-08-17 10:42:21

+0

您爲什麼認爲這樣會提高應用程序的性能? – 2012-08-17 11:01:16

+0

您可能是正確的,當我需要獲取所有數據時,我不會通過多餘的FK來提高性能。 – radosdesign 2012-08-17 11:18:49

回答

1

當然可以提高性能,如果你不想要檢索的層次結構「中間」對象的任何數據的方式。這是非規範化的常見形式。請注意,你必須要小心不要讓矛盾在下滑。

我通常設置一個驗證非規範化的數據,郵件錯誤,我夜間任務,並自動修復它們。這不難做到,並消除了一個令人討厭的錯誤類。

人們做的一個不同的原因是分區所有表在同一個鍵上。

+0

感謝這有助於。我的觀點是,不是每次我需要所有的信息。 – radosdesign 2012-08-17 11:15:24

0

找出設計是否提高性能的最佳方法是嘗試一下;第二個最好的方法是思考你可能需要運行的查詢,然後嘗試在你的腦海中建模。不知道你想要運行什麼查詢,或者數據庫有多大,很難知道你是否會看到性能改進。

非常籠統,我說你不會看到對性能產生可衡量的影響,除非你有非常大的數據庫(假設你體面的硬件上運行這一點,你已經調整了索引) 。通過「非常大」,我在幾個表格中思考數百萬行。

如果你真的需要反規範化,我的建議是建立一個明確的非規範化表,而不是「污染」你的常規設計,多餘的按鍵。理解一個被分解爲「應該如何」和「妥協」的設計,而不是將兩者混合在一起,會更容易理解。

爲了實現這個目標,我想創建一個單獨的表 - 「cached_articles」也許,與列:

article_id 
...(article data) 
model_id 
....(model data) 
family_id 
...(family data) 
brand_id 
....(brand data) 
producer_id 
....(producer data) 

您可以通過批處理作業或觸發器保持此表。您只應將應用程序代碼寫入規範化表,並且只在需要時才從緩存表中讀取。

你也應該建立一個強大的「一致性檢查」機制來識別可能導致應用程序打破數據的問題;這些一致性檢查成爲一個大問題,一旦你的數據庫增大到這種設計是必需的,因爲他們遇到同樣的性能問題的大小...

+0

感謝您的回答。它絕對有趣的解決方案,但這會給應用程序帶來更多的複雜性(爲同步添加cron作業),而當我從「緩存」表中讀取時,我不會獲得對我來說最新的最新數據。 – radosdesign 2012-08-17 11:53:29

+0

如果最新日期很重要,可以使用觸發器更新表;我不喜歡觸發器,因爲它們傾向於創建難以識別的錯誤,但它們對於這類事情是理想的... – 2012-08-17 12:06:35