处理被动删除更新(即归档而不是删除)

时间:2012-03-01 09:50:49

标签: asp.net-mvc-3 domain-driven-design ef-code-first dto

我们正在开发基于DDD原则的应用程序。到目前为止,我们遇到了一些问题,我们无法回答,也无法在互联网上找到答案。

我们的应用程序旨在成为多家公司的云应用程序。

其中一个要求是数据库没有物理删除。我们通过将实体的Active属性设置为false来进行被动删除。它负责选择,插入和删除操作,但我们不知道如何处理更新操作。

更新意味着更改属性值,但也意味着删除过去的值,并且有许多原因我们不希望这样。其中一个主要原因是会计目的。

如果我们将所有更新语句设为"存档旧值"然后"创造新价值"我们会有很多重复的值。例如,公司有分支机构,而公司是分支机构的汇总根。如果我更改公司电话号码,这意味着我必须归档旧公司及其所有分支机构,并创建一个全新的公司,只有一个属性的分支机构。一开始这可能是一个好主意,但随着时间的推移,会有许多值会阻塞数据库。电话可能是一个不相关的财产,但更改地址(如果街道名称已更改,但公司仍在同一物理位置)是一个更严重的问题。

目前我们正在使用带有EF CF的ASP.NET MVC作为存储库,但其中一个要求是我们能够轻松切换或添加其他技术,如WPF或WCF。目前,我们使用Automapper将DTO映射到域实体,反之亦然,DTO是视图的主要来源,即。我们没有视图模型。应用程序根据DDD原则分层,映射发生在服务层。

另一个要求是我们在数据库中创建一个初始实体然后填充值,但整个聚合应该作为一个整体存储。

任何意见或建议表示赞赏。 我们也欢迎任何需求的变化(因为这是一个内部项目,而不是客户)和架构,但只有在绝对必要的情况下。

谢谢。

2 个答案:

答案 0 :(得分:2)

你有遇到event sourcing吗?如果您有兴趣跟踪聚合的完整历史记录,那么它听起来很有用。

答案 1 :(得分:0)

老实说,我会在更新实时数据之前创建另一个表,该表是将旧记录和删除记​​录等插入其中的更改日志。是的,您正在创建大量记录,但您正在从实时记录中抽取此数据并尽可能保持此数据的精简。

此外,当涉及清理和备份时,您有实时日期和更改/删除数据,您可以定期备份和修剪旧的更改/删除并缩小其大小,具体取决于您同意保持更改的时间/与您正在使用的供应商或企业一起删除数据。

我认为这是最佳方式,因为您的核心功能将用于更精简的数据集,而且我假设您的用户不想一直检查记录的修订和删除?因此,通过分离您在需要时访问的数据而不是所有时间,因为所有内容都是混合的。