在PostgreSQL中实现数据版本控制的方法

时间:2010-11-15 14:23:08

标签: postgresql database-versioning

您能否分享一下您如何在PostgreSQL中实现数据版本控制的想法? (我已经问了关于CassandraMongoDB的类似问题。如果您有任何想法,那么db会更好,请分享)

假设我需要在简单的地址簿中对记录进行版本控制。为简单起见,地址簿记录存储在一个表中而没有关系。我期待历史:

  • 将不经常使用
  • 将一次性使用,以“时间机器”的方式呈现它
  • 单个记录的版本不会超过几百个。
  • 历史不会过期。

我正在考虑以下方法:

  • 创建一个新的对象表来存储记录的历史记录,其中包含地址簿表的模式副本,并将时间戳和外键添加到地址簿表中。

  • 创建一种架构较少的表来存储对通讯录记录的更改。这样的表包括:AddressBookId,TimeStamp,FieldName,Value。这样我只会存储对记录的更改,我不必保持历史表和地址簿表同步。

  • 创建一个表来存储seralized(JSON)通讯录记录或更改通讯簿记录。这样的表看起来如下:AddressBookId,TimeStamp,Object(varchar)。 同样这是架构,所以我不必保持历史表与地址簿表同步。 (This is modelled after Simple Document Versioning with CouchDB

3 个答案:

答案 0 :(得分:2)

您可以拥有start_dateend_date

end_date为NULL时,它是实际记录。

答案 1 :(得分:2)

我做的就像你的第二种方法:让表格包含实际的工作集和带有变化的历史记录(timestamp,record_id,property_id,property_value)。这包括创建记录。第三个表描述了属性(id,property_name,property_type),它有助于在应用程序中更高的数据转换。因此,您还可以非常轻松地跟踪单个属性的变化。

除了时间戳之外,您还可以使用类似int,每个record_id的每个更改都会增加,因此您有一个实际的版本

答案 2 :(得分:2)

我正在对词汇表数据进行版本控制,我的方法非常适合我的需求。基本上,对于需要版本控制的记录,可以将字段集划分为持久字段和依赖于版本的字段,从而创建两个表。第一组中的一些也应该是第一个表的唯一键。

地址
id [pk]
全名[uk]
生日[uk]

版本
id [pk]
address_id [uk]
时间戳[uk]
地址

以这种方式,您将获得由全名和生日(不应通过版本控制更改)和包含地址的版本化记录确定的地址主题。 address_id应该与Address:id通过外键相关。对于版本表中的每个条目,您将获得主题地址的新版本:id =具有特定时间戳的地址_id,您可以通过这种方式获得历史记录参考。