1

我一直在考虑如何将数据版本控制应用于我拥有的相对简单的数据库,并认为我应该做一些类似Jim T 的帖子中提到的事情,其中​​有全局修订号(例如在 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 字段,因为你破坏了主键的唯一性。相反,我可能不得不做这样的事情(添加适当的索引来替换前面的主键的功能):

 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                           |
4

1 回答 1

1

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

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

历史智慧建议使用日期http://www.dbforums.com/database-concepts-design/1641734-data-record-versioning-how-implement.html

当您将数据提取到对象模型中时,使用日期并不是最好的事情。

最近,两表方法受到青睐数据库 - 数据版本控制

由于需要维护重复的表,我也不太热衷于此。

如果您将解决方案修改为具有版本列和状态列,那会起作用吗?最高值的版本号是最新的,记录状态是最新的版本。

还在琢磨...

于 2009-05-06T20:34:50.023 回答