我需要设计一个历史表来跟踪编辑时在特定记录上更改的多个值.

Example:
The user is presented with a page to edit the record.

Title: Mr.
Name: Joe
Tele: 555-1234
DOB: 1900-10-10

如果用户更改了这些值中的任何一个,我需要跟踪旧值并记录新值.

我想用这样一张桌子:

History
---------------

id
modifiedUser
modifiedDate
tableName
recordId
oldValue
newValue

这样做的一个问题是,每次编辑都会有多个条目.

我还在考虑在历史表中保留一行的副本,但这似乎也没有效率.

有什么 idea 吗?

谢谢!

推荐答案

您应该定义您感兴趣的效率类型:您可以拥有存储空间效率、记录历史所需的工作效率(交易成本)或以特定方式查询记录历史的时间效率.

我注意到,在建议的历史记录表中有一个表名,这意味着要记录多个表的历史记录,这将排除在历史记录表中存储记录的精确副本的选项,除非要跟踪的所有表始终具有相同的 struct .

如果单独处理列,即只 for each 历史记录记录一个列值,则必须设计一种能够准确表示您遇到的每个列值的多态数据类型.

如果存储空间的效率是您主要关心的问题,那么我会将历史分为多个表.这意味着要将新的列值表链接到编辑事件表和列定义表.编辑事件表将记录用户和时间戳,列定义表将记录表、列和数据类型.正如@njk所指出的,您不需要旧的列值,因为您总是可以查询以前的编辑以获得旧的值.这种方法有望节省空间的主要原因是假设,一般来说,用户将编辑可用字段的一小部分.

如果查询效率是您主要关心的问题,我会为您正在跟踪的每个表设置一个历史表,并 for each 历史表添加一个用户和时间戳字段.就编辑的交易成本而言,这也应该是有效的.

Database相关问答推荐

TYPO3 OOPS,出现错误!编码:202402180809040864ba5c

DynamoDB 扫描 - 具有相同分区键的项目按顺序返回

安装postgresql用于使用和调试Apache-AGE

Spring Data JPA 对 SQL 注入安全吗

任何用于存储过程的静态代码分析工具?

PostgreSQL WHERE IN LIKE 查询

预测下一个自动插入的行 ID (SQLite)

即使使用列入白名单的 IP,也无法连接到 Azure SQL 数据库

如何找到 Oracle 数据库的 URL?

从 activerecord 获取索引哈希

如何关闭 Rails 中的updated_at列?

是否可以在ORDER BY子句之后放置任何可能造成安全风险的内容?

将数据库表用作作业(job)队列的最佳方式是什么?

如何处理 SQL Server 中列名中的空格?

为什么会一直出现Table is marked for deletion的消息?

从数据库行在 Golang 中创建map

面向文档的数据库是否旨在取代关系数据库?

可以将 SQLAlchemy 配置为非阻塞吗?

在一个查询中使用 group by 计算多列

如何在我的数据库中避免 NULL,同时还表示丢失的数据?