2016-07-22 64 views
0

我正在开发一个类型Symfony3 /学说网上商店的。为了简化事情,假设我有一个表Repairs和一个Parts。零件有名称和价格,维修可以使用很多零件,以及各种零件可用于各种修理(多对多)。维修的价格是部件价格和其他一些因素的总和。学说:跟踪缓慢变化维的历史

渐变维度

现在,应该是可以改变一个Part的价格,这应该改变未来Repairs的价格。但是,数据库中已存在的任何Repairs都不应更改,因为它们用于记帐,开具发票等。

“软更新”

删除Part容易与SoftDeleteable解决。这保持了PartsRepairs之间的完整关系。类似的事情应该发生更新实体。只有在某些重要(如价格)变化的情况下,实体才应在数据库中更新。但是,似乎没有现成的代码。

我已经试过如下:

  • 简单地删除旧的实体,在每次更新,这是代码密集,效率低下,留下大量的垃圾在数据库中存储的副本。
  • Versionable,但这并不就多到许多实体
  • Loggable工作,但这个写在一个单独的日志表中的变化,而不是在表格中我使用
  • EntityAudit,但是这也没有按不做我想要的,不能用于多对多的人。

以不同的方式解决问题?

我已经asked用我的技术解决方案before帮助,但因为我相信这个问题是常见的一种,我开始认为,缺乏直接的,现成的解决方案,意味着我以错误的方式接近问题。也许我应该简单地保留一个静态表来存储静态值(但这不允许在保持价格的同时更改某个修复的名称)?要么?

回答

1

免责声明:你的问题是相当广泛的,因此可能有更多然后一个足够好的解决方案。下面的这个只是我的看法。

我想你应该重新考虑你的域名。再想一想“价格”究竟是什么。正如你已经注意到,这取决于观点。在你的例子中有两种情况:

  • current(base)产品的价格。
  • 过去当时的价格,Rapair制成。(实际上已付金额)

但是对于同样的价格还有更多的观点。价格可能不仅随时间而变化,但它可能有多个值在同一时间。比方说,你想要实现折扣功能,如果Parts对于Repair总共花费超过100美元,你可以享受5%的折扣。在这种情况下,两个客户可能在同一时间有不同的价格。

考虑到上述因素,您可能会注意到,这实际上并不是Part的价格随时间的变化,但有两种不同的价格属性。一个基地价格,第二个支付价格。

由于支付价格可能有一个根本不存在作为一个基地(例如,在打折的情况下)的值,很明显,你正在处理,只有词法可以有相同的名字price两个不同的值。但他们属于两个不同的实体。

TL;博士

你处理两种不同的价值观,他们应该分开存放。

解决方案

代替ManyToMany关系,你可以做一个明确的实体RepairPart,这将涉及到两个RepairPart实体ManyToOne关系,但它也将包含您可能需要额外的数据未来,但他们可能会在源Part表中更改。在这种情况下,这是价格。