2014-01-19 41 views
0

假設我有一個名爲'child'的表,其中包含引用另一個名爲'parent'的表的外鍵。如果父表中包含我經常希望從子表進行SELECT操作時要訪問的列值,最好是在外鍵上JOIN表或將我經常從父表訪問的列存儲在子表中第二次。存儲相同的信息兩次或加入外鍵?

有時我還有第三個「孫子」表引用子表,並希望來自所有3個表的信息的混合。一個三聯JOIN似乎是我過分複雜化了。

我覺得有一個更好的方法來解決這個問題。如果任何人有關於此主題的建議或一些好的資源,請告訴我。

+2

正確的答案是避免冗餘並將數據存儲在一個地方,除非你有一個非常好的理由。你的理由聽起來不是很好。 –

回答

1

這個問題是基於不成熟的優化,這是不好的。

你說的是denornalization,應該這樣做只是因爲存在一個真實而迫切的性能問題。當你的想法聽起來很誘人,它幾乎總是一個壞主意,因爲:

  • 你只是做它的性能方面的原因,但數據庫是相當快 - 你不可能受益多少呢
  • 非規範化介紹複雜性 - 如果您更改了子值,則必須保持父值更新。這是一個大麻煩(不細談這裏)
  • 你甚至不知道你是否有一個性能問題:如果沒有破獲,不解決它
+0

你會如何推薦這種方法呢? – user2923125

+0

將屬於父表中的數據存儲在父表中;將屬於子表中的數據存儲在子表中;將屬於孫表中的數據存儲在孫表中。當您需要訪問信息時,請加入表格。在正常的事件過程中,只需要兩個連接來連接三個(父,子,孫)表。 –

+0

您可以創建一個視圖,將連接打包起來,使它們看起來像應用程序的普通表(對於選擇查詢) – Bohemian