问题标签 [soft-delete]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
database-design - 重用软删除记录
如果我有一个表结构是:
code
主键在哪里。
用户创建一条记录,然后将其删除。因为我使用的是软删除,所以isdeleted
将设置为 true。然后在我的查询中,我将使用 where 子句进行选择and not isdeleted
现在,如果用户去创建一条新记录,他们可能会看到代码“ABC”不存在,因此他们尝试重新创建它。由于 where 子句,select 语句不会找到它。但是会出现主键索引错误。
是否应该允许用户重新使用记录?我认为不会,因为软删除的想法是保留对旧数据的查询记录,以便连接到“已删除”记录仍然有效。如果允许用户重新使用代码,那么他们可以更改描述,这可能会改变历史数据的视图。但是完全阻止他们使用该代码是否太苛刻了?
或者我应该使用完全隐藏的主键,然后可以重复使用“代码”字段?
sql - 数据库记录的物理与逻辑(硬与软)删除?
与实际或物理删除记录相比,对记录进行逻辑/软删除(即设置一个表明记录已删除的标志)有什么优势?
这是常见的做法吗?
这安全吗?
sql - 级联软删除
SQL 一直有一个很棒的特性:级联删除。你提前计划好,什么时候删除,BAM!无需担心所有这些依赖记录。
然而,现在实际上删除任何东西几乎是禁忌。您将其标记为已删除并停止显示。不幸的是,当存在依赖记录时,我无法找到可靠的解决方案。我总是手动编写复杂的软删除网络。
有没有我完全错过的更好的解决方案?
django - 同表 Django ORM 软删除方法好吗?
我正在使用以下设置在 Django 中实现软删除。我对幕后的 Django 不是很熟悉,所以我很感激任何关于我可能遇到的陷阱的反馈。我对 QuerySet 进行子类化特别不舒服。
基本思想是第一次调用delete
on aMyModel
会改变当前的日期时间MyModel
。date_deleted
一秒钟delete
实际上会删除该对象。(捕获 adelete
需要两个覆盖,一个在对象上,一个在 上QuerySet
,这可以绕过对象的delete
方法。)由于默认管理器会隐藏已删除的对象,因此已删除的对象会消失,并且必须通过deleted_objects
管理器显式请求。
使用此设置需要定义DeletionQuerySet
和DeletionManager
添加date_deleted
、objects
和deleted_objects
到您的模型。
谢谢,
PS,忘了提到这种从默认管理器中过滤对象的方法是强烈反对的!
mysql - 如何通过软删除项目解决此缩放问题?
我有一个数据库,其中大多数表都有表的删除标志。因此系统会软删除项目(因此除非管理员等,否则它们将不再可访问)
让我担心的是几年后,当表格更大时,系统的整体速度将会降低。
我能做些什么来抵消这样的影响。
- 我是否索引删除字段?
- 我是否将已删除的数据移动到相同的删除表中并在取消删除时移回?
- 随着时间的推移,我是否会将数据分散到几个 MySQL 服务器上?(基于增长)
我会很感激任何和所有的建议或故事。
更新:
所以分区似乎是关键。但是分区不会只创建两个“表”,一个包含已删除项目,一个不包含已删除项目。
因此,随着时间的推移,删除的分区会变大,偶尔从中获取数据会很慢(随着时间的推移会变慢)
速度差异是我应该担心的吗?因为我通过某个键值获取大部分(如果不是全部)数据(有些是搜索,但对于此设置它们可能很慢)
php - PHP Doctrine SoftDelete - 包括已删除的记录?
如果我有一个 PHP Doctrine 对象充当 SoftDelete,是否可以在某些查询的结果中包含已删除的项目?我正在寻找的是这样的东西......
对于我希望排除已删除记录的大多数查询,这样的事情很有用,但有时(例如,对管理员)我希望能够包含已软删除的记录。是否有一些使用 SoftDelete 的好方法可以做到这一点,或者我应该简单地在大多数查询中添加一个额外的 where 子句?
mysql - 在 MySQL 中删除软删除行有什么好处?
我在 MySQL dB 中有一个表,用于记录一个人单击某些导航选项卡的时间。每次它都会软删除最后一个条目并插入一个新条目。软删除的原因是出于分析目的,因此我可以随着时间的推移跟踪用户点击的位置/时间/内容。软删除与新条目的比例为 9:1,表大小目前约为 20K,但增长迅速。
所以我的问题是:如果删除软删除条目将有助于优化涉及该表的任何查询?目前有一个将 4 个表连接在一起,并且只需要新条目。由于可以对备份副本执行软删除分析,因此我不需要生产 dB 上的这些行。
nhibernate - NHibernate 级联软删除
我尝试通过实现 DeleteEvent 侦听器来进行软删除
公共类 MyDeleteEventListener : DefaultDeleteEventListener
{
}
但它不会从一对多、可能对多的关系中软删除实体。有人有解决方案吗?
unit-testing - 如何在不设置 NHibernate 会话的情况下测试软删除事件侦听器
我已经根据此来源覆盖了默认的 NHibernate DefaultDeleteEventListener:http: //nhibernate.info/blog/2008/09/06/soft-deletes.html
所以我有
如何在不配置 NHIbernate 会话的情况下仅测试这段代码?
entity-framework - 使用 EntityFramework 软删除(IsHistorical 列)
我正在使用一个数据库,设计师决定用 IsHistorical 位列标记每个表。没有考虑适当的建模,也无法更改架构。
这在开发与导航属性交互的 CRUD 屏幕时会引起一些摩擦。我不能简单地拿一个产品然后编辑它的 EntityCollection 我必须在整个地方手动编写 IsHistorical 检查,这让我发疯。
添加也很糟糕,因为到目前为止,我已经编写了所有手动检查以查看添加是否只是软删除,因此我可以切换 IsHistoric,而不是添加重复的实体。
我考虑过的三个选项是:
修改 t4 模板以包括 IsHistorical 检查和同步。
在 ObjectContext 中拦截删除和添加,切换 IsHistorical 列,然后同步对象状态。
订阅 AssociationChanged 事件并在此处切换 IsHistorical 列。
有没有人有这方面的经验或者可以推荐最轻松的方法?
注意:是的,我知道,这是不好的建模。我已经阅读了您所拥有的有关软删除的相同文章。它很臭我必须处理这个要求,但我做到了。我只想要最轻松的方法来处理软删除,而无需为数据库中的每个导航属性编写相同的代码。
注意#2 LukeLed 的答案在技术上是正确的,尽管它迫使你进入一个非常糟糕的穷人 ORM、无图形、模式。问题在于,现在我需要从图中删除所有“已删除”的对象,然后对每个对象调用 Delete 方法。那并不能真正为我节省那么多手动仪式编码。现在我没有编写手动 IsHistoric 检查,而是收集已删除的对象并循环访问它们。