更新关系数据库中的数据,而不影响已经存在的关系

Posted

技术标签:

【中文标题】更新关系数据库中的数据,而不影响已经存在的关系【英文标题】:Updating data in relational database, without affecting the already existing relation 【发布时间】:2015-01-10 08:42:47 【问题描述】:

数据库系统如何对包含部分历史的关系数据进行更改?例如,在合同管理系统中,我有一个公司维护一些产品的维护合同。这些产品将与维护合同相关联(在数据库中)。现在假设我在这个合同中维护了这些产品超过2年,突然产品属性发生变化,那么我需要更改产品信息。但是如果我这样做,由于与合同的关系,信息会告诉我,我将产品在其更改的属性中维护了 2 年以上,这是不正确的!

现在假设我有一个简单的 ContractsProducts 关系(M:M 关系,所以需要 Contracts_Products 联结表)和另一个 Productattributes,与 Products 的关系(M:1 关系)。由于我没有更改 Contract 的任何内容,也没有更改 Product,只是 Productattributes,有什么可能的解决方案来保持与过去相同,而只为即将到来的时间更改 Productattribute

【问题讨论】:

【参考方案1】:

据我了解,您需要将随时间变化的产品属性(例如供应商、工作温度范围、单位成本)与不变的属性(例如描述、颜色、重量)区分开来。

调用保存不变属性的表ProductFixedAttributes 和保存可变属性的表ProductVariableAttributes。那么你当前Products 表的一行是一对一的ProductVariableAttributes 和多对一的ProductFixedAttributes,你可以删除Productattributes 表。

当产品的属性发生变化时,向Products 添加一个新行,该行指向ProductVariableAttributes 中的新行和ProductFixedAttributes 中的现有行。将此新行用于将来与新Contracts 的关联;不要更改Contracts_Products 中的现有行。

【讨论】:

以上是关于更新关系数据库中的数据,而不影响已经存在的关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 获取一个查询以检查 QueryBuilder 是不是存在两个关系中的至少一个而不忽略其他过滤器

如何更新多对多关系中的现有对象(.Net 5)

如何编写python程序将csv数据文件导入关系数据库而不插入重复条目

Node.js ORM框架Sequlize之表间关系

在 Cypher 中,如果关系不存在,我该如何创建关系;如果确实如此,请更新属性

swift中的核心数据关系