Sql server SQL-审核日志表设计-您更喜欢哪种?

Sql server SQL-审核日志表设计-您更喜欢哪种?,sql-server,definition,audit,Sql Server,Definition,Audit,对于我正在工作的公司正在建立的项目,我们需要对用户执行的各种任务(对系统中的表所做的更改)进行审核(存储日志)。目前,只有三种不同类型的任务。但这在未来可能会增加 我对此的建议是以下模式表和关系(示例): 对于每项任务: Table ExampleTaskAuditLog ------------------------------ ExampleTaskId | FK PK AuditLogId | FK PK 以及: 基本上,对于我们需要审计的每一种任务,我们都会有一个新的表来保存关系 另

对于我正在工作的公司正在建立的项目,我们需要对用户执行的各种任务(对系统中的表所做的更改)进行审核(存储日志)。目前,只有三种不同类型的任务。但这在未来可能会增加

我对此的建议是以下模式表和关系(示例):

对于每项任务:

Table ExampleTaskAuditLog
------------------------------
ExampleTaskId | FK PK
AuditLogId | FK PK
以及:

基本上,对于我们需要审计的每一种任务,我们都会有一个新的表来保存关系

另一位开发人员建议如下:

Table AuditLog
------------------------------
Id (PK)
Description
Created
ExampleTaskId | NULLABLE
AnotherExampleTaskId | NULLABLE
Type | (an integer id which indicates whether this is a "example task" or a "another example task").
基本上,如果要为“ExampleTask”创建日志,我们会将ExampleTaskId字段设置为示例任务的标识,并将类型设置为相应的ExampleTask枚举值

他之所以建议上表,是因为他在争论诚信(我认为这很好!)和绩效。主要是因为存在FK约束,需要连接一个表才能获得相关日志(是的,这是一个RMDBS-MSSQL)。此外,由于每个日志有两个表,因此还需要两个插入(完整性查找等)。当然,这是正确的。但我看不出问题所在。尤其是性能方面,因为它是最小的。此外,第一年将要存储的日志总数很可能不会超过5-10K。几年后,这些表最多可能包含30-40K行


你对上述问题有何看法?另外,您更喜欢上面哪种解决方案,为什么?

我不确定自己是否完全理解-如果
ExampleTaskId
另一个ExampleTaskId
是相同的数据类型,为什么不让一个表包含以下列

  • 身份证
  • 描述
  • 创造
  • 塔西德
  • 任务类型
除此之外,您的
AuditLog
肯定应该有一个
TaskType
字段,否则将相对难以确定日志中的记录代表的更改类型

此外,除非绝对必要(例如出于性能原因),否则我将避免(在可能的情况下)对表进行非规范化(即,对于给定的任务类型,具有始终为null的列)。相反,我建议对特定于任务的列使用表和联接:

Table ExampleTaskAuditLog
------------------------------
AuditId (PK)
TaskSpecificField
AnotherTaskSpecificField

假设您正在记录事件/任务/操作,而不是对单个表的修改,出于同样的原因,我会选择第一个@Kragen says(向上投票)。但是,如果您正在审核单个表的更改,我会为每个被审核的表使用一个审核表


一个附带的问题,你真的想要那些外键吗?如果删除了表中的项(行),则必须删除该项的审核跟踪。您是否只需要现有项目的审核日志?(“审计”通常意味着“观察他们在干什么”,如果“他们”能抹去他们所有被普遍反对的活动痕迹,即使在华尔街也是如此。)

那么
ExampleTaskAuditLog
另一个ExampleTaskAuditLog
表的目的是存储多对多关系吗?我同意。我将有一个审计表,其中包含所有任务的记录。为每项任务设置不同的表格可能很快就会变得一团糟。你可能认为你只有几件事,但审计人员突然过来告诉你还有15件事需要审计。此外,由于您所说的行数较少,因此不应出现性能下降。
Table AuditLog
------------------------------
Id (PK)
Description
Created
ExampleTaskId | NULLABLE
AnotherExampleTaskId | NULLABLE
Type | (an integer id which indicates whether this is a "example task" or a "another example task").
Table ExampleTaskAuditLog
------------------------------
AuditId (PK)
TaskSpecificField
AnotherTaskSpecificField