简单版本化PostgreSQL记录的示例

当我看到“记录历史记录”(版本控制)的实现时,在程序侧面使用SQL数据库。 在更改记录之前,从数据库中获取了旧版本,并将其写入XML,并将生成的XML字符串写入单独的版本表。

最初,在他的程序中,他计划稍后再进行版本控制,因此没有紧迫的需求。 我记得有一种在某处使用jsonb数据类型的愿望,当我想到在SQL端实现版本控制的简单明了时,我就做不到。 3行代码中只有一个具有5列的版本表和一个触发器功能。

描述一个版本表的实现是不够的,因此,例如,您必须描述另外几个表。

在几乎所有数据库中,除了极少数例外,都有一个users表-users。 存储更改历史记录非常有用-例如,用户的版本,以便用户自己回滚到旧版本。

用户表示例:

图片

图片中的最后两个字段是版本表所必需的,它们也可以称为“版本的作者”和“版本日期”,但是,如果需要,您可以不使用它们。

版本表:



触发功能以保存版本:



前两个字段是从保存的记录OLD.changestamp和OLD.userid中填充的。
在版本表中,不仅可以存储用户表条目,第三个字段是版本表名称的MD5哈希,转换为uuid。

前面的示例描述了一个非常简单的结构,但通常,各种参考数据可能具有具有一对多关系的其他表。

例如,表“用户组”。



第二个表是“组用户”,组的组成是组中的用户。



为了不使简单的版本控制机制复杂化,可以对groups表中的数据进行一些重复,添加一个jsonb字段,该字段重复“ Group Users”表的结构。



为了简化重复数据的工作,您可以使用INSERT或UPDATE来创建附加的触发函数,并从jsonb字段中填充“ Group Users”表。



仅当需要经常且尽可能快地从表中获取数据时,才需要上述复制。 例如,是否经常查询“组用户”表以确定用户是否是管理员组的成员。 在其他情况下,可以通过直接从jsonb字段进行查询来获取数据,而不使用重复表。

完整的示例代码在这里

Source: https://habr.com/ru/post/zh-CN423399/


All Articles