2010-07-20 34 views
2

我试图编写一个“撤消”或“回滚”类型的场景。我的一部分人认为我已经过分复杂化了,而且之前一定已经解决了。用数据库撤消

背景:我有一个产品(例如一本书),该产品有20个领域。产品具有媒体类型(PDF,硬拷贝,EPUB),每种媒体类型有多个定价(价格,地点,即欧洲,亚洲,美国)。

看着前面的问题,这个纪念图案似乎是最接近的,但我不知道如何去做多层次。

例如,变化1 - 创建产品“编码傻瓜”,它是在硬拷贝可用,适用于$ 100在欧洲和$ 75亚洲

变化2 - 改变欧洲硬拷贝价格到90美元。添加PDF,它的成本为欧洲$ 90和$ 75亚洲

变化3 - 删除硬拷贝记录

更改3是一个错误,我想回滚到更改2.

Lookingatpreviousquestions,Mementopattern似乎是最接近的,但我会重复一个可怕的很多数据。即在变更2 & 3中,您正在重复产品,媒体和定价。

我使用的数据集有近1,000,000个产品。 (上面的例子被简化了)实际上,一个产品有大约50个字段,媒体类型有大约15个字段

有没有更好的方法?

回答

1

在您的表格上实施日期档案。

通过这种方式,您将输入2011年3月1日之前价格从21变为30的事实,或者某件事情,而不仅仅是打击旧价值。那么你将能够查询不仅仅是最近的变化,但你可以通过操纵日期来恢复旧的定价。

0

我不太清楚你的意思是多层次的,为什么在你的文章中提到了数据库,但一般来说命令或记忆都是很好的选择,可以在面向对象的程序中进行撤消和重做。两种方式你都应该没问题。

你是什么意思复制数据?您只记得产品状态的变化 - 如果您想稍后恢复它们,则没有其他办法...

+0

我说过数据库,因为你必须将数据存储在某个地方。我读过的很多例子都过于简化,并且说“只是像xml一样方便地将数据序列化”。在这种情况下,在xml中保存状态是不现实的 – 2010-07-20 23:05:41

+0

数据是指数据的变化吗?如果两种模式都这样,那么存在可以在数据库中保存的“更改对象”(通过orm f。ex。)。如果磁盘空间有问题,可能需要注意删除最早的某个时间点。但除此之外,我会将其视为正常数据。 – hackbert 2010-07-20 23:25:31