代码之家  ›  专栏  ›  技术社区  ›  David

版本和索引数据存储

  •  1
  • David  · 技术社区  · 16 年前

    我有一个要求,以一种容易索引的方式存储一个实体的所有版本,我想知道是否有人输入了要使用的系统。

    如果不进行版本控制,系统只是一个关系数据库,其中每个人都有一行。如果此人的状态更改,则该行将更改以反映此情况。通过版本控制,条目应该以这样的方式更新,这样我们就可以一直返回到以前的版本。如果我可以使用一个临时数据库,这将是免费的,我可以问“截至昨天下午2点,住在都柏林,30岁的所有人的状况如何”。不幸的是,似乎没有任何成熟的开源项目可以做到暂时性的。

    一个真正讨厌的方法就是在每个状态更改中插入一行。这会导致重复,因为一个人可以有许多字段,但每次更新只能更改一个字段。然后,为每个给定时间戳的人选择正确的版本也相当缓慢。

    理论上,应该可以使用关系数据库和版本控制系统来模拟临时数据库,但这听起来相当可怕。

    所以我想知道是否有人曾经遇到过类似的事情,以及他们是如何接近它的?

    更新 正如Aaron建议的,这里是我们当前使用的查询(在MySQL中)。在我们的桌子上,20万行肯定很慢。(id=表键,person_id=每个人的id,如果该人有许多修订,则重复)

    从Person P中选择名称,其中p.id=(从Person_id=p.Person_id和timestamp<=:timestamp的Person中选择最大(id)

    更新 看起来最好的方法是使用临时数据库,但是考虑到目前没有任何开源数据库,下一个最好的方法是在每次更新时存储一个新行。唯一的问题是复制不变的列和缓慢的查询。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Aaron Digulla    16 年前

    有两种方法可以解决这个问题。两者都假定总是插入新行。在任何情况下,都必须插入时间戳( created )它告诉您行何时被“修改”。

    第一种方法使用一个数字来计算已经有多少实例。主键是对象键加上版本号。这种方法的问题似乎是您需要 select max(version) 修改。实际上,这很少是一个问题,因为对于应用程序的所有更新,必须首先加载人员的当前版本,修改它(并增加版本),然后插入新行。所以真正的问题是,这种设计使得在数据库中运行更新变得困难(例如,为许多用户分配一个属性)。

    下一种方法使用数据库中的链接。不是复合键,而是给每个对象一个新键,并且 replacedBy 包含下一版本的键的字段。这种方法使查找当前版本变得简单( ... where replacedBy is NULL )但是,更新是一个问题,因为必须插入新行并更新现有行。

    要解决此问题,可以添加一个返回指针( previousVersion )。这样,您就可以插入新行,然后使用返回指针更新以前的版本。

        2
  •  0
  •   bdonlan    16 年前

    以下是对时间数据库文献的(有些过时的)调查: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.91.6988&rep=rep1&type=pdf

    我建议你花点时间坐下来和那些推荐信和/或 Google Scholar 尝试找到一些适合您的数据模型的好技术。祝你好运!

    推荐文章