我正在建立一个论坛数据库。所需的表是问题和注释表。问题表有IsDeleted
标志,评论表有ParentId
标志(PS评论表基于类别 - 子类别层次结构 - 每个评论都有一个IsDeleted
(如果& #39; s为null然后它位于层次结构的顶部))。
我想知道在删除评论和删除问题时什么是合适的。例如,当我删除一个问题时,很明显我会将问题标记为IsDeleted
(我应该将评论也删除为IsDeleted
吗?)。但是,当我删除评论时,我应该仅将当前评论标记为{{1}}还是当前评论及其所有后代?
PS:请用一些示例代码支持您的建议:)
答案 0 :(得分:0)
您可以使用数据库触发器并轻松更新线程(ParentId)下的帖子。 只需使用AFTER UPDATE触发器并检查IsDeleted列是否更新。因此,您可以在该帖子下将帖子更新为已删除
但是如果你有分析,比如有多少帖子因垃圾邮件而被删除等,最好保留删除列的原因。或者只是不更新子帖但要检查他们的状态,总是阅读旁边的父母(总是表现不佳)
以下是两个表解决方案的示例触发器代码
create trigger post_delete on thread after update
as
begin
update post
set isDeleted = 1
where threadId in (
select d.threadId
from inserted i
inner join deleted d
on i.threadId = d.threadId
where i.isDeleted = 1 and
d.isDeleted is null
)
end
我正在为第二种情况添加元数据,其中所有帖子都存储在单个表中,并在下面的修改后的触发器中添加递归CTE 我希望它有所帮助
create table Posts (
PostId int,
ParentId int,
Title nvarchar(256),
Text nvarchar(max),
IsDeleted bit
)
以下AFTER UPDATE SQL trigger适用于SQL表,如上所述
create trigger posts_delete on posts after update
as
begin
with tbl as (
select d.PostId
from inserted i
inner join deleted d
on i.PostId = d.PostId
where i.IsDeleted = 1 and
d.IsDeleted is null
), cte as (
select * from Posts where PostId in (select PostId from tbl)
union all
select p.*
from Posts p
inner join cte
on cte.PostId = p.ParentId
)
update posts
set isDeleted = 1
where PostId in (
select PostId from (
select * from cte
) t
)
end
go
我使用以下示例数据
测试了SQL脚本insert into Posts select 1, null, 'Triggers','',NULL
insert into Posts select 2, null, 'Databases','',NULL
insert into Posts select 3, 1, 'DDL Trigger','SQL',NULL
insert into Posts select 4, 3, 'What is DDL?','DDL',NULL
select * from Posts
update Posts set IsDeleted = 1 where PostId = 3
select * from Posts
结果如下
答案 1 :(得分:0)
我们目前在我们的数据库中有一个类似的模型,我建议只为用户删除的东西设置IsDeleted而不是从属对象。为什么?恢复。如果在用户删除问题时将注释标记为已删除,如果还原问题,如何正确恢复正确的注释?