2014-01-09 130 views
0

我想就我制作的以下ERD图表征询您的意见。请记住,我还没有代表关系的基数。实体关系图销售

我要做的是:

  • 客户端中去买车;
  • 该汽车可以升级许多附加值,这些附加值加起来就是汽车的基本价格;
  • 推销员可以免费提供额外服务,或者为了吸引客户而在销售总价中提供折扣;

您如何看待我的图?这样对吗?你看到有什么不对吗?

[编辑]

我怎么去表示以下情形。作为购买新车的一部分,顾客向我出售二手车。

+0

只是问...如果折扣出售的总价给出,那么为什么'discount'属性出现在'OrderDetails'?为什么不在'订单'? – hashbrown

+0

免费提供额外的折扣(100%折扣)。但是,我不知道这是做事的正确方法。 – MossEverett

+0

好的,有道理。但是,如果推销员想要给整体成本打折呢?你打算如何存储这些信息? (不知道你的情况是否是一个有效的业务场景) – hashbrown

回答

0

无论您的模型是否正确取决于您的模型是否可以捕获您上面描述的所有业务场景 - 恕我直言,您的模型做得相当好(祝贺!);除去一些小的异常情况,例如Order实体中没有Discount属性来捕获整体销售折扣(这是可能的业务情景)。

但是当你像这样建立模型,你应该考虑这种模式的最终目的:

  • 它是用于捕捉交易数据(OLTP )?
  • 它是用于存储数据的报告目的(OLAP

在你的情况,我相信你的最终目标是通过对联机事务处理(OLTP)系统设计来捕捉商业交易。 OLTP模型通常在本质上被归一化(归因于标准化的明显好处,例如减少冗余,更新/删除异常预防等)。除了少量传递依赖性之外,您的模型大部分都是在3NF表单中。实体Order中的列SalesTotal似乎是可导出的列(基于PriceDiscount,您已经存储在其他实体中),并且不需要单独维护(读取冗余)。

也是基于以上的评论,

额外的价格变化,在任何给定的点。卜我应该强麦打破 减售不够看的东西,原来的价格在该日期

我不认为你可以做到这一点,因为你Extra实体被设计成存储当前永远都是Price。您的OrderDeatils包含任何给定时间点的CarExtra之间的关系。如果以后汽车价格和额外价格发生变化,您将会失去旧价格,因为您将以新价格更新旧价格。因此,尽管您可以跟踪OrderDetailsID_Car和​​,但您不知道在订单创建期间他们的历史价格是多少。

如果要存储历史价格,请考虑在CarExtra之间再添加一个表格,以将过去的价格与日期相比较。

客户端可以作为卖方

在当一个客户端可以作为卖方行动的情况采取行动,此人将在这两个你ClientSalesman表独立存在的......那是完全没有问题(这样的设计技术被称为垂直分离)。

或者,如果你真的需要一个3NF的模式,那么你应该创建一个新的实体 - Person包含属性如nameid等,这Person实体将用于两个客户和业务员的细节存储在技术上的两他们是某个人,但他们的“角色”是不同的。一旦你有这个Person实体,你可以删除SalesManClient实体。然后在Order的实体,您已经有了一个Clent IDSalesman ID属性来定义两个不同的人之间的关系(这些Clent IDSalesman IDForeign KeyPerson IDPerson实体)。从Order实体可以知道一个人是否扮演推销员或客户的角色。

希望这有助于

+0

很好地把@hashbrown。非常明确和清晰。我无法捕捉的一件事情,这是一个明确的似是而非的情景,是一个客户可以作为我的立场卖方。我代表这是什么?我的意思是,而不是我是卖方,随时可以进来卖给我一辆新车/二手车。 – MossEverett

+0

@MossEverett更新我的上述答案与你提出的点 – hashbrown

+0

@MossEverett如果你喜欢我的回答是,不要忘记'投票'/'接受'这个答案:-) – hashbrown