我正在开发一个重写现有遗留软件的项目。旧版软件主要由 SQL 数据库上的 CRUD 操作(创建、读取、更新、删除)组成。
尽管是基于 CRUD 的编码风格,但遗留软件非常复杂。这种软件复杂性不仅是问题域本身复杂性的结果,也是糟糕(并且经常近乎疯狂)设计决策的结果。这种糟糕的编码导致数据库中的数据缺乏完整性。这些完整性问题不仅在关系(外键)方面,而且在单行内的完整性方面。例如,“x”列的含义与“y”列的含义完全矛盾。(在您问之前,答案是“是”,我已经分析了问题域并正确理解了这些列的含义和目的,并且似乎比原来的软件开发人员更好)。
在编写替代软件时,我使用了域驱动设计和命令查询职责分离的原则,主要是由于域的复杂性。例如,我设计了聚合根以在写入模型中强制执行不变量,命令处理程序执行“交叉聚合”一致性检查,查询处理程序以适合各种屏幕的方式查询有意去规范化的数据等。
就准确性和易用性而言,替换软件在输入新数据时运行良好。在这方面,它是成功的。但是,由于现有数据充满了完整性问题,涉及现有数据的操作经常会因抛出异常而失败。这通常是因为无法从存储库中读取聚合,因为传递给构造函数的数据违反了聚合的不变量。
我应该如何处理这些“违反规则”的遗留数据。旧软件在这方面运行良好,因为它几乎没有进行验证。由于缺乏验证,没有经验的用户很容易输入无意义的数据(而有经验的用户变得非常有价值,因为他们多年理解它的“特质”)。
数据本身很重要,不能丢弃。我能做些什么?我已经尝试在进行过程中解决完整性问题,这在某些情况下有效,但在其他情况下几乎是不可能的(例如,由于原始开发人员决定不保存数据,因此数据库中完全丢失了数据)。数据完整性问题的绝对数量是压倒性的。
我能做些什么?