我有2個表產品在事務表中複製數據是否是一種糟糕的設計?
Product
--------
ProductID
ProductName
和SalesTransaction。
SalesTransaction
--------
TransactionID
ProductID
ProductName
用戶要求說明「產品名稱可以隨時間變化,但此修改不得影響已存在的事務」。我想知道,我的設計是否適合這種需求?如果不是,如何改進我的設計?
我有2個表產品在事務表中複製數據是否是一種糟糕的設計?
Product
--------
ProductID
ProductName
和SalesTransaction。
SalesTransaction
--------
TransactionID
ProductID
ProductName
用戶要求說明「產品名稱可以隨時間變化,但此修改不得影響已存在的事務」。我想知道,我的設計是否適合這種需求?如果不是,如何改進我的設計?
如果要求意味着舊交易必須在交易時記錄產品名稱,那麼是的,這是實現該目的的一種方法。
另一種方法是使用新的productId對產品名稱更改進行建模。您需要在產品表格中添加一個字段來標記歷史記錄。當產品名稱更改時,只需使用新產品ID和新名稱複製產品記錄,並將舊記錄標記爲歷史記錄。
您也可以將產品分爲兩個表格,例如ProductDetail和ProductDetail,其中ProductDetail存儲可以像名稱和價格一樣更改的內容。 ProductDetail還包含From和To date列以指示其何時處於活動狀態。將記錄放入ProductDetail後,唯一可以更改的列是To date,其他所有內容都是不可變的。產品名稱更改時,插入一個新的ProductDetail並將舊日期設置爲To date。
在SalesTransaction表中,您可以加入ProductDetail而不是Product,您將始終獲得正確的產品名稱。
這是傳統的方法。這不是非規範化,而是從某個時間點節省所需信息。不要用inteh命令的價格來做同樣的事情。有些人不認爲這樣做(對於這些類型的記錄,無論該要求是否明確說明),並且當他們開始從訂單運行財務報告時創建一個自己受到傷害的世界,因爲附加到訂單上的價格不再是客戶實際收取的價格。
我面臨問題,我無法使用此方法跟蹤產品名稱。我認爲它可能有另一種更優雅和更健壯的方法。 – Anonymous 2010-09-24 01:47:52
爲什麼不能跟蹤產品名稱,您是否將其存儲在銷售交易表中?請停止嘗試「優雅」,「優雅」是毫無價值的,通常會對數據庫作業造成有害的影響。最有效的方法往往是應用程序員認爲尷尬的方法。用數據庫術語來說這是一件壞事。 – HLGEM 2010-09-24 13:43:33
我知道我們在交易表中有這些信息,但是想想母版頁。如果交易打印出去年的產品A是在去年售出的,3個月後A更名爲B.現在客戶進入商店並要求產品A,僱主嘗試從主頁尋找該產品,該主頁從主表查詢數據。我是否需要從主表和事務表中查詢兩者? – Anonymous 2010-11-25 03:14:02