gpt4 book ai didi

sql-server - SQL - 审计日志表设计 - 你更喜欢哪个?

转载 作者:行者123 更新时间:2023-12-02 02:27:51 25 4
gpt4 key购买 nike

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

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

Table AuditLog
------------------------------
Id | PK
Description
Created

对于每个任务:

Table ExampleTaskAuditLog
------------------------------
ExampleTaskId | FK PK
AuditLogId | FK PK

和:

Table AnotherExampleTaskAuditLog
------------------------------
AnotherExampleTaskId | 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 字段设置为示例任务的标识,并将 Type 设置为相应的 ExampleTask 枚举值。

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

您对以上内容有何看法?另外,您更喜欢上述哪一种解决方案,为什么?

最佳答案

我不确定我是否完全理解 - 如果 ExampleTaskIdAnotherExampleTaskId 是相同的数据类型,为什么不只使用一个包含以下列的表?

  • 身份证
  • 描述
  • 创建
  • 任务编号
  • 任务类型

除此之外,您的AuditLog绝对 应该有一个TaskType 字段,否则就很难确定更改的类型日志中的一条记录代表。

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

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

关于sql-server - SQL - 审计日志表设计 - 你更喜欢哪个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5041836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com