2

阅读了所有关于软删除的赞成与反对的文章,我的头脑在旋转。但这是我知道实现这一目标的唯一方法:

维护外键和用户信息(历史数据)即使用户被删除/不活动,评论、附件和故事表中也有外键。这样仍然可以确定是他写了这篇评论等。

其他信息:

停用的用户无法登录,不会包含在列表中。

但是,如果我使用软删除,那么每次查询该表时,在 sql 语句中的 WHERE 中添加一个额外的列并不是很好。

该怎么办?希望各位大佬可以给点意见。

注意:我使用mysql和ROR

4

2 回答 2

6

如果您“软删除”用户,则不会在每个 SQL 语句的 WHERE 子句中添加额外的列。相反,构建一个仅返回活动用户的视图,并且需要了解活动用户的查询使用该查询。他们不使用基表。

它可能看起来像这样。

create view users_active as
select * from users
where deleted = false;

根据到目前为止您已经完成了多少开发,您可能希望重命名 users 表,并将新视图命名为“users”。类似的东西。. .

alter table users rename to users_all;

create view users as
select user_id, user_name from users_all   -- All columns except "deleted"
where deleted = false;

现在,任何用于命中表“users”的查询将改为命中视图“users”。逻辑数据独立——这就是为什么视图和表在关系模型中共享相同的命名空间。

于 2011-09-28T09:52:35.007 回答
1

这个世界上实现事情的方法有很多,不要以为别人说的总是对的:)

首先,当涉及到评论时——是的,如果您要加入用户表以获取发送评论的人的用户名,使用软删除——是的,获取评论的作者要容易得多。检查它们是否被删除也很容易,因此您也可以在 HTML 中呈现它。另一方面,您也可以将用户名存储在评论表中,这样您就可以避免加入用户表。但是,很难知道用户是否被删除,因为您没有从 users 表中收到该信息。

在 WHERE 中添加附加子句不会杀死任何人。SQL 是为了让你得到你想要的数据,计算机符合用户的需求,而不是相反。因此,如果您认为软删除是您所需要的,请使用它。唯一的“真正”骗局是您将记录保存在数据库中,因此有人可能会说软删除会膨胀数据库。

于 2011-09-28T09:52:13.083 回答