层次结构类别子类别(parentId)论坛数据库设计

时间:2017-12-25 15:01:02

标签: sql-server database sql-server-2014

我正在建立一个论坛数据库。所需的表是问题和注释表。问题表有IsDeleted标志,评论表有ParentId标志(PS评论表基于类别 - 子类别层次结构 - 每个评论都有一个IsDeleted(如果& #39; s为null然后它位于层次结构的顶部))。

我想知道在删除评论和删除问题时什么是合适的。例如,当我删除一个问题时,很明显我会将问题标记为IsDeleted(我应该将评论也删除为IsDeleted吗?)。但是,当我删除评论时,我应该仅将当前评论标记为{{1}}还是当前评论及其所有后代?

PS:请用一些示例代码支持您的建议:)

2 个答案:

答案 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

结果如下

enter image description here

答案 1 :(得分:0)

我们目前在我们的数据库中有一个类似的模型,我建议只为用户删除的东西设置IsDeleted而不是从属对象。为什么?恢复。如果在用户删除问题时将注释标记为已删除,如果还原问题,如何正确恢复正确的注释?