2012-03-05 70 views
0

AdventureWorks表具有插入/更新/刪除異常。這是不是認爲糟糕的設計?AdventureWorks有插入/更新/刪除異常?

以下表爲例。

Sales.SalesReason(SalesReasonID, Name, ReasonType, ModifiedDate) 

其中ReasonType是類型爲nvarchar(50)

我們不應該有ReasonType另一個表因此模型是這樣的:

SalesReason(SalesReasonID, Name, ReasonTypeId, ModifiedDate) 
ReasonType(ReasonTypeId, Name) 

這樣做的更新時, ReasonType的名稱只能在一條記錄上進行更改(防止更新異常)。此外,它將通過保留db中的可用類型來防止刪除/插入異常,而不管是否存在與它們相關的實際數據。

我可以對此事有你的想法嗎?

回答

0

將ReasonType移除到其他表不會改善任何內容。據推測,每個ReasonType仍然會有一個ReasonTypeId,因此您仍然可以執行相同數量的更新。我想你假設你需要更新ReasonTypeId的次數比ReasonType少。在不瞭解業務需求的情況下,這只是一種可能性,但與解決數據庫設計理論通常關心的「更新異常」類型無關。

從歸一化理論的角度考慮表格。如果依賴關係是:

{SalesReasonID}->{Name} 
{SalesReasonID}->{ReasonType} 
{SalesReasonID}->{ModifiedDate} 

,如果SalesReasonID是唯一的關鍵,則表已在第五範式。所以它不需要進一步的分解。

The Relational Database Dictionary有這樣說的術語「更新異常」:

一個有點老土來看,都不是很精確的定義,對於 這樣的事情可以去錯在不到完全規範化 數據庫

卡羅Zaniolo說:

ANOM的沒有明確的說明在不知道用戶設想的 操作的情況下可以給出alies

(ACM Transactions on Database Systems, 6,No.1,1981年3月)

+0

感謝您的回答。 我不確定你是否正確理解我,可能我不是很清楚。讓我們拿這個數據爲例: SalesReason: '(1,「Name1」,「Some Reason」,1/1/2001), (2,「Name2」,「Some Reason」,6/5/2001) , (3,「Name3」,「Some other reason」,7/6/2001), (4,「Name4」,「Best Reason」,8/9/2001)' – poke 2012-03-05 15:40:39

+0

所以,我想改名「有理由」改爲「有全新名字的原因」。爲了做到這一點,我必須做兩行更新。這是一個簡單的例子,但可以說我有其他具有ReasonType列的表。如果我把它當作一個外鍵,那麼我只需要在ReasonType表上更新該單個記錄上的名稱。此外,僅僅通過查看數據庫,我並不真正知道什麼是可用的和可能的原因類型。 你對此有何評論? – poke 2012-03-05 15:40:46

+0

剛剛發現一個主題,支持聲明,AdventureWork有異常,請看看:[http://stackoverflow.com/questions/4824024/how-important-are-lookup-tables](http://stackoverflow.com/ question/4824024/how-important-are-lookup-tables) – poke 2012-03-05 18:24:45