我一直在考虑如何将数据版本控制应用于我拥有的相对简单的数据库,并认为我应该做一些类似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 |