2012-03-01 126 views
0

我们正在开发基于DDD原则的应用程序。到目前为止,我们遇到了一些问题,我们无法回答,也无法在互联网上找到答案。处理被动删除更新(即归档而不是删除)

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

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

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

如果我们将所有更新语句设置为“存档旧值”,然后“创建新值”,我们将拥有大量重复值。例如,公司有分支机构,公司是分支机构的总根。如果我更换公司电话号码,那意味着我必须将旧公司及其所有分支归档,并创建一家全新的公司,并为分支机构提供一个物业。起初这可能是一个好主意,但随着时间的推移,会有很多值会堵塞数据库。电话可能是不相关的财产,但更改地址(如果街道名称已更改,但公司仍处于相同的物理位置)是一个更严重的问题。

目前我们使用的是带有EF CF的ASP.NET MVC库,但其中一个要求是我们可以轻松切换或添加WPF或WCF等其他技术。目前,我们使用Automapper将DTO映射到域实体,反之亦然,而DTO则是视图的主要来源,即。我们没有视图模型。应用程序按照DDD原则进行分层,并且在服务层中进行映射。

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

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

谢谢。

+0

为什么技术需要可插拔?挑一个并坚持下去。在确定如何使基础架构可插拔时,您并没有执行DDD。你可以为这一个聚集挑选事件源,而不是其他人,或者你可以处理存储数据的时间模式。取决于你对他们有多舒适,以及它造成多少摩擦(在时间模式的情况下)。 – 2012-03-03 09:53:05

回答

0

说实话,我会创建另一个表,将更新日志插入旧记录和删除记​​录等更改日志更新实时数据。是的,您正在创建大量记录,但是您要从实时记录中提取这些数据并尽可能保持这些数据的精确性。

此外,当涉及到清理和备份时,您可以获得您的实时日期和更改/删除数据,您可以定期备份和修改旧的更改/删除,并根据您同意保留多久更改/删除您正在使用的供应商或业务的数据。

我认为这将是最好的方式去作为你的核心功能将工作在一个更精简的数据集,我假设你的用户不会希望检查记录的修改和删除所有的时间?因此,通过将需要访问的数据分离出来,而不是所有时间,因为所有内容都混杂在一起。

+0

这是我们的团队成员之一的想法。我们一定会考虑这个选择以及事件采购。 – civan 2012-03-04 08:36:45

+0

我会接受你的答案作为我们需要的答案,因为我们没有足够的关于事件采购的知识,但是你的想法很好,而且是我们正在考虑的事情。 – civan 2012-03-04 16:49:11

2

你有没有遇到过event sourcing?听起来好像它可能是有用的,如果你有兴趣跟踪聚合的完整历史。

+0

我从来没有遇到过这个有趣的事!谢谢 – Sparkle 2012-03-01 21:41:20

+0

老实说,我从来没有听说过它。我正在阅读Martin的文章。你能否推荐一些其他的例子(如果可能的话),除了马丁的?或者,也许,你能举一个例子来说明我写的考虑公司和分支机构的问题吗? – civan 2012-03-04 08:39:50

+0

事件源代码形式是CQRS的一部分 - 这里有一大堆链接:http://stackoverflow.com/questions/5043513/cqrs-examples-and-screencasts – 2012-03-04 09:31:01