2009-11-13 53 views
3

概述(對不起它的模糊 - 我想,如果我進入更詳細的它只是在複雜的事情)mySQL - 我應該denormalise?

我有三個表,表中的一個包含一個ID,表中的兩個包含自己的ID和表一個人的id和表三包含它自己的id和表二的id。

我花了很多時間思考,我認爲這將是三個表更有效也含有相關表的人的ID。

- 它意味着我將沒有加入三個表,我就可以查詢三表(用於將經常使用的查詢)

- 它會讓我更輕鬆地實現預約系統通過僅鎖定表3中包含來自表1的特定ID的行。

誰想要知道更多關於數據庫的佈局有更多的信息here

問題

什麼是弱勢脫正常化?我看到有些人完全反對,其他人認爲這是一個有用的工具。這個ID永遠不會改變,所以除了必須插入相同的數據兩次,並因此消耗額外的空間(因爲它只是id的確實可以忽略不計)以外,我沒有真正看到任何缺點。

+0

re「should I?」:絕對不是;當存在主要的,不可縮放的性能問題時,非規格化主要被使用。除非你有這個(並且可以用硬數據來支持這個聲明),否則你不應該這樣做,因爲好處可以忽略不計。請參閱http://stackoverflow.com/questions/561900/how-many-mysql-queries-should-i-limit-myself-to-on-a-page-php-mysql/561937#561937 – Piskvor 2009-11-13 13:32:59

回答

5

我的建議是遵循這個一般規則:默認情況下歸一化,然後denormalise如果當你確定性能問題,它會解決。

我覺得規範化的數據,並處理它的代碼,更方便,更合理的維護。我認爲使用非規範化來提高性能並不存在任何問題,但我不會推測性地應用任何性能優化,這會導致可維護性的下降,直到您確定它們是必要的。

1

你真的想進行非規範化的唯一情況是,如果需要的得到表現你想

這已經問了好幾次。見here

0

正常化VS效率通常是一個權衡,而標準化通常是一個好東西,它不是靈丹妙藥。如果你有明確的理由(就像你這樣做),非規範化是完全可以接受的。

1

如果有充足的理由,每個規則都可能被破壞。

在你的情況,我想知道這三個表包含。表三是真正描述表二還是直接描述表一?

在這種情況下,表3中的self-id,table-two-id和table-one-id的缺點是,它可能導致不一致 - 如果表中有table-one-id 1表三中的兩個表和一個表15由一個錯誤?

這取決於數據和數據的實體關係。對我而言,沒有不一致性和多點時間選擇會更重要。

編輯:讀完你的表後,我會建議添加一個table-one-id到表3(區域),因爲table-one-id並沒有改變,因此它相對保存不一致。

1

作爲其一個一個(表1)至許多(表2),用另一一個(表2)至許多(表3)我會保持相同的結構其似乎那裏有3層。

例如

  • 表1
    • 表2
      • 表3

而且,很多將取決於你這些表中存儲什麼附加字段。

0

包含少於完全標準化表的模式遭受所謂的「有害冗餘」。有害的冗餘會導致將相同的事實存儲在多個地方,或者沒有任何地方存儲需要存儲的事實。這些問題被稱爲「插入異常」,「更新異常」或「刪除異常」。要長話短說,如果你將事實存儲在多個地方,那麼你遲早會在兩個地方存儲相互矛盾的事實,並且你的數據庫將開始給出矛盾的答案,這取決於查詢發現哪些版本的事實。

如果你被迫「發明一個虛擬記錄」,以便有一個地方來存儲所需的事實,那麼你遲早會寫一個錯誤地將虛擬記錄視爲真實記錄的查詢。

如果你是一個超級程序員,你從不犯錯誤,那麼你不必擔心上述情況。我從來沒有見過這樣的程序員,雖然我遇到了很多認爲他們從不犯錯誤的人。

我會避免「反常規」作爲一種做法。這就像「遠離芝加哥」。你仍然不知道你要去哪裏。但是,有些時候正常化規則應該被忽視,正如其他人所指出的那樣。如果你正在設計一個星型模式(或雪花模式),你將不得不忽視一些規範化規則,以獲得最好的星星(或雪花)。