可以說我有以下DB結構:
和我的應用程序需要顯示的文章列表的所有細節(型號,產品系列,品牌,生產商)。爲此,我需要做更多JOIN來獲得所需的數據。數據庫設計和性能:使用冗餘FK提高性能可以嗎?
那是正確的,如果我增加創建冗餘FKS的文章表像跟蹤應用程序的性能?它實際上是否會提高性能?
可以說我有以下DB結構:
和我的應用程序需要顯示的文章列表的所有細節(型號,產品系列,品牌,生產商)。爲此,我需要做更多JOIN來獲得所需的數據。數據庫設計和性能:使用冗餘FK提高性能可以嗎?
那是正確的,如果我增加創建冗餘FKS的文章表像跟蹤應用程序的性能?它實際上是否會提高性能?
當然可以提高性能,如果你不想要檢索的層次結構「中間」對象的任何數據的方式。這是非規範化的常見形式。請注意,你必須要小心不要讓矛盾在下滑。
我通常設置一個驗證非規範化的數據,郵件錯誤,我夜間任務,並自動修復它們。這不難做到,並消除了一個令人討厭的錯誤類。
人們做的一個不同的原因是分區所有表在同一個鍵上。
感謝這有助於。我的觀點是,不是每次我需要所有的信息。 – radosdesign 2012-08-17 11:15:24
找出設計是否提高性能的最佳方法是嘗試一下;第二個最好的方法是思考你可能需要運行的查詢,然後嘗試在你的腦海中建模。不知道你想要運行什麼查詢,或者數據庫有多大,很難知道你是否會看到性能改進。
非常籠統,我說你不會看到對性能產生可衡量的影響,除非你有非常大的數據庫(假設你體面的硬件上運行這一點,你已經調整了索引) 。通過「非常大」,我在幾個表格中思考數百萬行。
如果你真的需要反規範化,我的建議是建立一個明確的非規範化表,而不是「污染」你的常規設計,多餘的按鍵。理解一個被分解爲「應該如何」和「妥協」的設計,而不是將兩者混合在一起,會更容易理解。
爲了實現這個目標,我想創建一個單獨的表 - 「cached_articles」也許,與列:
article_id
...(article data)
model_id
....(model data)
family_id
...(family data)
brand_id
....(brand data)
producer_id
....(producer data)
您可以通過批處理作業或觸發器保持此表。您只應將應用程序代碼寫入規範化表,並且只在需要時才從緩存表中讀取。
你也應該建立一個強大的「一致性檢查」機制來識別可能導致應用程序打破數據的問題;這些一致性檢查成爲一個大問題,一旦你的數據庫增大到這種設計是必需的,因爲他們遇到同樣的性能問題的大小...
感謝您的回答。它絕對有趣的解決方案,但這會給應用程序帶來更多的複雜性(爲同步添加cron作業),而當我從「緩存」表中讀取時,我不會獲得對我來說最新的最新數據。 – radosdesign 2012-08-17 11:53:29
如果最新日期很重要,可以使用觸發器更新表;我不喜歡觸發器,因爲它們傾向於創建難以識別的錯誤,但它們對於這類事情是理想的... – 2012-08-17 12:06:35
我不明白怎麼會減少連接的數量。您仍然需要連接所有表以獲取所有詳細信息,但只有連接*順序*會有所不同(除非您僅對**有興趣,而對詳細表中的其他列不感興趣) – 2012-08-17 10:42:21
您爲什麼認爲這樣會提高應用程序的性能? – 2012-08-17 11:01:16
您可能是正確的,當我需要獲取所有數據時,我不會通過多餘的FK來提高性能。 – radosdesign 2012-08-17 11:18:49