订单,OrderItem,产品。将产品详细信息写入OrderItem?

时间:2016-02-04 17:32:20

标签: sql-server asp.net-mvc database-design inventory-management

这不是关于特定技术问题的问题,而是关于数据库设计的一般问题。尽管如此,技术堆栈是:ASP.NET MVC,SQL DB。

我最近继承了一个系统,该系统具有订单 - >订单项 - >产品概念,即订单包含许多订单商品,每个订单商品与一个产品相关联。

订单项在保存到数据库时存储以下内容:

  
      
  • 订单ID
  •   
  • 的ProductID
  •   
  • 数量
  •   
  • 单位成本(从产品中写)
  •   
  • 总净额(根据数量*单位成本计算)
  •   
  • VAT
  •   
  • Total GROSS
  •   

通过用户界面查看的订单商品如下所示:

Qty | ProdCode | ProdDescription | Unit Cost | Total NET | VAT | Total Gross

数量,单位成本和总计都从订单商品中拉入用户界面,产品代码和产品描述从关联的产品记录中提取。

一切似乎都足够明智。

所以我的问题围绕哪些数据应该从产品中编写,而数据应该是从产品中引用的。具体而言,单位成本是在创建订单项时从产品中写入的。我认为这是因为产品价格发生变化,您不希望此更改适用于旧订单。很好,很有意义。

  

我的问题是:如果相同的逻辑也适用于产品   代码和产品描述?如果没有,为什么不呢?

     

在我看来,似乎产品代码和描述也应该写入订单项,即产品代码和   描述可能会随产品单位成本而变化。其中   如果你要回去查看旧订单,Prod Code   订单上的描述似乎与最初订购的不同,这对我来说似乎不对。

构建系统的开发人员在设计系统时不再可以讨论他的想法。

系统工作正常,没有投诉。然而,这主要是因为从未对Prod代码/描述进行任何更新,即使它们可供各种用户编辑。

我有兴趣在进行大规模更改之前先听听别人的想法,这是一种常见的情况吗?我什么都不担心?

1 个答案:

答案 0 :(得分:1)

在这种情况下,有几个方面需要考虑。 让我们从订单必须是不可变的事实开始。

由于产品代码和描述不是一成不变的,因此乍一看将它们保存在订单表中似乎是有意义的。
但是,对于每个订单中的每个产品,这可能会导致大量重复数据。

另一种方法是永远不要让产品代码和描述保持不变。

另一种方法是让管理员编辑产品代码和描述,但不是更新产品表中的行,而是将其标记为历史记录(当然,您需要为其添加状态列)和使用新代码和说明为该产品添加新行 此解决方案将允许您保持订单的完整性,同时允许管理员用户编辑他们想要的任何内容,并保留最少的数据,特别是如果产品代码或描述的更改与您编写的一样稀疏。