0

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

我最近继承了一个系统,它有一个订单-->订单项目-->产品概念,即一个订单有很多订单项目,每个订单项目都与一个产品相关联。

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

  • 订单编号
  • 产品编号
  • 数量
  • 单位成本(从产品写入)
  • 总净值(根据数量 * 单位成本计算)
  • 增值税
  • 总毛额

通过 UI 查看的 Order Item 如下所示:

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

数量、单位成本和总计都从订单项目中拉到 UI 中,产品代码和产品描述从关联的产品记录中拉出。

一切似乎都足够明智。

所以我的问题围绕着应该从产品中写入哪些数据与应该从产品中引用哪些数据。具体来说,单位成本是在创建订单项目时从产品中写入的。我认为这是因为产品价格发生了变化,而您不希望这种变化适用于旧订单。很好,有道理。

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

在我看来,产品代码和描述似乎也应该写入订单项目,即产品代码和描述与产品单位成本一样容易发生变化。在这种情况下,如果您要返回查看旧订单,订单上的产品代码和描述似乎与最初订购的不同,这对我来说似乎是错误的。

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

该系统运行良好,没有任何投诉。然而,这主要是因为产品代码/描述从未有任何更新,即使它们可供各种用户编辑。

在我进行大规模更改之前,我很想听听人们对此的想法,这是一种常见的情况吗?我什么都不担心吗?

4

1 回答 1

1

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

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

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

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

于 2016-02-04T17:47:44.910 回答