1

我最近遇到了一个非常有趣的问题,涉及数据库设计。我已经更改了表格名称以简化问题,所以让我这样描述:我有 2 张桌子,水果和蔬菜每个商店都存储水果或蔬菜是否好吃。

现在假设有人通过我的应用程序的 UI 不断更改 IsTasty 设置,并且管理层要求能够查看某人最后一次更改它的时间和谁。这里棘手的部分是虽然我们忽略了表上的其他数据,但还有其他数据,我们不想跟踪表上的任何数据何时更改,只跟踪这一列。

解决此问题的最佳方法是什么?

我在这里描述了 ER 图的问题:

4

6 回答 6

1

我喜欢acts_as_versioned 插件在Rails 中的操作方式。它最接近您的解决方案 2,带有一个附加的版本号字段。你基本上有你的 fruits 表和你的 fruits_versions 表。每次更新 fruits 中的一行时,您都会在 fruits_versions 表中插入相同的数据,并增加版本号。

如果您想向表中添加更多字段或跟踪其他值,我认为它比解决方案 3 方法更具可扩展性。解决方案 4 是一种非关系解决方案,您可能会保留这样的审核日志。

与保留版本相反的另一种方法是跟踪更改,就像颠覆或版本控制系统所做的那样。如果您经常需要知道某事是否从 a 更改为 b,而不是更改为什么,这可以使您更容易。我想这意味着真正的答案是“这取决于”数据的使用方式。

于 2009-12-09T16:48:54.083 回答
0

如果您使用的是 SQL Server 2008,您是否看过 CDC(更改数据捕获)?

于 2009-12-09T16:39:43.647 回答
0

对于SQL Server,我使用AutoAudit生成触发器。审计表包含历史和视图可用于显示更改(AutoAudit 自动为已删除的行生成视图)。

于 2009-12-09T17:00:47.870 回答
0

Trigger中,有一种方法可以查看修改了哪些列。

于 2009-12-09T16:47:49.583 回答
0

使用 SQL Server 2005 及更高版本,您可以使用这样的 if 语句创建触发器:

IF UPDATE(IsTasty)
BEGIN
        Insert INTO Log (ID, NewValue) VALUES (@ID, @NewValue)
END
于 2009-12-09T16:49:29.450 回答
0

一种方法是向这些表添加触发器。在触发器中检查您感兴趣的列是否已更改。如果它已更改,请在另一个跟踪更改的表中插入一行。更改跟踪表可能想要存储数据,例如更改的列的名称、先前的值、新值和更改的日期。

于 2009-12-09T16:50:29.183 回答