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

问题描述 投票:0回答:2

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

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

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

sql-server database sql-server-2014
2个回答
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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.