Database design AdventureWorks是否存在插入/更新/删除异常?

Database design AdventureWorks是否存在插入/更新/删除异常?,database-design,normalization,Database Design,Normalization,AdventureWorks表具有插入/更新/删除异常。这不被认为是糟糕的设计吗 让我们以下表为例 Sales.SalesReason(SalesReasonID, Name, ReasonType, ModifiedDate) 其中,ReasonType的类型为nvarchar50 我们是否应该为ReasonType设置另一个表,以便模型如下所示: SalesReason(SalesReasonID, Name, ReasonTypeId, ModifiedDate) ReasonT

AdventureWorks表具有插入/更新/删除异常。这不被认为是糟糕的设计吗

让我们以下表为例

Sales.SalesReason(SalesReasonID, Name, ReasonType, ModifiedDate)  
其中,ReasonType的类型为nvarchar50

我们是否应该为ReasonType设置另一个表,以便模型如下所示:

SalesReason(SalesReasonID, Name, ReasonTypeId, ModifiedDate)  
ReasonType(ReasonTypeId, Name)
这样,在更新ReasonType的名称时,应仅对一条记录进行更改,以防止更新异常。此外,它还将通过在db中保留可用类型来防止删除/插入异常,而不考虑是否存在与它们相关的实际数据


我能听听你对这件事的看法吗

将ReasonType删除到另一个表不会有任何改进。假设每个ReasonType仍有一个ReasonTypeId,因此仍有相同数量的更新要做。我猜您是在假设您需要更新ReasonTypeId的频率低于ReasonType。在不了解更多业务需求的情况下,这只是一种可能性,但与解决数据库设计理论通常关注的更新异常类型无关

从规范化理论的角度考虑该表。如果依赖项为:

{SalesReasonID}->{Name}
{SalesReasonID}->{ReasonType}
{SalesReasonID}->{ModifiedDate}
如果SalesReasonID是唯一的键,那么该表已经是第五个正常形式。所以它不需要任何进一步的分解

关于术语更新异常有这样的说法:

一个有点过时的术语,从来没有非常精确的定义,用于 在不完全规范化的情况下可能出错的事情 数据库

卡洛·扎尼奥洛说:

在不了解异常的情况下,无法给出异常的明确描述 用户设想的操作


ACM数据库系统交易,第6卷,第1期,1981年3月

谢谢您的回答。我不确定你是否正确理解我,可能我不是很清楚。让我们以这些数据为例:SalesReason:1,Name1,Some Reason,1/1/2001,2,Name2,Some Reason,6/5/2001,3,Name3,Some Reason,7/6/2001,4,Name4,Best Reason,8/9/2001所以,我想用一个全新的名字将某个原因的名字改为Reason。为了做到这一点,我必须对两行进行更新。这是一个简单的示例,但假设我有其他包含ReasonType列的表。若我像外键一样拥有它,那个么我所要做的就是更新ReasonType表中那个条记录的名称。此外,仅仅通过查看数据库,我不知道什么是所有可用的和可能的原因类型。你对此有何看法?刚刚发现一个主题支持冒险工作有异常的说法,请看:@Poke,我认为这些异常是否有趣或重要的问题,请看我编辑的答案。考虑到我提到的一组明显的依赖关系,我想我们可以说SalesReason表已经在5NF中了。这并不意味着无法进一步改进。我明白你的意思,谢谢。最后一件事,例如,如果业务需求使得ReasonType是一组众所周知的预定义值,那么创建一个单独的引用表是否有意义?