我需要以易于索引的方式存储实体的所有版本,并且想知道是否有人输入了要使用的系统。
如果没有版本控制,系统只是一个关系数据库,每个人都有一行。如果此人的状态发生变化,则该行将更改以反映这一点。使用版本控制,条目应该以这样的方式更新,以便我们总是可以回到以前的版本。如果我可以使用时态数据库,这将是免费的,我将能够询问“截至昨天下午 2 点住在都柏林且 30 岁的所有人的状态如何”。不幸的是,似乎没有任何成熟的开源项目可以做临时性的。
一个非常讨厌的方法是在每次状态更改时插入一个新行。这会导致重复,因为一个人可以有许多字段,但每次更新只能更改一个。然后为给定时间戳的每个人选择正确的版本也很慢。
理论上应该可以使用关系数据库和版本控制系统来模拟时间数据库,但这听起来很可怕。
所以我想知道是否有人以前遇到过类似的事情以及他们是如何解决的?
更新 正如 Aaron 所建议的,这是我们目前使用的查询(在 mysql 中)。超过 200k 行的表在我们的表上肯定很慢。(id = 表键,person_id = 每个人的 id,如果这个人有很多修订,则重复)
从人员 p 中选择姓名,其中 p.id =(从人员中选择 max(id),其中人员 ID = p.person_id 和时间戳 <= :timestamp)
更新 看起来最好的方法是使用临时数据库,但鉴于没有任何开源数据库,下一个最佳方法是每次更新存储一个新行。唯一的问题是重复未更改的列和缓慢的查询。