使用OR映射器是否有意义?
我把这个问题放在堆栈溢出上,因为这是我所知道的最好的地方,可以找到愿意提供帮助和意见的智能开发人员。
我的推理如下:
1。)SQL属于哪里?
a。)在我所从事的每个专业项目中,数据的安全性是关键要求。存储过程为控制访问和审计提供了一个自然的网关。
b。)生产中的应用程序问题通常可以在表和存储过程之间解决,而无需推出新版本。
2.。)如何控制生成的SQL?我信任解析树以生成有效的SQL。 我在SQL-Server和Oracle中优化SQL方面有相当多的经验,但如果我再也不必这样做,就不会感到受骗。 :)
3.如果我从存储过程中获取数据,使用OR-Mapper有什么意义?
我已将存储库模式与自行开发的通用数据访问层一起使用。 如果需要缓存集合,我会缓存它。我也有在小型CRUD应用程序上使用EF的经验,并且有助于调整遇到性能问题的NHibernate应用程序。所以我有点偏颇,但愿意学习。
在过去的几年中,我们都听到很多受人尊敬的开发人员提倡使用特定的OR-Mappers(Entity-Framework,NHibernate等......)。
有谁能告诉我为什么有人应该转向ORM进行主流项目的主流开发?
编辑:http://www.codinghorror.com/blog/2006/06/object-relational-mapping-is-the-vietnam-of-computer-science.html似乎对此主题进行了强有力的讨论,但它已过时。
另一个编辑: 每个人似乎都同意存储过程将用于重型企业应用程序,因为它们具有性能优势,并且能够将编程逻辑添加到数据附近。
我看到支持OR映射器的最有力论据是开发人员的工作效率。
我怀疑ORM运动的一个重要推动因素是开发人员对剩余持久性不可知的偏好(不关心数据是在内存中[除非缓存]还是在数据库上)。
ORM似乎是本地和小型Web应用程序的优秀节省时间。
我看到的最好的建议可能是来自client09:使用ORM设置,但是对于数据库密集型内容使用存储过程(当ORM看起来不够时,使用AKA)。
答案 0 :(得分:4)
我很多年来一直是职业选手,并且认为这是进行数据库开发的唯一正确方法,但我完成的最后3-4个项目是在EF4.0中完成的,而不是SP的改进和我的工作效率真是令人敬畏 - 我现在可以用几行代码做一些事情。
我仍然认为SP对于某些事情很重要(有时你可以通过精心挑选的SP来显着提高性能),但对于一般的CRUD操作,我无法想象会再回头。
所以对我来说简短的回答是,开发人员的工作效率是使用ORM的原因 - 一旦你克服了学习曲线。
答案 1 :(得分:3)
一种不同的方法......现在,随着No SQL移动的增加,您可能希望尝试使用对象/文档数据库来存储数据。这样,你基本上就会避免地狱就是OR Mapping。在应用程序使用数据时存储数据,并在工作进程中进行场景转换,将其转换为更多关系/ OLAP格式,以便进一步分析和报告。
答案 2 :(得分:1)
存储过程非常适合在一个地方封装数据库逻辑。我曾经在一个只使用Oracle存储过程的项目上工作,目前我正在使用Hibernate。我们发现开发冗余过程非常容易,因为我们的Java开发人员并不精通PL / SQL包依赖。
作为项目的DBA,我发现Java开发人员更喜欢将所有内容保留在Java代码中。你遇到了偶然的问题,“为什么我不循环通过刚返回的所有物体?”这引起了一些“为什么指数不能解决这个问题?”的问题。
使用Hibernate,您的实体不仅可以包含其链接的数据库属性,还可以包含对其执行的任何操作。
例如,我们有一个任务实体。可以添加或修改任务等。这可以在命名查询中的Hibernate实体中建模。
所以我会说使用ORM设置,但是使用数据库密集型的程序。
将SQL保留在Java中的一个缺点是,您冒着开发人员使用非参数化查询的风险,使您的应用程序对SQL注入开放。
答案 3 :(得分:1)
以下只是我的私人意见,所以这是相当主观的。
1。)我认为需要区分本地应用程序和企业应用程序。对于本地和某些Web应用程序,可以直接访问数据库。对于企业应用程序,我觉得更好的封装和权限管理最终使存储过程成为更好的选择。
2。)这是ORM的重大问题之一。它们通常针对特定的查询模式进行优化,只要您使用这些模式,生成的SQL通常质量很好。但是,对于需要在数据附近执行以保持高效的复杂操作,我的感觉是使用手动SQL代码是stilol的方法,在这种情况下代码进入SP。
3.)与直接访问“松散”数据集(即使是键入的数据集)相比,将对象作为数据实体进行处理也是有益的。无论结果集是由SP返回还是从动态SQL查询返回,将结果集反序列化为对象图都非常有用。
如果您正在使用SQL Server,我邀请您查看我的开源bsn ModuleStore项目,它是数据库模式版本控制的框架,并通过一些轻量级ORM概念使用SP(序列化和反序列化调用SP时的对象。)