2013-07-05 40 views
1

假設你有如下表:訂單客戶活動,並LineAssignments。我可以修改的唯一表格是LineAssignments表格。最佳實踐:冗餘數據或多個連接?

  • 事件1 < ---> *訂單
  • 客戶1 < ---> *訂單
  • 訂購1 < ---> * LineAssignments
  • 1號線< ---> * LineAssignments

不同的頁面顯示信息與行分配的不同組合。例如,在一些頁面上,我只顯示線路分配的事件信息,而在其他頁面上,我顯示他們的訂單信息等。

基本上,每當我添加一個新的線路分配時,我是否也應該存儲事件ID客戶ID的OrderID過,或者我應該只存儲訂單ID,那麼做多的加入,以獲得其他數據。創建一個加入這些表的視圖會更好嗎?

回答

1

這只是一個表現問題。一般來說,你應該堅持3NF,即沒有冗餘。鑑於這給了非常嚴格和優雅的數據結構,它可能也會導致嚴重的性能問題。

這通常是這種情況,如果您的數據庫既用於生產數據又用於歷史數據,即隨時間增長。

發出連接的查詢時,您的RDBMS將盡可能多的信息加載到內存中,通常是索引信息以加快查詢速度。現在,如果索引太大以致於不適合內存,那麼您的RDBMS(不,事實上,操作系統)將不得不交換,這是一個性能殺手。

真正的交易(在我眼中)是從歷史數據中完全分離生產性數據(例如開放/未付費訂單)。歷史數據可以並且應該爲快速檢索進行優化,因爲沒有任何變化,硬盤價格便宜。

生產性數據應該很好很緊(3.NF)。每當一條信息不再有效時(訂單付款,零件交付等),它將從生產數據庫中刪除並轉移到歷史數據中。

獲取有關「數據倉庫」主題的信息,以防您不熟悉它並閱讀有關概念。這很容易理解。

+0

非常有見地,謝謝。 –

1

我傾向於遵循學校的觀點,即數據只能在數據庫中表示一次。這意味着,在您的位置,我會嘗試從多個連接中獲取所需的內容,並僅存儲OrderID。

我之所以這樣做的原因是,如果有其他表中存儲的數據(複製到LineAssignments表的數據)被更新的可能性,則複製的數據將會出錯。我不認爲其他表格中的數據會發生變化的可能性很大,但是在這種情況下它可能會發生變化......您可能比連接更好,而不是可能錯誤的數據。