【问题标题】:Model Design In Database Without Data Duplications无重复数据的数据库模型设计
【发布时间】:2024-01-21 06:58:01
【问题描述】:

我想设计以下数据模型:
我有一个Document 对象,他有一个客户和DocumentLines
每行包含一个Item 及其数量和价格(见附图中的第一行)。
在文档中,我想显示这些行以及项目的部件号、描述和日期代码。

问题时间

到目前为止,一切都很好。我可以使用数据关系仅附加相关对象的 ID 来关联它。
但是!让我们想象一下这个场景

我有项目A = { part_number: 'pn1', description: 'my item', date_code: 2015},它已被插入到DocA

当我输入DocA时,我看到客户购买了日期代码为2015的pn1。
现在,当重新入库该商品时,我们会获得该商品的更新日期代码。
现在不再是 2015 年,而是 2016 年。
所以我更新了我的项目:A = { part_number: 'pn1', description: 'my item', date_code: 2016}现在,当我输入DocA时,我看到客户购买了A,日期代码为2016!!
这是错误的! 订单详情应保持不变,不得动态更改。

另外,如果我删除A 会发生什么?我会在DocA 中看到什么?

问题

我如何解决我的难题,再加上一个:
我需要允许更改文档中的项目详细信息更改。
意思是,为特定文档添加一些特别的东西(不是 line-cmets)。

我想出的(这是当前的解决方案)是在 DocumentLine 对象中复制所需的数据。
虽然这看起来很错误,但我想不出更好的解决方案。

我想听听你的意见。

【问题讨论】:

标签: database-design


【解决方案1】:

关于问题的第一部分,你展示了一个好的设计。但是,Item 的一个属性是易变的,您需要在创建文档时保持该值。有几种方法可以处理这个问题。最简单的方法是将值复制到 DocumentLine 表中,并使用创建文档行时的当前值填充它。所以当 Item 值改变时,副本保留原始值。这必须有据可查,以便追随您的人知道发生了什么。

问题的第二部分有点难。零件编号和描述是否也不稳定?这似乎不对。您是否希望能够更改为不同的项目?你已经有了。只需根据需要更新到新的项目编号和数量和价格。如果是您需要的其他东西,您必须让我们更好地了解它到底是什么。

【讨论】:

  • 是的,这里的每个字段都是易变的,这是我客户的要求之一。我想我会按照你所说的,以及我首先提出的建议,将易失性字段复制到 DocumentLine 中。我还将添加从DocumentLineItem 的关系以允许观看相关项目。至于删除部分,我会在item 中添加一个active 字段,所以删除后我会将其从库存中隐藏。
  • 如果您的客户正在指定表字段的性质,那么您就遇到了麻烦。客户真正想要的可以更好地表达为,“一个文档由不同的项目组成。这些项目从库存中的项目开始,但可以及时更改。这些新信息可能与库存中的现有项目有任何关系,也可能没有任何关系。”这真的没有多大意义。您能否提供所需内容的简单语言描述?
最近更新 更多