我在SQL方面没有任何认真的经验,我甚至讨厌编写SQL而不是LINQ。我对ORM感到很满意。
从雇主和部门的角度来看,了解SQL是否重要?我必须掌握吗?与ORM框架相比,偏爱纯SQL的公司在编程世界中是否是“恐龙”?
我在SQL方面没有任何认真的经验,我甚至讨厌编写SQL而不是LINQ。我对ORM感到很满意。
从雇主和部门的角度来看,了解SQL是否重要?我必须掌握吗?与ORM框架相比,偏爱纯SQL的公司在编程世界中是否是“恐龙”?
Answers:
这对很多程序员来说很难解释,因为如果您只了解基本的 SQL,那么与ORM相比,它实际上并没有给您带来太多优势。但是,更高级的SQL概念是仅能正常工作的应用程序与高质量(特别是快速和可靠)的应用程序之间区别的关键部分。
我假设别人设计的数据库给你,因为这是不知道任何SQL仅仅是踏破铁鞋。但是,即使您只是针对它们而开发,这里也只是ORM仍会做得不好或根本不做的所有事情的部分列表:
清单还在不断增加-其中许多都是DBA初学者从未做过的事情,而且新手开发人员甚至从未听说过-但是它们在大型应用程序中非常重要。
ORM确实非常擅长加速真正无聊的 SQL代码-也就是说,所有重复的CRUD和映射以及其他管道代码,因此使用它们绝对没有什么可耻的,并且不要听别人说它们是邪恶的。但是您绝对仍然需要学习,是的,甚至是精通 SQL,并且在ORM不能发挥其作用时,准备好进入原始的DB命令/查询。
GroupJoin
于OOP(例如LINQ)要好得多。
GroupJoin
。
GroupJoin
。只是那些习惯SQL的人在这种情况下立即想到了外部联接,然后问如何将其转换为LINQ。那不是正确的方法。您不应尝试将SQL转换为LINQ,而应直接转换所需的内容。
绝对!SQL仍然是数据库的通用语言,尽管您可能对ORM做了很多工作,但您必须了解SQL才能理解ORM做出的决策及其生成的SQL。另外,自定义sql和存储过程还有很多事情要做。对不起,没有免费的午餐。
如果要与SQL数据库进行交互,则必须了解ORM生成的SQL。您必须了解SQL数据库中固有的概念,并且必须了解ORM无法为您做些什么。ORM使生活更轻松(是的,我认为在许多情况下,没有人工作就可以使您成为恐龙),但它们是工具(用于抽象您所知道的事物),而不是拐杖(用于防止您学习)。
如果您拒绝学习SQL,那么无论有没有ORM,您都不会接触SQL数据库,您应该找到另一种类型的工作。
我会承认我是顽固的ORM拥护者,多年来一直在宣扬ORM的好处,并且对于ORM为什么胜过SQL仍有很多话要说。
但...
我必须承认,在现实世界中完全需要SQL,并且每个开发人员都应该对SQL有很好的理解。
在几乎所有情况下,SQL proc都比ORM更快。即使您在大多数情况下也可以乐观地看待ORM输出,也可以使它紧跟SQL proc之后。
有时,您需要一些繁重的SQL才能获得所需的结果,而这些庞然大物的查询在SQL proc中创建起来更容易,更快捷。
只是我的两位。
在谈论这个问题之前,首先要进行一些介绍。我喜欢ORM。而且我讨厌SQL。我喜欢ORM,因为它们隐藏了SQL所带来的用户不友好的混乱,并提供了一种很好的语言集成方式来处理数据库。
但是我得承认SQL有很多好处,其中最大的好处就是精度。我只需通过查询就可以对SQL查询的复杂性争论不休,而无需了解底层数据库架构的详细知识。因此,当我使用SQL时,我总是很警惕,而且我总是对组件的复杂性前进的方向有一个直觉。
另一方面,在使用ORM时,我对数据库集成的便捷性感到不知所措,以至于我什至忘记了甚至有一个数据库。这使我很困惑。过去,我曾多次调用过看上去无辜的ORM方法,但在幕后调用了大规模而令人恐惧的数据库联接,从而破坏了性能。
这就是为什么对我来说,真相介于两者之间。我喜欢使用ORM,我将继续这样做,但是我必须更加小心,并始终研究任何ORM方法调用的含义(在SQL级别上)。知道抽象层的含义在这项业务中是纯金,并证明使用抽象是合理的。其他任何事情,就像在脚上射击自己。
即使有了一个良好,成熟的ORM,您也不可避免地会遇到这样的情况:如果您了解生成的SQL中发生的事情,它会发出一些效率低下的SQL,并使您的生活变得更加轻松。就是说,如果您非常熟悉ORM,并且知道如何为您选择的数据库使用探查器,则可以很容易地“伪造它直到完成”。
所有这些类型的问题(“我需要知道X吗?”)的答案是“如果需要,请在第一次使用它时进行学习”。
重要的是,不要因为效率低下而陷入陷阱,因为您不了解或不愿意学习有效的做事方法。
例如,在这种特定情况下,如果您意识到程序中存在一个导致PostCount
用户表字段有时不正确的错误,该怎么办。
您已修复该错误,现在必须为所有用户更新PostCount。你怎么做呢?
如果您使用ORM编写一个小脚本来执行此操作,那么您的效率将会非常低。一个非常简单的SQL查询即可。
由于这些情况相当普遍,我担心您会陷入上述陷阱!
是的,您仍然需要SQL。
不要跳到认为“旧”东西不值得考虑的假设。所谓的“遗留”技术是经过时间考验后仍然存在的那些技术。我们不称Wang电脑为“传统”,它们失败了,而消失了。
如果您问我,我的银行是否可能在大型机或IBM i上使用COBOL,是否会困扰我?绝对不可以。这些都是坚如磐石,久经考验的真正技术。猜猜是什么,他们主要使用DB2 SQL。与在当月流行的语言开发的软件中相比,我对在那里的钱更加信任。
恐龙在地球上的生存时间比我们周围人类更长。如果您读过《侏罗纪公园》(是的,书比电影要好),那么我想问您,您是否真的想面对一堆超级聪明的迅猛龙,或者顽强的T-Rex,永不放弃?不要因低估“恐龙”而被咬。;-)
除了我没有经验的游戏和(主要是统计)研究之外,似乎数据库访问和操作是少数几个错误决策会导致巨大性能损失的领域之一。我坚信代码中功能更强大的数据库抽象,并且我相信linq,它将数据库操作与编程语言联系起来,为您提供该语言的所有工具(类型检查,语法检查以及您喜欢的所有东西)您的编程语言),同时仍然赋予您足够的力量去做自己想要的事情,这绝对是很棒的。不幸的是,它仍然不能总是起作用。这就是说,如果抽象层错误地进行了优化,则可能要等待几秒钟而不是微秒,或者等待几分钟而不是几秒钟来获得结果。由于这些时期非常引人注目,您必须对其进行优化,否则您的应用程序将无法工作:性能成为应用程序的最大问题。这意味着您必须更接近金属,并要保持乐观。
当我们达到处理大型数据集的程度时,例如,手工操作需要3毫秒,而让抽象层为您完成则需要100毫秒,所以一定要让抽象层为您处理它,因为您可能速度要慢30倍,但仍然足够快(可能对于大多数应用程序而言)。但是,这种情况的现实情况是,当您查看具有200 ms响应时间的手动优化解决方案,并且当抽象层为您处理该响应时,该算法仅对性能造成10倍的影响, 2秒钟的延迟,然后您会非常在意,因为它从不是那么快就变到令人痛苦的缓慢。看到关系数据库解决方案不能很好地扩展,我认为这不会在两三年后解决。这意味着在涉及较大的数据库时,您仍将不得不花相当长的时间来了解裸机,否则您的应用程序将是如此缓慢,以至于无法与竞争对手抗衡。