我的头脑正在阅读所有专业人士和con的关于软删除的文章。但这是我知道实现这一目标的唯一方法:
维护外键&用户信息(历史数据) 即使用户被删除/不活动,注释,附件和故事表中也有外键。因此,仍然可以确定是谁写了这篇评论等。
其他信息:
停用的用户无法登录,也不会包含在列表中。
但是如果我使用软删除,那么每次查询该表时,在sql语句的WHERE中添加一个额外的列并不是很好。
怎么办?希望你们能提供一些意见。
注意:我使用mysql和ROR
答案 0 :(得分: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;
现在,任何曾经点击“用户”表的查询都会点击“用户”视图。逻辑数据独立性 - 这就是视图和表在关系模型中共享相同名称空间的原因。
答案 1 :(得分:1)
在这个世界上有很多方法可以实现,不要认为别人说的总是如此:)
首先,当涉及到评论时 - 是的,如果您要加入用户表以获取发送评论的人的用户名,则使用软删除 - 是的,获取撰写评论的人更容易得多。 它也很容易检查它们是否被删除,因此您也可以用HTML呈现它。 另一方面,您还可以在注释表中存储用户名,以避免加入users表。但是,由于您没有从用户表中收到该信息,因此很难知道用户是否已被删除。
在WHERE中添加附加子句不会杀死任何人。 SQL是为了获得您想要的数据,计算机符合用户的需求,而不是相反。因此,如果您认为软删除是您所需要的,请使用它。唯一的“真实”骗局是您将记录保存在数据库中,因此有人可能会说软删除会使数据库膨胀。