0

这是一个家庭作业问题,因为它与我的数据库入门课程的问题有关,但不是问题本身。我正在学习 Phillip Pratt 的“MySql 指南”,并在第二章中遇到了一个问题。问题指出:

指出您需要对 Premiere Products 数据库进行当前设计以支持以下要求的更改(使用简写表示)。客户不一定由单个销售代表代表,但可以由多个销售代表代表。当客户下订单时,获得订单佣金的销售代表必须在代表客户的销售代表集合中。

数据库目前设计如下(注意粗体字段为主键):

Rep(Rep_Num、Last_Name、First_Name、街道、城市、州、邮编、佣金、费率)

客户(Customer_Num、Customer_Name、Street、City、State、Zip、Balance、Credit_Limit、Rep_Num)

订单(Order_Num、Order_Date、Customer_Num)

Part( Part_Num , Description, On_Hand, Class, Warehouse, Price)

Order_Line ( Order_Num , Part_Num , Num_Ordered, Quoted_Price)

我对这个问题的解决方案是添加一个单独的表来表示,如下所示:

Rep(Rep_Num、Last_Name、First_Name、街道、城市、州、邮编、佣金、费率)

客户(Customer_Num、Customer_Name、Street、City、State、Zip、Balance、Credit_Limit)

代表(代表_Id,客户编号,代表编号)

订单(Order_Num、Order_Date、Represents_Id)

零件(Part_Num、描述、On_Hand、类别、仓库、价格)

Order_Line ( Order_Num , Part_Num , Num_Ordered, Quoted_Price)

我想知道这是否是处理所提出问题的最有效方法,以及我的解决方案是否有任何明显的缺陷?

4

1 回答 1

1

问题的重点似乎是引入多列主键,以及外键需要唯一键来引用的事实(在这种情况下Orders (Rep_Num, Customer_num) references Represents (Rep_Num, Customer_num)):

表示(Rep_Num,Customer_Num

订单(Order_Num、Order_Date、Rep_Num、Customer_Num

诚然,您可以维护 aRepresents_Id并在Orders.

您的解决方案的缺陷在于Orders (Represents_Num)不一定引用该特定客户的有效代表。


在完全偏离主题的情况下,您的解决方案实际上是正确的解决方案:拿起电话的销售获得部分或全部佣金,无论客户是否分配给他。

作为练习的总结,将用例视为众多边缘案例之一,在这些案例中,理论和规范很快被现场现实撕成碎片,并且在 DB 设计中务实和灵活会打败坚持到规范。

于 2013-06-15T22:55:53.573 回答