推荐阅读
我最终如何
我非常相信,在制作软件时,任何事情都要事先做好,以便以后最大限度地减少工作量。因此,我试图确保在接近我的数据库架构和维护时,它可以保持关系完整性,同时不会过时或过于复杂。
在查看典型的删除方法CASCADE时,这导致了一种不寒而栗。哎呀,对我目前的情况来说有点过头了。我想保持关系图的完整性,但我不想删除每个图只是因为链的一部分是无关紧要的。因此,我选择采用软删除的方式,以确保数据完整性保留,同时记录可以从相关性中删除。我通过向数据库中的每个,叹息,表添加一个“DateDeleted”字段来完成此任务。
转折点
然而,这显然开始增加太多的复杂性并且值得付出努力。我将逻辑放在不应该去的地方,并且不想在整个应用程序中使这些不良做法永久化。简而言之,我将回滚此实现。
在查找天气或不是人们喜欢软删除时,似乎有很多支持。事实上,链接的“相似”帖子顶部是“我总是软删除”的最高投票回答。此外,那里和周围的大部分答案包括某种“isDeleted”或“isActive”类型的方法。
新的实施理念
“好文章”链接涵盖了我实际遇到的一些问题。它还提出了一种替代软删除的方法,我从最佳实践的角度出发。建议使用“存档数据库”,我在查看软删除时实际考虑过。我决定反对它的原因是因为我之前提到的有关CASCADE删除的观点。我很谨慎从数据库中删除整个图表,因为链的一部分被删除了。但是,这个图表至少可以保留在存档中,所以我不确定它是不是真的那么糟糕。
十字路口
那么,我应该继续添加逻辑,逻辑,逻辑......逻辑吗?或者,我是否应该考虑创建归档数据库,其中大多数逻辑只是位于一个非常复杂的图形管理类中来存储/恢复关系对象图?对我来说,后者似乎是最好的做法。
答案 0 :(得分:6)
从理论上讲,软删除绝对是一种简单的方法。但是,没有真正关注如何处理未删除的数据。事实上,它被掩盖了。
在我看来,这是因为错误的问题是焦点。不只是“删除是什么意思”,而是删除了什么。当要删除记录时,实际删除的是图中的节点 - 而不仅仅是单个记录。整个图表整合是人们在“软删除”问题上纠缠于此问题的原因。这些绑带解决方案倾向于隐藏下面的坏疽 - 一个恶化的问题,只会随着时间的推移而恶化。
更糟糕的是,为了伴随软删除逻辑必须全部包含(多次打破各种约定并实现反模式)以解释对象图中可能的中断。而且,“isDeleted”是什么样的业务逻辑?!
我相信这个问题的一个非常强大的解决方案,即在保留对象图的参照完整性的同时删除对象的问题是使用存档模式。在删除对象时,对象将被存档,然后被删除。存档数据库是一个带有元数据的镜像数据库(可以使用时态数据库设计,在这里非常相关),然后会在必要时接收要存档和恢复的对象。
这使得避免列出或包含已删除的对象非常直接,因为相关数据库将不再保留它。现在,应用查找“isDeleted”“isActive”或“DeletedDate”的相同逻辑可以应用于检索到的对象的外键的正确位置(并非所有地方)。当存在外键但对象不存在时,则现在存在逻辑解释和逻辑选项集。显示已删除包含对象和一些操作过程:“还原,删除当前包含对象,视图已删除”。这些选项可以由用户选择,也可以以逻辑方式在代码中明确定义。根据档案数据库的高级程度,可能存在更多选项,例如谁删除它,何时,为什么等等。