我有一个表,称之为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。
答案 0 :(得分:1)
您的问题的第一部分很简单:使用像这样的修订列几乎是行业标准,至少在我工作的地方。
至于查看最新的记录,不幸的是没有语法上很漂亮的方法(这很奇怪,因为这一直出现,请参阅greatest-n-per-group!)。但是如果你有一个基础记录表:
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选择行”会显示一堆S-O链接,这个通常与我在这里写的内容一致:SQL Select only rows with Max Value on a Column。如果您想了解更多信息,请随意浏览我提供的标记部分,S-O帖子和Google查询!
答案 1 :(得分:0)
您可以尝试这样的方法:
创建另一个名为PHistory的表,该列与原始列完全相同,另外一列用于修订号(int)或更新日期(datetime),您还可以将ID列添加为主列键
每次主表中有更新时,在主表上使用update触发器将P表中的所有值复制到PHistorty表中
创建查询时,这将使事情变得清晰。当你想要最新的版本时,你总是从P表中选择,当你想看到一些修订时,你可以从PHistorty中选择。