这不是关于特定技术问题的问题,而是关于数据库设计的一般问题。尽管如此,技术堆栈是:ASP.NET MVC,SQL DB。
我最近继承了一个系统,该系统具有订单 - >订单项 - >产品概念,即订单包含许多订单商品,每个订单商品与一个产品相关联。
订单项在保存到数据库时存储以下内容:
- 订单ID
- 的ProductID
- 数量
- 单位成本(从产品中写)
- 总净额(根据数量*单位成本计算)
- VAT
- Total GROSS
通过用户界面查看的订单商品如下所示:
Qty | ProdCode | ProdDescription | Unit Cost | Total NET | VAT | Total Gross
数量,单位成本和总计都从订单商品中拉入用户界面,产品代码和产品描述从关联的产品记录中提取。
一切似乎都足够明智。
所以我的问题围绕哪些数据应该从产品中编写,而数据应该是从产品中引用的。具体而言,单位成本是在创建订单项时从产品中写入的。我认为这是因为产品价格发生变化,您不希望此更改适用于旧订单。很好,很有意义。
我的问题是:如果相同的逻辑也适用于产品 代码和产品描述?如果没有,为什么不呢?
在我看来,似乎产品代码和描述也应该写入订单项,即产品代码和 描述可能会随产品单位成本而变化。其中 如果你要回去查看旧订单,Prod Code 订单上的描述似乎与最初订购的不同,这对我来说似乎不对。
构建系统的开发人员在设计系统时不再可以讨论他的想法。
系统工作正常,没有投诉。然而,这主要是因为从未对Prod代码/描述进行任何更新,即使它们可供各种用户编辑。
我有兴趣在进行大规模更改之前先听听别人的想法,这是一种常见的情况吗?我什么都不担心?
答案 0 :(得分:1)
在这种情况下,有几个方面需要考虑。 让我们从订单必须是不可变的事实开始。
由于产品代码和描述不是一成不变的,因此乍一看将它们保存在订单表中似乎是有意义的。
但是,对于每个订单中的每个产品,这可能会导致大量重复数据。
另一种方法是永远不要让产品代码和描述保持不变。
另一种方法是让管理员编辑产品代码和描述,但不是更新产品表中的行,而是将其标记为历史记录(当然,您需要为其添加状态列)和使用新代码和说明为该产品添加新行 此解决方案将允许您保持订单的完整性,同时允许管理员用户编辑他们想要的任何内容,并保留最少的数据,特别是如果产品代码或描述的更改与您编写的一样稀疏。