记一次ORM的权衡和取舍

面对ORM的选型,有些人是根据自己熟悉程度来评判,有些人是根据他人的推荐来抉择,有些人觉得都差不多,随便了。当自己要真正做选择的时候,以上的这些依据都无法真正说服自己,因为不同的业务需求,不同的团队构成都会造成选型的差异,而且特别大,这里谈一谈自己的选型。

  • 我所在的公司是做互联网产品,对性能有着极致的要求

  • 后台人数也不算多,尽量人尽其用,技术水平呈梯度分布

  • 因为产品需要长期维护,所以对代码质量要求非常高,必须做评审和单元测试

  • 对技术的可维护性,可扩展性要求很高,因为资源有限;

  • 因为资源有限,所以在生产力和性能之间需要做一个平衡

难点

  我们知道没有完美的技术,鱼和熊掌无法兼得,所以我们必须择优录取,这里的复杂度在于你要对所选择的技术优缺点有一个360度的环评,最好能展示各自优缺点对比一览图,最后依据数据来证明你的选择对的,是对团队和业务负责的。

现状

  不知道你有没有呆过这样的团队:

  • 选什么技术从不讨论,大伙各自闷声干,等干出来你才知道原来对方是用的IBatis.NET。

  • 你是后面入职的,你只能在前人的基础上做维护,尽管你觉得这个技术不是最优的,但是你也无法了解当初为什么做这样的选择。

  • 在入职后,没有规范的技术培训和规范,你一边Google一边编码一边骂娘。

  所以对需求的分析和选型在前期特别的重要,没有对比的选择,感觉活得有点不明不白,你无法说服自己,更无法说服团队和领导。

分析

  根据互联网业务特点和团队结构,我们的选择有几个重要的关键词:

  • 高性能

  • 易使用

  • 可扩展

  高性能就不用说了,互联网产品,毫秒必争!

  易用性和易维护相似,希望能在后续运维过程中不要给团队造成维护的困难,同时也遵循简单原则,高级的东西都有简单的特点。

  可扩展面对的是产品的变更,很难想象高性能,易使用但是扩展性很差的产品,这种瑕疵会造成代码的臃肿和腐朽。

  所以,这个权衡的标准就出来了,性能、易用、扩展

  这里的备选方案由于精力和时间的关系,根据经验和评论只罗列EF Core、Dapper、SmartSql三种,另外一个原因是这三种设计理念完全是不一样的,差异性很大。另外有些人也会偏爱NHibernate Core(和EF雷同,不做考虑)或者SqlSuger等,不在本文讨论范围。

备选方案1:EF Core

优点

  • 强类型带来维护的安全感,一旦数据库有修改或者字段变更,编译带来的BUG提示,可用极大提升维护效率。

  • EF Core的Code first和自动迁移功能,对面向DDD的设计十分友好,对DB迁移的高效带来的体验也非常棒。

  • 领域优先的设计理念,在和业务人员沟通的过程中,优势也相对明显。

  • 喜欢写SQL的同学,不要忘记EF本身兼容原生脚本,包括存储过程,不过不是优先的选择。

  • 支持多种数据库。

缺点

  • 入门容易,精通比较难,其知识体系有点复杂,学习曲线会比较陡峭!

  • 生成的SQL需要调试和跟踪,面对多表联合查询,性能就不用说了。

  • 需要借助性能检测工具比如MiniProfiler来进行性能分析和监控。

  • “我想好了Sql怎么写,然后再来写Linq,完了可能还要再查看一下Linq输出的Sql是什么样的“。这是非常糟糕的体验。

适用场景

  在性能和生产力之间可以做很好的平衡,比如企业管理系统、个人站点或者外包项目等。

  对EF Core来说如果用的好,性能是完全可以做到非常高的,虽然不是极致的效果,但是在开发效率和性能之间可以做一个很好的平衡。

备选方案2:Dapper

  Dapper是.NET的一款轻量级ORM工具(GitHub),也可称为简单对象映射器。在速度方面拥有微型ORM之王的称号。它是半自动的,也就是说实体类和SQL语句都要自己写,但它提供自动对象映射。是通过对IDbConnection接口的扩展来操作数据库的。

优点

  • 轻量,只有一个文件

  • 性能高,Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。

  • 支持多种数据库。Dapper可以在所有Ado.net Providers下工作,包括sqlite, sqlce, firebird, oracle, MySQL, PostgreSQL and SQL Server

  • 使用Dapper可以自动进行对象映射,通过Emit反射IDataReader的序列队列,来快速的得到和产生对象

缺点

  • 代码里边充斥着 SQL 和各种判断分支,这些将会使代码维护难以阅读和维护,更谈不上Linq的优雅。

  • 和EF相比,手写SQL 当修改表结构不易发现bug。

  • 习惯了EF后再来使用Dapper,会很难适应那种没有了强类型的安全感。

适用场景

  对性能有着极限的追求,同时能写一手很好的SQL(对数据库能达到DBA的水准更好),怀念SQL的感觉,习惯SQL的体验的同学。

  在可维护这块有做单元测试,很好的规避后期维护的困难。

备选方案3:SmartSql

  为什么这边没有选择NHibernate-Core?是因为这家伙和EF Core太像了,在人气上来看,完全没有必要去做选型,当然如果你的团队有NHibernate情节,对NH玩得风生水起例外。

  为什么是SmartSql而不是MyBatis?主要是Mybatis在跨平台上找到不到开源方案,几乎没有更新,更不用说跨平台了。而且SmartSql的设计理念就是借鉴的Mybatis,同时又增加了不少强大的功能,比如支持缓存、CQRS等干货,看官宣SmartSql就一句话:

MyBatis .NET Core+ Cache(Memory | Redis) + R/W Splitting +Dynamic Repository + Diagnostics 

优点

  • 因为SQL自撸,所以性能和Dapper不相上下,非常的高。

  • SmartSql 借鉴了 MyBatis 的思想,使用 XML 来管理 SQL ,并且提供了若干个筛选器标签来消除代码层面的各种 if/else 的判断分支。

  • SmartSql将管理你的 SQL ,并且通过筛选标签来维护本来你在代码层面的各种条件判断,使你的代码更加优美,你再也不用看到到处充斥的SQL了,对代码优雅有着极限追求的人会有点受不了。

  • 支持多种数据库

缺点

  • 易排查:排查性和维护性对新人来说,个人感觉不是十分友好,写SQL会考验你的细心。

  • 使用 XML 来管理 SQL个人觉得是优点也是缺点,因为代码优雅了,但是有些人并不是很感冒这种方式,特别是在XML里面的if/else的逻辑判断,不亲切。

  • 稳定性有待提升,虽然官宣对Dapper有很好的提升,但是从人气来看,成熟度需要进一步观察。

适用场景

  喜欢Dapper的性能,但是不喜欢到处充斥的SQL脚本,追求极致优雅,同时又对SmartSql的特性和效率特别欣赏。但是从人气和成熟度来看,如果对源码没有很好的掌控能力,碰到坑就不好搞了。

1.4备选方案评估和选择

  在评估和最终选型的时候,建议做360度环评,架构人员、开发人员、运维人员、测试人员不妨都请过来参与一下。

  架构人员首先给出自己的备选方案,然后举行备选方案评估会议,再根据会议结论修改备选方案文档。

  有些团队主管或者叫技术经理一人就包办了需求分析、方案选型等工作,虽然这种方式效率很高,但是对团队开发的推进和向上汇报其实是很不利的。首先团队会觉得你大包大揽,黑箱操作;领导会觉得你做事没有章法和原则,万一你离职了,你留下的后遗症和黑锅需要你来背,也许你会觉得我都离职了,关我上面事!

  我觉得你的技术牌子首先就砸了,你的影响力和同事的相处能力也消减了,你的分享能力和做事风格也就丢分了,这些无形的资产会在将来某一个时刻带你带来晦气。

640?wx_fmt=png

  由于精力有限,我没有对这些ORM进行很好的压测和提供压测数据,所以提供的是网友的压测结果,由于压测和环境配置以及框架本身版本息息相关,所以这里的数据仅供参考:

640?wx_fmt=jpeg

(图片来源)

结论:Dapper+扩展

  根据人气、性能和易用性,我选择了Dapper。EF Core的性能和精通的门槛是我抛弃它的原因,而SmartSql尽管设计理念是我的最爱,但他的人气和坑是我担心的点。因为无法鱼和熊掌兼得,所以只能根据自己的情况进行取舍,但是你无法开怀,因为你要包容Dapper带给你的不足,而这些不足,我个人选择单元测试来弥补;同时对Dapper的进一步封装和优化也是接下来很重要的工作:比如AOP拦截代替到处都在的Transaction等等,正式的工作才刚刚开始……

原文地址:https://www.cnblogs.com/jackyfei/p/orm.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315744.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P5395 【模板】第二类斯特林数·行

P5395 【模板】第二类斯特林数行 题目描述 Solution 这题是[Tjoi2016&Heoi2016]求和的前置技能啊…… 我似乎直接跳过这题&#xff0c;去做应用了QAQQAQQAQ。 Code #include <vector> #include <list> #include <map> #include <set> #inclu…

出让执行权:Task.Yield, Dispatcher.Yield

一个耗时的任务&#xff0c;可以通过 Task.Yield 或者 Dispatcher.Yield 来中断以便分割成多个小的任务片段执行。Yield 这个词很有意思&#xff0c;叫做“屈服”“放弃”“让步”&#xff0c;字面意义上是让出当前任务的执行权&#xff0c;转而让其他任务可以插入执行。Task、…

HDU4372 Count the Buildings

HDU4372 Count the Buildings 题目描述 Solution 思路很妙。 考虑从最高的一个楼房将序列分开&#xff0c;左边可以看到FFF个&#xff0c;右边可以看到BBB个&#xff0c;一个楼房可以被看到&#xff0c;则一定是其之前没有比它高的楼房&#xff0c;其之后有若干个比它矮的楼…

VS Code 即将迎来再一次的 logo 更新!已可在 Insiders 版本尝鲜

为什么要说“再一次”&#xff1f; 相信 VS Code 的老用户都还记得两年前的 logo 更新风波吧。当时 VS Code 改了新 logo 之后&#xff0c;VS Code 的用户们一片哀嚎&#xff0c;纷纷觉得新 logo 太丑&#xff0c;在 GitHub 和各种社交媒体上各种吐槽&#xff01;不过幸运的是&…

CF961G Partitions

CF961G Partitions 题目描述 Solution 推式子&#xff1a; AnsAnsAns ∑wi∑s0n(n−1s−1){n−sk−1}\sum w_i\sum_{s0}^n\left ( \begin{aligned} n-1 \\ s-1 \end{aligned} \right ) \left\{ \begin{aligned} n-s \\ k-1 \end{aligned} \right\}∑wi​∑s0n​(n−1s−1​)…

从零开始在 Windows 上部署 .NET Core 到 Kubernetes

本章节所有代码已上传至&#xff1a;https://github.com/Seanwong933/.NET-Core-on-Kubernetes文末附有本人遇到过的 Docker 和 k8s 的故障排除。本文目标&#xff1a;带领大家在 Kubernetes 上部署一个 .NET Core Api 的单节点集群。后续文章会帮助大家继续深入。安装 Kuberne…

bzoj5093: [Lydsy1711月赛]图的价值

bzoj5093: [Lydsy1711月赛]图的价值 题目描述 Solution 考虑每一个点的贡献&#xff0c;枚举它的度数。 Ansn∗2(n−12)∑i1n−1(n−1i)∗ikAnsn*2^{\tbinom{n-1}{2}}\sum_{i1}^{n-1} \left( \begin{aligned} n-1 \\ i\;\;\; \end{aligned} \right)*i^kAnsn∗2(2n−1​)i1∑…

.NET Core微服务 权限系统+工作流(一)权限系统

一、前言实际上权限系统老早之前我就在一直开发&#xff0c;大概在刚毕业没多久就想一个人写一个系统&#xff0c;断断续续一直坚持到现在&#xff0c;毕竟自己亲动手自写的系统才有收获&#xff0c;本篇仅介绍权限。小小系统上不了台面&#xff0c;望各位大神勿喷。二、系统介…

bzoj#3456. 城市规划

bzoj#3456. 城市规划 题目描述 Solution 用组合意义推很简单。 iii个点的简单无向图个数为2(i2)2^{\tbinom{i}{2}}2(2i​)个。 则其EGFEGFEGF为 G(x)∑i>02(n2)i!xiG(x)\sum_{i>0}\frac{2^{\tbinom{n}{2}}}{i!}x^i G(x)i>0∑​i!2(2n​)​xi 令iii个点的简单无向连…

iNeuOS云操作系统,.NET Core全系打造

一.演示地址演示地址&#xff1a; 进入iNeuOS系统。&#xff08;建议使用chrome浏览器&#xff09;http://192.144.173.38:8081/login.html测试名称&#xff1a;admin测试密码&#xff1a;admin下载《iNeuOS云操作系统演示应用手册》 链接&#xff1a;https://pan.baidu.co…

译 | 你到底有多精通 C# ?

点击上方蓝字关注“汪宇杰博客”文&#xff1a;Damir Arh译&#xff1a;Edi Wang即使是具有良好 C# 技能的开发人员有时候也会编写可能会出现意外行为的代码。本文介绍了属于该类别的几个 C# 代码片段&#xff0c;并解释了令人惊讶的行为背后的原因。Null 值我们都知道&#xf…

uoj#422. 【集训队作业2018】小Z的礼物

uoj#422. 【集训队作业2018】小Z的礼物 题目描述 Solution 所有礼物全部取到的方案数并不好求&#xff0c;因此我们考虑min−maxmin-maxmin−max容斥&#xff0c;转化为第一次取到集合中某一个的期望时间。 令pn∗(m−1)m∗(n−1)pn*(m-1)m*(n-1)pn∗(m−1)m∗(n−1)表示有…

[开源] FreeSql AOP 功能模块 - FreeSql

FreeSql 是一个功能强大的 .NETStandard 库&#xff0c;用于对象关系映射程序(O/RM)&#xff0c;支持 .NETCore 2.1 或 .NETFramework 4.6.1&#xff08;QQ群&#xff1a;4336577&#xff09;。据了解&#xff0c;用户使用很少问问题&#xff0c;编码过程中&#xff0c;因业务阻…

Atcoder ARC062F - AtCoDeerくんとグラフ色塗り / Painting Graphs with AtCoDeer

Atcoder ARC062F - AtCoDeerくんとグラフ色塗り / Painting Graphs with AtCoDeer 题目描述 简要题意&#xff1a;给定一个有标号的无向图&#xff0c;你可以给每条边染上KKK种颜色之一&#xff0c;求本质不同的图的染色方案&#xff08;两个图本质不同定义为不能通过若干次环…

各大主流K8S服务全方位能力比对

大家好&#xff0c;趁打开流量主的东风&#xff0c;特此贡献一篇长文&#xff0c;分析一下目前国内国外几大著名云厂商的kubernetes服务&#xff0c;以飨诸君。文起之前&#xff0c;先聊态度。 我本人是十分看好k8s的发展的&#xff0c;为何&#xff1f; 理因古往今来&#xff…

CF868F Yet Another Minimization Problem

CF868F Yet Another Minimization Problem 题目描述 Solution 一开始可以很容易地写出一个dpdpdp式子&#xff1a; 设fi,jf_{i,j}fi,j​表示前iii个数分成jjj段的最小代价&#xff0c;有&#xff1a; fi,jmin⁡k1i−1fk,j−1Ck1,if_{i,j}\min_{k1}^{i-1}f_{k,j-1}C_{k1,i} f…

.NET Core 的Generic Host 之Generic Host Builder

通用Host(Generic Host) 与 web Host 不同的地方就是通用Host解耦了Http请求管道&#xff0c;使得通用Host拥有更广的应用场景。比如&#xff1a;消息收发、后台任务以及其他非http的工作负载。这些场景都可以通过使用通用Host拥有横切&#xff08;Cross-cutting&#xff09;的…

loj#2143. 「SHOI2017」组合数问题

loj#2143. 「SHOI2017」组合数问题 题目描述 Solution 考虑转化一下我们要求的东西。 ∑i0n(nkikr)∑i0n(nki)[i≡r(modk)]\sum_{i0}^{n}\binom{nk}{ikr}\sum_{i0}^{n}\binom{nk}{i}[i \equiv r \;\;(mod\;\;k)]∑i0n​(ikrnk​)∑i0n​(ink​)[i≡r(modk)] 这个式子是什么…

.NET Core微服务 权限系统+工作流(二)工作流系统

一、前言接上一篇 .NET Core微服务 权限系统工作流&#xff08;一&#xff09;权限系统 &#xff0c;再来一发工作流&#xff0c;我在接触这块开发的时候一直好奇它的实现方式&#xff0c;翻看各种工作流引擎代码&#xff0c;探究其实现方式&#xff0c;个人总结出来一个核心要…

LuoguP5504 [JSOI2011]柠檬

LuoguP5504 [JSOI2011]柠檬 题目描述 Solution 容易发现一个性质&#xff1a;每一段划分区间的首尾两个元素相同。 因为倘若不相同的话其中至少一个元素也就不产生贡献&#xff0c;将其划分在其他区间一定不会变劣。 因此就可以写出一个简单的O(n2)O(n^2)O(n2)的dpdpdp。 f…