我已将历史记录表添加到我的数据库中。最初我添加了一个名为Deleted的Bit,如果该行被删除则打算将其更新为1,否则每行都是更新。
然后我被告知我们需要记录谁删除了什么时候。所以我添加了Nullable [DeletedBy] [DeletedOn]字段。 在这一点上,我想知道这是否使我的删除位冗余。你可以简单地查询表,如果你想看看哪个行被删除,检查DeletedBy不是Null的位置。
我打算在这个问题中问哪个更好的做法:
拥有额外的位列
使用已存在的可空列来识别已删除的行
但我开始认为这是一种偏好。所以我的问题是,哪个更有效率?如果此表变得庞大,运行是否会带来性能提升:
Select * from MyTable where [Deleted] = 1
在
Select * from MyTable where [DeletedBy] is not null
答案 0 :(得分:2)
这是一种偏好。从技术上讲,datetime
字段是larger而不是bit
字段,但是因为无论如何都需要存储它并不重要。无论性能如何,您都可以索引并得到相同的结果。我个人认为bit
字段是多余的,并使用可空的datetime
。
答案 1 :(得分:1)
如果您添加了' DeletedBy'一段时间之前,你的实时数据库中已经记录了已被删除的记录,那么你需要保留位字段,因为你没有信息输入&#39 ;删除'在这个阶段(我想)。
答案 2 :(得分:1)
你确实需要知道谁删了,所以DeletedBy专栏必须留在那里。这是一个主要问题:你应该保留位列吗?
答案很简单:没有:) 我知道这只是一些列,并没有占用太多,但很多行有点乘以很多位。当然,它可能不会影响您的存储,但在这种情况下没有理由保留冗余数据。
关于您可能拥有的已删除= 1字段,只需将DeletedBy更新为类似“系统”或类似内容,告诉您在执行新字段之前删除了记录
答案 3 :(得分: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
答案 4 :(得分:0)
对于大型表我真的不喜欢使用软删除,我更喜欢归档,但我知道所有项目都不同。
我可能只是在主表上保留'DeletedBy'标志,因为它的开销稍微少一些,并创建一个带有'DeletedBy'和'Timestamp'的DeletionLog表用于审计
这在高读取环境中尤其有用。