前一段时间,在工作中,我们不得不将主系统改为" cross-rdbms"。我不确定这是否是正确的术语,但基本上系统只适用于MSSQLServer,但为了编写新的客户端,我们必须使系统能够同时使用MSSQLServer和Oracle。
由于某些原因,我们不会使用ORM。相反,我们使用基于ADO的自定义数据访问层。
在此次更改之前,我们对存储过程,数据库函数,触发器等进行了大量重述。数据库本身存在大量业务逻辑。
我们决定摆脱所有存储过程,触发器和东西,并基本上将数据库简化为仅仅存储层。
为了处理迁移,我们创建了一个.json文件,其中包含我们的数据库模式的表示:表,列,索引,约束等。创建了一个简单的应用程序来编辑该文件。通过使用它,我们可以编辑现有的表和列并添加新的表。
此json文件在我们的存储库中进行了版本控制。执行应用程序时,例程读取文件,在内存中构建数据库的表示。然后,它从实际数据库中读取元数据,将其与内存中表示进行比较,并根据找到的差异生成脚本。
最后,执行脚本,更新数据库架构。
所以,现在是我真正的问题。添加新列时,开发人员需要: - 向POCO类添加一个新属性,表示该表中的一行; - 编辑将表列映射到类属性的方法,添加新的列/属性映射; - 编辑处理数据库命令的类,创建一个指向新列的新参数。
当最初实现此方法时,我考虑根据json文件中的更改自动生成和更新POCO类。这些将使类与数据库模式保持同步,我们不必担心开发人员在创建新列后忘记更新类。
这个功能并没有严格执行,现在我对它有严重的疑虑,主要是因为我一直在研究清洁架构/洋葱架构和领域驱动设计。
从DDD的角度来看,一切都应该是关于域的,而域反过来应该对它的持久性一无所知。
所以,我的问题基本上是:我如何保持我的域模型和我的数据库架构同步,而不会违反DRY并且不使用"以数据库为中心的"接近?
答案 0 :(得分:2)
DDD将重点放在域语言及其在域类中的表示。数据库问题不是DDD的主要问题。
因此,如果打算应用DDD,则从数据库模式生成域类是错误的方向。
这个问题更多的是找到一种合适的方式来管理数据库升级,这与DDD几乎没有关系。基本读/写数据库操作的单元/集成测试可以帮助开发人员记住在更改数据库列时编辑所需文件。