版本控制的数据库有效地使用diff

时间:2009-04-14 06:56:23

标签: database versioning relational-database

我有一个涉及网络投票系统的项目。当前值和相关数据存储在多个表中。历史数据将是该项目的一个重要方面,因此我还创建了审计表,当前数据将定期移至该审计表。

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

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

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

你会采取哪种方式?

由于

3 个答案:

答案 0 :(得分:1)

如果您基本上想知道如何在关系数据库中存储数据修订,那么我将研究wiki如何做到这一点。

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

考虑维基百科的数据库schema

答案 1 :(得分:0)

您是否考虑过使用真正的版本控制系统,而不是试图在其位置上窃取数据库?我自己对git非常偏爱,但有很多选择。它们都对版本之间的差异有很好的支持,并且它们往往针对这种工作负载进行了很好的优化。

答案 2 :(得分:0)

你告诉我们的关于你的系统的全部内容是涉及投票。只要您存储投票时的时间戳,您就应该能够在任何时间点生成描述投票状态记录的报告......不是吗?

例如,假设我有一个系统可以计算出最喜欢的功能(眼睛,微笑,屁股......)。如果我想知道特定日期的特定功能有多少票,那么我只需将该时间戳小于或等于该日期的所有选票统计。

如果你想了解其他事情的历史,那么你会采用类似的方法。

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

alt text