我的任务是找到这种关系中的异常。我发现了一些插入,删除和更新异常。
Commission Percentage: the percentage of the total sales made by a salesperson that is paid as commission to that salesperson.
Year of Hire: the year the salesperson was first hired
Department Number: the number of the department where the salesperson works
Manager Name: name of the manager of the department
然而,我对我退出的异常感到困惑。以下是声明:
公司中不能有一个名称相同的经理,因为除了名称之外没有经理实体的主要标识符,这可能是公司内部的重复。
我是否应该知道如何将上述陈述以及在哪些(更新/删除/插入)异常中包括在内?
谢谢
我可以在下面请求其他帮助:
我目前的设计是将它分为3个关系:
Salesperson(salespersonNumber, salespersonName, commissionPercentage, YearOfHire, deparetmentNumber)
Product(productNumber, productName, unitPrice)
Manager(managerNumber, managerName, departmentNumber)
但是,我错过了数量实体。 数量需要productNumber&的复合键。 salespersonNumber。 我应该自己做另一种关系吗?
Quantity(productNumber, salespersonNumber)
答案 0 :(得分:1)
在识别识别(潜在)异常时,您需要列出受异常影响的相关属性(您忘记了Salesperson Name
,顺便说一句)。具体而言,您列出了依赖于密钥(Salesperson Number, Product Number)
的子集的属性,从而违反了2NF。你正走在正确的轨道上。
但是,请注意不要将属性与异常混淆。如果Bilstein
的3个实例中有1个发生了更改,则更新异常将会更新。 (假设的)功能依赖Salesperson Name depends on Salesperson Number
将被破坏,数据将不一致(销售员编号437将与多个名称相关联)。请记住,规范化旨在消除多余的关联。
通过名称识别经理的问题表明建模决策不佳。正如您所说,公司的一组管理人员并不是通过名称进行唯一标识,因此逻辑数据模型与其建模的世界之间存在不匹配。只要我们为不同的管理者使用不同的值,这就不会导致插入,更新或删除异常,但这会妨碍管理员的方便识别。可能的改进是使用多个属性(抽象域通常可以通过属性的组合轻松识别,但像人们通常不是自然域,例如Manager Name, Birthdate
将更具识别性,但仍然不是一个好的解决方案) ,将Manager Name
转换为代理键(例如Scott1
,Scott2
),或引入新的代理键(例如数字ID)。
您提出的设计会对原始表进行规范化,并解决识别问题。除了两个问题之外,它是一个很好的答案:它不包括销售人员和经理之间的关联,并且在您的Quantity
关系中,您忘记将数量包括为依赖属性。
到目前为止工作很好,希望这有帮助。