Nhibernate 说服死硬的DBA对大多数CRUD与存储过程、视图和函数使用ORM

Nhibernate 说服死硬的DBA对大多数CRUD与存储过程、视图和函数使用ORM,nhibernate,linq-to-sql,entity-framework,orm,Nhibernate,Linq To Sql,Entity Framework,Orm,我已经与NHibernate、LINQ到SQL和实体框架合作了相当长的一段时间。虽然我看到了使用ORM来保持开发工作快速进行、代码简单、成本最小化的好处,但我仍然发现很难让一个死硬的SQL dba相信ORM的优势。从我的观点来看,ORM可以用于至少90-95%的数据访问,在适当的情况下,这些非常棘手的事情需要在过程或函数中完成。我决不是那种说我们必须在ORM里做所有事情的人 问题:有什么更好的理由可以说服一位老派dba,使用ORM并不是程序员构思过的最糟糕的想法 向他们解释,为应用程序执行的每个

我已经与NHibernate、LINQ到SQL和实体框架合作了相当长的一段时间。虽然我看到了使用ORM来保持开发工作快速进行、代码简单、成本最小化的好处,但我仍然发现很难让一个死硬的SQL dba相信ORM的优势。从我的观点来看,ORM可以用于至少90-95%的数据访问,在适当的情况下,这些非常棘手的事情需要在过程或函数中完成。我决不是那种说我们必须在ORM里做所有事情的人


问题:有什么更好的理由可以说服一位老派dba,使用ORM并不是程序员构思过的最糟糕的想法

向他们解释,为应用程序执行的每个操作创建存储过程在多个级别上都是不可维护的

  • 如果模式发生了变化,这很困难 跟踪所有存储的 受影响的程序
  • 不可能确保多个 存储过程的创建不是为了 做同样的事情,或者稍微做一点 更改现有存储的 这个程序会有严重的后果 后果
  • 很难确保 应用程序和数据库正在运行 部署后同步

  • 动态SQL有所有这些问题和更多问题。

    如果你想说服他,首先你需要了解他在使用ORM时遇到了什么问题。如果不能解决他所面临的问题,那么给你一份通用福利清单是不可能有帮助的

    然而,关于他的问题,我的第一个猜测是,这会阻止他进行任何优化,因为您直接访问表,因此他没有工作的抽象层,因此如果表需要更改或(取消)规范化,那么他无法在不破坏您的应用程序的情况下进行操作


    如果您想知道为什么DBA会有这种感觉,以及如何回应,那么这与他走到您面前说他希望您将类中的所有私有字段都公开,并且您不能在未事先询问的情况下更改任何字段大致相同。想象一下,他怎样才能说服你这是个好主意,然后对他使用同样的论点。

    由于可预测的缓存机制,过去的过程效率更高。然而,许多DBA过度使用了这些过程,在IF命令中引入了大量分支逻辑,导致出现无法缓存的情况

    其次,只有当您计划跨多个平台跨数据逻辑时,过程才有用;例如,网站和单独的客户端应用程序。如果您只是在制作一个web应用程序,那么这些过程会引入不必要的抽象级别和更多需要处理的事情。当通过ORM调整单个模型时,必须先调整一个表,然后调整一个过程,然后调整一个数据模型就足够了


    最后,过程将代码与数据库紧密耦合。如果要迁移到其他数据库,则必须迁移所有过程,其中一些过程可能需要大量重写。使用ORM,这种迁移要容易得多,因为您可以在前端应用程序不知道差异的情况下拉出后端并安装新的ORM。

    我想,“说服一个死硬的DBA使用ORM”的第一个问题是:DBA也是一个在DB之外工作的程序员吗“使用ORM”?如果不是的话,DBA为什么会将他们的大部分工作交给其他人,从而显著降低他们对公司的整体有用性?他们不会

    在任何情况下,让任何工程师相信任何事情的最佳方法都是使用经验数据。为了演示的目的,将实际应用程序的一些部分移植到ORM中,然后建立一个原型,并实际证明您的观点

    在另一点上,我认为如果你试图将对象关系阻抗作为使用对象关系映射器的参数,你不会遇到这种两难境地。DBA可以引用你发布的链接,其中写道“根据OOP原理,将此类私有对象表示映射到数据库表会使此类数据库变得脆弱,并且该问题会进一步突出“尤其是当对象或类定义以直接方式映射(ORM)到数据库表或关系模式时”“因此,根据您自己的链接,推广ORM就是在推广问题


    通过使用存储过程,只要存储过程仍然返回相同类型的相同列,DBA就可以自由地对基础架构进行更改。因此,有了存储过程添加的这种抽象,直接模式映射问题就没有了。然而,这并不意味着你需要放弃你钟爱的EF,因为EF现在可以很好地与存储过程一起使用。

    我的一位同事说“我们应该使用存储过程将依赖的应用程序与更改隔离开来”。然后,他更改了存储过程返回给我的一个应用程序的内容,并将其破坏!呃?如果您使用VS2008中的DB项目,那么它实际上会编译数据库,并且会警告您由于模式更改(例如访问更改的列等)而出现的任何错误,因此您的第1点无效。类似地,假设有人负责数据库,并且不让垃圾进入,则第2点无效。而3则被正确的自动化部署所否定。所以我并不真正相信这些论点,除非你的团队使用的是SQL Server以外的DB,在这种情况下,在VS2008中使用DB项目对你来说是不合适的。那么这些观点就非常有意义了。#1,对于大多数主要的RDBMS,有一些工具可以跟踪模式更改中的依赖关系,这些工具不仅检查存储过程,还检查UDF和触发器。#我们中的许多人可能已经看过无数的.NET/PHP/Java(et.al.)func