【发布时间】:2016-11-15 04:43:53
【问题描述】:
在链接模型中(比如饮料交易、服务员和餐厅),当您想要显示数据时,您会在链接内容中查找信息:
所以在时间 T,当我显示所有交易时,我会按照关联获取我的数据,因此我可以显示这个:
TransactionID Waiter Restaurant
1 Julius Caesar's palace
2 Cleo Moe's tavern
现在假设我的服务员搬到了另一家餐厅。
如果我刷新这张表,结果将是
TransactionID Waiter Restaurant
1 Julius Moe's tavern
2 Cleo Moe's tavern
但是我们知道第一笔交易是在凯撒的宫殿里进行的!
解决方案 1
不要修改服务员 Julius,而是克隆它。
优势:我保持模型之间的关联,并且仍然可以过滤每个关联模型的每个字段。
缺点:每个模型的每次修改都会复制内容,随着时间的推移,这会做很多事情。
解决方案 2
在您创建事务时保留关联模型的当前状态副本。
好处:我不会复制内容。
缺点:您不能再在内容上使用字段来显示、排序或过滤它们,作为您的原始和真实数据在里面,比方说,一个 JSON 字段。因此,如果您使用 MySQL,则必须通过在该字段中进行普通搜索查询来过滤数据。
你的解决方案是什么?
[编辑]
问题更进一步,因为不仅仅是关联发生变化的问题:对关联模型的简单修改也会导致问题。 我的意思:
所以在时间 T,当我显示所有交易时,我会按照关联获取我的数据,因此我可以显示这个:
TransactionID Qty ProductId
1 2 1
ProductID Title Price
1 Beer 3
==> 订单数量 n°1 : 6.
现在假设啤酒的价格为 2.5。
如果我刷新这张表,结果将是
TransactionID Qty ProductId
1 2 1
ProductID Title Price
1 Beer 2,5
==> 订单数量 n°1 : 5.
所以,再一次,有两种解决方案可用:当它的价格改变时,我是否克隆啤酒产品?下订单时,我是否会在我的订单中保存一份啤酒?你有第三种解决方案吗?
我不能只在我的订单上添加一个“金额”属性:是的,它可以(部分)解决这个问题,但它不是一个可扩展的解决方案,因为许多其他属性将处于相同的情况,我不能乘以属性像这样。
【问题讨论】:
-
@Close Voters:我理解这可以被视为基于意见,但实际的问题是“如何保存和检索关联对象的历史数据?”这可以客观地回答。这个问题只需要重新措辞。
标签: data-modeling