Database design 重新使用软删除记录

Database design 重新使用软删除记录,database-design,soft-delete,Database Design,Soft Delete,如果我的表结构是: code, description, isdeleted 其中,code是主键 用户创建一条记录,然后稍后将其删除。因为我使用的是软删除,isdeleted将设置为true。然后在我的查询中,我将使用where子句执行select,而不是isdeleted 现在,如果用户去创建一个新记录,他们可能会看到代码“ABC”不存在,所以他们试图重新创建它。由于where子句,select语句找不到它。但会出现主键索引错误 是否应允许用户重复使用该记录?我不这么认为,因为软删除的想法

如果我的表结构是:

code, description, isdeleted
其中,
code
是主键

用户创建一条记录,然后稍后将其删除。因为我使用的是软删除,
isdeleted
将设置为true。然后在我的查询中,我将使用where子句
执行select,而不是isdeleted

现在,如果用户去创建一个新记录,他们可能会看到代码“ABC”不存在,所以他们试图重新创建它。由于where子句,select语句找不到它。但会出现主键索引错误

是否应允许用户重复使用该记录?我不这么认为,因为软删除的想法是保留查询旧数据的记录,以便连接到“已删除”记录仍然有效。如果允许用户重复使用代码,那么他们可以更改描述,这可能会更改历史数据的视图。但是阻止他们使用这些代码是不是太苛刻了


或者我应该使用完全隐藏的主键,然后可以重复使用“代码”字段吗?

我知道很多人认为数据应该是自然的,但是,如果要支持软删除,而不打算在出现这种情况时总是重复使用以前的记录,那么应该使用与数据完全分离的主键

拥有一个离异的主键将允许您拥有多个具有相同“代码”值的记录,并允许您“取消删除”(否则,为什么要麻烦软删除?)一个值,而不用担心覆盖其他内容

就我个人而言,我更喜欢ID的数字自动递增样式,但是有许多支持GUID的人

或者我应该完全使用 隐藏主键,然后是“代码” 字段是否可以重复使用


我想你自己也回答得很好。如果您希望用户能够重新使用已删除的代码,那么您应该有一个单独的主键,用户无法访问。如果代码的唯一性很重要,那么用户通常不应该输入它们。

我认为这取决于您所谈论的特定数据

如果用户试图重新创建代码“ABC”,它是上次使用的、现在已经退出使用的“ABC”,还是完全不同的“ABC”

如果它实际上是指同一个真实世界的“东西”,那么简单地“取消删除”它可能没有什么害处。毕竟,这是同一件事,所以从逻辑上讲,它应该在历史查询和新查询中显示为同一件事。如果你的用户决定不再需要它,那么他们可以删除它,它就会消失。如果在将来的某个时候他们再次需要它,他们可以通过再次添加它来有效地取消删除它

但是,如果新的“ABC”指的是(在现实世界中)与旧的“ABC”不同的东西,那么您可以争辩说“代码”实际上不是主键,在这种情况下,如果您的数据没有提供任何其他自然选择,您也可以创建任意键

这样做的一大缺点是,您必须非常小心,不要让用户使用相同的“代码”创建两个活动记录。

当您选择记录(不包括软删除)以在用户界面/输出文件中显示它们时,请使用where not isdeleted

但是当用户请求插入操作时,执行两个查询

  • 查找所有记录(忽略isdeleted值)

  • 根据第一个查询结果,如果存在,则执行更新(如果不存在,则执行reverse isdeleted标志),或者执行true INSERT


  • 业务逻辑的细微差别取决于您。

    我已经用用户表完成了这项工作,其中电子邮件是一个独特的约束。如果有人取消了他们的帐户,他们的信息仍然需要参考完整性,因此我要设置的内容被设置为true,并在email字段中添加“\u deleted”。这样,如果用户决定将来再次注册,则用户不会遇到问题,并且不会打破唯一约束

    我认为软删除在某些情况下是好的。例如,如果有人从此网站删除了他们的帐户,而您删除了他们的用户,那么他们的所有帖子和答案都将丢失。我认为最好是软删除和显示他们的用户作为“删除的用户”或类似的东西。。。哦,我也相信离婚的主键