Database 关系数据库和版本控制:修订间隔

Database 关系数据库和版本控制:修订间隔,database,revision,Database,Revision,我一直在考虑如何将数据版本控制应用到我拥有的一个相对简单的数据库中,我想我应该做一些类似于中提到的有全局修订的事情(例如,类似于Subversion或Mercurial),并且每个数据库记录都有一个有效期间隔 例如: 创造一个人 |Name|D.O.B |Telephone|From|To | |Fred|1 april|555-29384|1 |NULL| 更新电话号码 |Name|D.O.B |Telephone|From|To | |Fred|1 april|555-2938

我一直在考虑如何将数据版本控制应用到我拥有的一个相对简单的数据库中,我想我应该做一些类似于中提到的有全局修订的事情(例如,类似于Subversion或Mercurial),并且每个数据库记录都有一个有效期间隔

例如:

创造一个人

|Name|D.O.B  |Telephone|From|To  |
|Fred|1 april|555-29384|1   |NULL|
更新电话号码

|Name|D.O.B  |Telephone|From|To  |
|Fred|1 april|555-29384|1   |1   |
|Fred|1 april|555-43534|2   |NULL|
删除弗雷德:

|Name|D.O.B  |Telephone|From|To  |
|Fred|1 april|555-29384|1   |1   |
|Fred|1 april|555-43534|2   |2   |
这种方法有缺点吗?这似乎没那么复杂

我能想到的唯一一件事是,它似乎会对主键产生微妙的影响,而不是与数据无关的自动递增记录编号。例如,如果您有如下数据:

 Person: (primary key = PersonID which is an autoincrementing integer)
 |PersonID|Name|Telephone|
 |1       |Fred|555-2938|
 |2       |Lois|555-2939|
 |3       |Jim |555-1000|

 Home: (primary key = HomeID which is an autoincrementing integer)
 |HomeID|Address       |
 |1     |123 Elm St.   |
 |2     |456 Maple Ave.|

 PersonHome: (primary key = person ID and home ID)
 |PersonID|HomeID|
 |1       |1     |
 |2       |1     |
 |3       |2     |
然后不能只添加上面的From和To字段,因为这样会破坏主键的唯一性。相反,我可能不得不这样做(添加适当的索引以替换前面主键的功能):


我自己也在思考同样的问题

from | to构造的缺点是,当您要添加记录的新版本时,需要更新和插入。我还担心这个结构有双重含义,它告诉你版本,例如x | null表示最近,它告诉你记录状态,例如x | x表示删除

历史智慧建议使用日期

当您将数据拉入对象模型时,处理日期并不是最整洁的事情

最近,两张桌子的方法得到了支持

我也不太喜欢这个,因为需要维护重复的表


如果您将解决方案修改为具有版本列和状态列,这是否可行?值最高的版本号为最新版本,记录状态为最新版本


还在思考

我自己也在思考同样的问题

from | to构造的缺点是,当您要添加记录的新版本时,需要更新和插入。我还担心这个结构有双重含义,它告诉你版本,例如x | null表示最近,它告诉你记录状态,例如x | x表示删除

历史智慧建议使用日期

当您将数据拉入对象模型时,处理日期并不是最整洁的事情

最近,两张桌子的方法得到了支持

我也不太喜欢这个,因为需要维护重复的表


如果您将解决方案修改为具有版本列和状态列,这是否可行?值最高的版本号为最新版本,记录状态为最新版本


还在思考

“如果您将解决方案修改为具有版本列和状态列,这是否可行?”也许可以,但我需要找到最大修订ID不超过感兴趣修订的行。我更愿意用BETWEEN(from,to)进行查询;它更快,并且避免了子查询。“如果您修改了解决方案,使其具有一个版本列和一个状态列,这是否可行?”也许可以,但我需要找到最大修订ID不超过感兴趣的修订的行。我更愿意用BETWEEN(from,to)进行查询;它更快,并且避免了子查询。您是否有可能找到解决此问题的方法?唉,没有。。。在过去的12个月里,我积累了一笔严重的时间债务:-(你有没有找到解决这个问题的办法?唉,没有……我在过去的12个月里积累了一笔严重的时间债务:-(
 Person: (primary key = K which is an autoincrementing integer)
 |K|PersonID|Name     |Telephone|From|To  |
 |1|1       |Fred     |555-2938 |1   |NULL|
 |2|2       |Lois     |555-2939 |1   |1   |
 |3|3       |Jim      |555-1000 |1   |NULL|
 |4|4       |Sunshine |555-2000 |1   |2   |
 |5|2       |Lois     |555-1000 |2   |NULL|
 |6|4       |Daisy May|555-2000 |3   |NULL|
 |7|5       |Connor   |         |5   |NULL|

 Home: (primary key = K which is an autoincrementing integer)
 |K|HomeID|Address       |From|To  |
 |1|1     |123 Elm St.   |1   |NULL|
 |2|2     |456 Maple Ave.|1   |NULL|
 |3|3     |789 Vista Dr. |1   |3   |
 |4|3     |104 Vista Dr. |4   |NULL|   

 PersonHome: (primary key = K which is an autoincrementing integer)
 |K|PersonID|HomeID|From|To  |
 |1|1       |1     |1   |NULL|
 |2|2       |1     |1   |1   |
 |3|3       |2     |1   |NULL|
 |4|4       |3     |1   |NULL|
 |5|2       |2     |2   |NULL|
 |6|5       |2     |5   |NULL|

 Revisions: (comments here for illustration)
 |Revision|Comments                                                       |
 |1       |Initial dataset                                                |
 |2       |Lois divorced Fred and moved in with Jim                       |
 |3       |Sunshine changed her name to Daisy May                         |
 |4       |Daisy May's house was renumbered by the fire dept for 911 rules|
 |5       |Lois and Jim had a baby named Connor                           |