3

我有一个表,叫做它P,它当前有一系列记录,每个记录都有一个唯一的键:

Key1 value1
Key2 value2
Key3 value3

依此类推,其中每个值实际上是一组列。

我现在需要使这些记录可变,并将更改历史记录为审计日志。

我认为最好的方法是进行修改P,使其成为

Key1 Rev1 value1
Key1 Rev2 value1a
Key2 Rev1 value2
Key2 Rev2 value2a

等等。任何给定键的最新记录将始终具有最高修订标记。

问题是,这破坏了只期望当前记录的查询的可比性。我正在考虑重命名P为类似PComplete并创建一个视图,该视图P只会为每个键选择最高修订标记,并省略修订标记,从而模拟原始表P

因为我主要不是 SQL 专家:

这是一种可靠的技术吗?设计新视图P以使其为基本视图中的每个当前键选择最新(称为最大)行的最佳方法是什么PBase

网站指针是最受欢迎的;我不知道谷歌用什么术语来找到这种解决方案的最佳实践方法。

注意:这是 Microsoft SQL Server 2008 R2。

4

2 回答 2

1

您的问题的第一部分很简单:使用这样的修订列几乎是行业标准,至少在我工作的地方是这样。

至于查看最新的记录,不幸的是,没有语法上漂亮的方法来做到这一点(这很奇怪,因为这一直出现,请参阅!)。但是,如果您有一个基础记录表:

CREATE TABLE Records (
RecordID int,
RevisionID int,
ValueA varchar(50),
...
)

一种只显示最新版本(以及我个人这样做)的方法,就像你说的,通过一个视图:

CREATE VIEW CurrentRecords AS
SELECT r.RecordID,
   r.ValueA
   ...
FROM Records AS r
INNER JOIN (
    SELECT RecordID, MAX(RevisionID) AS RevisionID
    FROM Records
    GROUP BY RecordID
) AS maxRev on maxRev.RecordID = r.RecordID AND maxRev.RevisionID = r.RevisionID

您首先通过记录 ID 对最新修订的修订 ID 执行查找,然后使用该链接实际获取记录。只要 RevisionID 列上有索引,就不会出现性能问题(这将是快速索引查找,而不是表扫描,以确定最大修订 ID)。

谷歌搜索“sql select row with max value”会显示一堆 SO 链接,这个链接通常与我在这里写的一致:SQL Select only rows with Max Value on a Column。如果您想了解更多信息,请随意浏览我提供的标记部分、SO 帖子和谷歌查询!

于 2013-10-16T20:15:49.657 回答
0

您可以尝试这样的方法:

  • 创建另一个名为 PHistory 的表,其列与原始列完全相同,再加上一列用于修订号 (int) 或更新日期 (datetime),您还可以添加 ID 列作为主键

  • 每次主表有更新时,在主表上使用更新触发器将所有值从 P 表复制到 PHistorty 表

当您创建查询时,这将使事情变得干净。当您想要最新版本时,您总是从 P 表中选择,当您想要查看某些修订时,您总是从 PHistorty 中选择。

于 2013-10-17T10:08:30.877 回答