1

我在我的数据库中添加了一个历史表。最初我添加了一个名为 Deleted 的位,如果该行被删除,则打算将其更新为 1,否则每一行都是一个更新。

然后我被告知我们需要记录谁删除了什么时间。所以我添加了 Nullable [DeletedBy] [DeletedOn] 字段。在这一点上,我想知道这是否使我的 Deleted Bit 变得多余。您可以简单地查询表,如果要查看删除了哪一行,则检查 DeletedBy 不是 Null 的位置。

我打算在这个问题上问哪个是更好的做法:

  1. 拥有额外的位列

  2. 使用已经存在的可为空列来识别已删除的行

但我开始认为这是一种偏好。所以我的问题是,哪个更有效?如果这个表变得很大,运行是否有性能提升:

    Select * from MyTable where [Deleted] = 1

超过

    Select * from MyTable where [DeletedBy] is not null
4

5 回答 5

2

这更像是一种偏好。从技术上讲,该datetime字段字段大,bit但是由于您无论如何都需要存储它,所以这并不重要。但是,在性能方面,您可以对其中任何一个进行索引并获得相同的结果。我个人认为该bit字段是多余的并使用 nullable datetime

于 2012-04-11T15:51:17.070 回答
1

如果您前一段时间添加了“DeletedBy”,并且您的实时数据库中已经存在“已删除”的记录,那么您需要保留该位字段,因为您没有信息可以在“删除者”中输入' 在这个阶段(我想)。

于 2012-04-11T15:53:43.177 回答
1

好吧,您确实需要知道谁删除了,因此 DeletedBy 列必须保留在那里。这提出了主要问题:您是否应该保留位列?

答案很简单:不 :) 我知道它只是一些列,它占用的空间不多,但是乘以很多行就是很多位。当然,它可能不会影响您的存储,但在这种情况下没有理由保留冗余数据。

关于您可能拥有的 deleted = 1 字段,只需将 DeletedBy 更新为“系统”之类的内容或告诉您在新字段实施之前记录已被删除的内容

于 2012-04-11T16:00:54.330 回答
1

您基本上是在创建审计跟踪,而且操作很简单。首先,使用审计信息的一些标准字段创建所有审计表。例如:

[audit_id] [int] IDENTITY(1,1) NOT NULL,
[audit_action] [varchar](16) NOT NULL,
[audit_date] [datetime] NOT NULL,
[audit_user_name] [varchar](128) NOT NULL,
--<your fields from the table being audited>

将 audit_date 默认为 的值getdate()。如果您使用 Active Directory 安全性,则默认 audit_user_name 值为suser_sname(),否则您必须在查询中提供此值。

现在,为要审计的表创建一个 INSERT、UPDATE 和 DELETE 触发器。您将把这些值写入您的审计表中。以下是 DELETE 的示例:

CREATE TRIGGER [dbo].[tr_my_table_being_audited_delete] 
   ON  [dbo].[my_table_being_audited] 
   AFTER DELETE
AS 
BEGIN

SET NOCOUNT ON;

INSERT INTO dbo.my_audit_trail_table (audit_action, --<your fields from the table being audited>)
    SELECT  'DELETE', --<your fields from the table being audited>
    FROM    deleted

END
于 2012-04-11T16:31:18.893 回答
0

对于大型表,我真的不喜欢使用软删除,我更喜欢存档,但我知道所有项目都是不同的。

我可能只会在主表上保留“DeletedBy”标志,因为它的开销要小一些,并创建一个带有“DeletedBy”和“Timestamp”的 DeletionLog 表进行审计

这在高读取环境中尤其有益。

于 2012-04-11T16:33:08.867 回答