0

我正在使用自然键而不是主键的代理键设计 SQL Server 表。我遇到的问题是它不适用于我过去与代理键表一起使用的审计表格式。通常,我将创建一个审计表,该表与被审计的表具有相同的列。正在审计的表上的触发器将新行写入审计表,该行与更新或删除之前的行状态相匹配。为了强制执行完整性,我使用代理键和修改日期列作为表的复合 PK。如果我不使用代理键,那么如果构成复合键的列之一发生更改,我将无法跟踪更改。

Log table example with Surrogate Key:

LogId (PK)
LogType
Data
ModifedDate
ModifedBy

LogAudit Table for Log table with Surrogate Key:

LogId (PK)
LogType
Data
ModifedDate (PK)
ModifedBy 


Log table example with Natural Key:

LogType (PK)
Data
ModifedDate (PK)
ModifedBy

LogAudit Table for Log table with Natural Key:
LogType 
Data
ModifedDate
ModifedBy 

如果 LogType 或 ModifiedDate 更改,您如何跟踪 Audit 表中 Natural Key Log 表记录的更改?

4

2 回答 2

2

我认为您误解了这里的基本概念。

如果确实是表{LogType, ModifedDate}中的自然键Log(情况 2),那么在第一个示例中它是备用键 (AK)(唯一)也是正确的。

所以Log第一个例子中的表格看起来像这样。

LogId        (PK)
LogType      (AK1.1)
Data
ModifedDate  (AK1.2)
ModifedBy 

所以,对于一个给定{LogID}{LogType, ModifedDate}不能改变,反之亦然。

但是,这不是你想要完成的。答案可能是您的Log表一开始就没有“自然键”。


根据评论编辑

作为经验法则,对于创建基于行的审计表:

  1. 复制原始表结构(列)。

  2. ChangedAt(日期时间)和ChangedBy列添加到表中。

  3. ChangedAt列添加到原始 PK。

  4. 将 PK 列的副本添加到表中。这是为了捕获任何 PK 变化。

  5. 使用 ON UPDATE CASCADE 添加 FK,ON DELETE NO ACTION。这可以防止硬删除,因此请使用软删除。

  6. 从原始表上的 AFTER INSERT、UPDATE 触发器填充。

示例 1

      Table: {ID, SomeData}                               ; key: {ID} 
audit table: {ID, SomeData, ChangedAt, ChangedBy, ID_CPY} ; key: {ID, ChangedAt}

示例 2

      Table: {UserID, UserOrderNo, SomeData}                       ; key: {UserID, UserOrderNo} 
audit table: {UserID, UserOrderNo, SomeData, ChangedAt, ChangedBy, UserID_CPY, UserOrderNo_CPY} ; key: {UserID, UserOrderNo, ChangedAt}

示例 3(根据您的描述)

      Table: {LogType, ModifedDate, SomeData}                       ; key: {LogType, ModifedDate} 
audit table: {LogType, ModifedDate, SomeData, ChangedAt, ChangedBy, LogType_CPY, ModifedDate_CPY} ; key: {LogType, ModifedDate, ChangedAt}
于 2013-01-08T19:00:28.443 回答
0

嗯,特别是那个自然键很奇怪。拥有两组密钥(自然密钥和代理密钥)没有任何限制。我会混合两个表,我将使用 LogID 进行 PK,并为 LogType+ModifiedDate 创建一个唯一索引,这样你就有一个用于连接表的字段 PK(我认为这是一件好事),你有你的业务/自然无论您需要什么,密钥(仍然是唯一的,但不是主要的)。

于 2013-01-07T19:54:22.313 回答