代码之家  ›  专栏  ›  技术社区  ›  Piotr Czapla

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

  •  12
  • Piotr Czapla  · 技术社区  · 14 年前

    你能分享一下你的想法吗,你将如何在PostgreSQL中实现数据版本控制。(我也问过类似的问题 Cassandra MongoDB . 如果您有什么想法,请与我们分享)

    假设我需要在一个简单的地址簿中翻译记录。为了简单起见,地址簿记录存储在一个表中,没有关系。我希望历史:

    • 将很少使用
    • 将立即用于以“时间机器”的方式呈现它
    • 一张唱片的版本不会超过几百个。
    • 历史不会结束。

    我正在考虑以下方法:

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

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

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

    3 回复  |  直到 8 年前
        1
  •  3
  •   knitti freethinker    14 年前

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

    除了时间戳,您还可以有一个类似于int的值,每个记录id的每次更改都会增加一个值,这样您就有了一个实际的 版本 .

        2
  •  2
  •   Luc M    14 年前

    你本可以 start_date end_date .

    什么时候? 结束日期 为空,这是实际记录。

        3
  •  2
  •   vonPetrushev    14 年前

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

    地址
    身份证
    全名[英国]
    生日[英国]

    版本
    身份证
    地址[英国]
    时间戳[英国]
    地址

    以这种方式,您将获得由全名和生日确定的地址主题(不应通过版本控制更改)和包含地址的版本控制记录。address_id应该通过外键与address:id相关。在版本表中的每个条目中,您将获得主题地址的新版本:id=Address\u id和一个特定的时间戳,这样您就可以拥有一个历史引用。

    推荐文章