用于保留更改历史记录的 SQL 模式模式

标签 sql database-schema

考虑一个维护人员列表及其联系信息(包括地址等)的数据库。

有时,联系信息会发生变化。我喜欢保留更改的历史记录,而不是简单地将个人记录更新为新值。

我喜欢以这样的方式保存历史记录,当我查看一个人的记录时,我可以快速确定该人的数据还有较旧的记录。但是,我也希望避免构建非常复杂的 SQL 查询来仅检索每个人记录的最新版本(虽然这对于单个表可能很容易,但一旦该表连接到其他表,就会变得很困难)。

我想出了几种方法,我将在下面添加这些方法作为答案,但我想知道是否有更好的方法(虽然我是一名经验丰富的代码编写者,但我对 DB 设计还很陌生,所以我缺乏经验并且已经陷入了一些死胡同)。

哪个数据库? 我目前正在使用 sqlite,但计划最终迁移到基于服务器的数据库引擎,可能是 Postgres。但是,我的意思是以更一般的形式提出这个问题,而不是特定于任何特定引擎,尽管出于一般利益,也欢迎如何在某些引擎中解决此问题的建议。

最佳答案

很多时候,更改历史不需要结构化,因为历史仅用于审计目的,实际上不需要能够对历史数据执行查询。因此,通常只需 就足够了。只需记录每次修改 这是对数据库制作的,您只需要一个带有日期时间字段和一些可变长度文本字段的日志表,您可以在其中格式化人类可读的消息,例如谁更改了什么以及旧值是什么,以及新值是什么。不需要在实际数据表中添加任何内容,也不需要向查询添加额外的复杂性。

如果您必须在数据库中保留历史信息以便能够对其执行查询,那么 我建议使用 View 。 将每个表从“NAME”重命名为“NAME_HISTORY”,然后创建一个名为“NAME”的 View ,该 View 仅向您显示最新记录。如果修改表的代码因不得不将表称为“NAME_HISTORY”而不是“NAME”而受到负担,这是可以的,因为该代码可能还必须考虑到它不更新表的事实,它正在为其添加新的历史记录。事实上,使用 View 可以防止您在不考虑历史性的情况下意外修改表,这是一件好事。

关于用于保留更改历史记录的 SQL 模式模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32906124/

相关文章:

mysql - 如何加快我的 mysql 查询?

mysql - 数据库结构规范化

mysql - 如何将相同的列值分组并映射到具有相应帖子值的新列

用于读取数据库模式的 Java 库

sql - 使用数据透视表填充数据

php - sql count 连接表中精确或相似记录的数量

sql - Hadoop 层次结构之谜

mysql - 另一个SQL教程问题: Field > 0?

sql - 什么时候引用完整性不合适?

mysql - 如何将一个数据库模式映射到另一个数据库模式?