2009-04-14 99 views
0

我有一个涉及网络投票系统的项目。当前值和相关数据存储在几个表中。历史数据将是该项目的重要方面,因此我还创建了审计表,以便将当前数据定期移至该表中。有效使用差异的版本控制数据库

我觉得这个策略效率很低。即使我每天只存档数据,即使只有1或2个用户在某一天进行更新,行数也会变得很大。

我能想到的下一个选择是只存储已更改的条目。这意味着必须构建逻辑来自动创建给定日期的视图。这意味着更少的存储行,但相当复杂。

我最后的想法不太传统。由于历史数据将用于报告目的,因此网络用户无需快速访问。我在想,我的分贝可能没有历史数据。 DB仅表示当前状态。然后,每天,整个数据库可以加载到对象中(用户数量相对较少),然后序列化为XML或JSON。这些文件可能与前一天有差异并存储。事实上,SVN可以为我做到这一点。当我想要获得给定过去一天的数据时,系统必须检索当天的版本并反序列化为对象。这显然是一个代价高昂的操作,但这里的性能并不是问题。我正在考虑使用LINQ来解决这个问题,我认为这可以简化一些事情。序列化过程必须非常有条理才能使差异更好地工作。

你会采取哪种方法?

感谢

回答

0

你告诉我们关于你的系统的一切就是它涉及投票。只要您存储投票时间戳,您应该能够在任何时间点生成一份描述投票状态记录的报告......不是吗?例如,假设我有一个系统可以记录喜欢的功能(眼睛,笑容,屁股,...)。如果我想知道某个特定日期的特定功能有多少票,那么我只需将该功能的所有选票与小于或等于该日期的时间戳进行比较。

如果你想有其他事情的历史,那么你会遵循类似的方法。

我认为这是它完成的方式。

alt text http://i41.tinypic.com/xer5zn.jpg

0

你有没有使用真正的版本控制系统,而不是试图鞋拔子在其位置数据库的考虑?我自己对git很有偏见,但有很多选择。他们都对版本之间的差异提供了很好的支持,并且他们倾向于针对这种工作负载进行优化。

+0

所以你建议我序列化/反序列化和提交数据git动态? – 2009-04-14 13:56:01

+0

我并不十分理解你的问题陈述,但git的设计目标是将性能作为主要设计目标之一 - 如果它与你的应用程序相匹配,它可能会比你尝试的任何其他方法更快 – 2009-04-14 19:26:31

1

如果你基本上知道如何资料修改存储在关系数据库中,然后我会看看维基百科是如何做到这一点。

维基是关于保持详细的修订历史记录。他们使用简单的关系数据库进行存储。

考虑维基百科的资料数据库schema