关于数据库设计:重复使用软删除的记录

关于数据库设计:重复使用软删除的记录

Re-using soft deleted records

如果我有一个表结构是:

1
code, description, isdeleted

其中code是主键。

用户创建一条记录,然后将其删除。由于我正在使用软删除,因此isdeleted将设置为true。然后在查询中,我将使用where子句and not isdeleted进行选择

现在,如果用户去创建新记录,他们可能会看到代码" ABC"不存在,因此他们尝试重新创建它。由于where子句,因此select语句找不到它。但是会出现主键索引错误。

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

还是应该使用完全隐藏的主键,然后可以重新使用"代码"字段?


我知道很多人都认为数据应该是自然的,但是如果要支持软删除,而又不想在重用时重复使用以前的记录,则应该使用与数据完全独立的主键。这种情况出现了。

离婚的主键将允许您拥有具有相同"代码"值的多个记录,并且将使您可以"取消删除"一个值(否则,为什么要进行软删除?)而不必担心会覆盖其他内容。

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


Or should I be using a completely
hidden primary key and then the 'code'
field can be re-used?

我认为您已经很好地回答了这个问题。如果您希望用户能够重复使用已删除的代码,那么您应该拥有一个单独的主键,该键对用户不可见。如果唯一的代码很重要,那么用户通常无论如何都不应该输入它们。


我认为这取决于您正在谈论的特定数据。

如果用户试图重新创建代码" ABC",是上次使用的SAME" ABC"现在已经退出淘汰,还是完全不同的" ABC"?

如果它实际上指的是真实世界中的"事物",那么简单地"删除"它可能不会有任何危害。毕竟-这是同一件事,因此从逻辑上讲,它应该在历史查询和新查询中显示为同一件事。如果您的用户决定不再需要它,则可以将其删除,然后它就会消失。如果将来某个时候他们再次需要它,则可以通过再次添加它来有效地取消删除它。

但是,如果新的" ABC"(在现实世界中)所指的东西与旧的" ABC"不同,那么您可能会认为"代码"实际上不是主键,在这种情况下,如果您的数据没有提供任何其他自然选择,您也可以创建一个任意密钥。

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


我已经通过用户表完成了此操作,其中电子邮件是唯一的约束。如果有人取消那里的帐户,则仍然需要他们的信息来确保参照完整性,因此将"我"设置为is_deteled为true,然后在电子邮件字段中添加" _deleted"。以这种方式,如果用户决定将来再次注册,则对于用户来说没有问题,并且唯一约束没有被破坏。

我认为软删除在某些情况下是很好的。例如,如果某人从该站点删除了他们的帐户,而您删除了该用户,则他们的所有帖子和答案都将丢失。我认为将其软删除并将其用户显示为"已删除的用户"或类似的东西要好得多...哦,我也相信离婚的主键


选择记录(不包括软删除)以在用户界面/输出文件中显示它们时,请使用未删除的位置。

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

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

  • 根据第一个查询结果,如果存在则执行UPDATE(并带有反向isdeleted标志),或者如果不存在则执行真正的INSERT。

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


    推荐阅读

      linux系统删除的命令?

      linux系统删除的命令?,软件,系统,名称,工具,不了,命令,文件夹,电脑,通用,信

      linux删除命令文件夹?

      linux删除命令文件夹?,系统,数据,通用,文件夹,命令,文件,环境,百度,不了,名

      linux删除本行命令?

      linux删除本行命令?,系统,本行,档案,命令,资料,商业,文件,终端,目录,文件名,L

      linux删除第一行命令?

      linux删除第一行命令?,单位,系统,命令,标的,不了,数字,连续,名称,档案,文件,m

      linux删除本行命令?

      linux删除本行命令?,系统,本行,档案,命令,资料,商业,文件,终端,目录,文件名,L

      linux删除命令文件夹?

      linux删除命令文件夹?,系统,数据,通用,文件夹,命令,文件,环境,百度,不了,名

      linux删除第一行命令?

      linux删除第一行命令?,单位,系统,命令,标的,不了,数字,连续,名称,档案,文件,m

      linux里删除区间命令?

      linux里删除区间命令?,系统,命令,情况,档案,不了,名称,目录,文件,文件夹,分

      linux命令安条件删除?

      linux命令安条件删除?,系统,命令,不了,通用,名称,文件夹,文件,目录,软件,子

      linux文件夹删除命令?

      linux文件夹删除命令?,系统,命令,不了,档案,名称,通用,文件夹,文件,目录,指

      删除命令linux命令?

      删除命令linux命令?,系统,不了,档案,名称,命令,文件夹,文件,环境,数据,目录,l

      linux删除最近命令?

      linux删除最近命令?,档案,名称,不了,命令,文件,系统,目录,文件夹,指令,参数,l

      删除小文件linux命令?

      删除小文件linux命令?,系统,工作,地址,信息,命令,通用,目录,文件,文件夹,功

      linux快速删除命令行?

      linux快速删除命令行?,系统,软件,名称,数据,命令,文件,档案,不了,电脑,通用,l

      删除linux文件命令?

      删除linux文件命令?,名称,不了,文件夹,命令,文件,目录,方法,指令,子目录,选

      linux下删除用户命令?

      linux下删除用户命令?,系统,代码,邮箱,用户组,命令,用户,名称,管理,电脑,账

      linux的删除所有命令?

      linux的删除所有命令?,不了,系统,名称,命令,文件夹,文件,目录,档案,数据,环

      linux删除类型命令?

      linux删除类型命令?,系统,档案,命令,文件,名称,环境,数据,不了,目录,文件夹,

      linux命令删除文件夹?

      linux命令删除文件夹?,系统,名称,环境,文件夹,不了,命令,文件,数据,档案,目

      linux删除用什么命令?

      linux删除用什么命令?,档案,系统,命令,文件夹,文件,不了,名称,目录,终端,指