15

您能否分享您的想法,您将如何在 PostgreSQL 中实现数据版本控制。(我问过关于CassandraMongoDB的类似问题。如果您有任何想法哪个 db 更适合,请分享)

假设我需要在一个简单的通讯录中对记录进行版本化。为简单起见,地址簿记录存储在一个没有关系的表中。我希望历史:

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

我正在考虑以下方法:

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

  • 创建一种无模式表来存储对地址簿记录的更改。这样的表将包括:AddressBookId、TimeStamp、FieldName、Value。这样,我将只存储对记录的更改,而不必保持历史记录表和地址簿表同步。

  • 创建一个表来存储序列化 (JSON) 通讯录记录或对通讯录记录的更改。此类表如下所示:AddressBookId、TimeStamp、Object (varchar)。同样,这是较少的架构,因此我不必使历史记录表与地址簿表保持同步。(这是在使用 CouchDB 进行简单文档版本控制之后建模的

4

3 回答 3

4

我做了类似于您的第二种方法的事情:让表具有实际工作集和更改历史记录(时间戳、record_id、property_id、property_value)。这包括创建记录。第三个表描述了属性(id、property_name、property_type),这有助于在应用程序中进行数据转换。因此,您还可以非常轻松地跟踪单个属性的更改。

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

于 2010-11-15T15:43:46.810 回答
2

你可以有start_dateend_date

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

于 2010-11-15T15:23:00.280 回答
2

我正在对词汇表数据进行版本控制,我的方法非常成功地满足了我的需求。基本上,对于需要版本控制的记录,您将字段集划分为持久字段和版本相关字段,从而创建两个表。第一个集合中的一些也应该是第一个表的唯一键。

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

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

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

于 2010-11-15T16:35:09.253 回答