Linq to SQL不会遗漏要点吗?ORM映射器(SubSonic等)不是最佳解决方案吗?


68

我希望社区对Linq to Sql和其他ORM映射器有一些想法。

我喜欢Linq和Sql,并喜欢用本机开发语言表达数据访问逻辑(或一般说来CRUD操作),而不必处理C#和SQL之间的“阻抗不匹配”。例如,要为业务层返回与ObjectDataSource兼容的Event实例列表,请使用:

return db.Events.Select(c => new EventData() { EventID = c.EventID, Title = c.Title })

如果要使用旧的SQL-to-C#构造实现此功能,则必须创建一个Command类,添加EventID参数(使用字符串描述“ @EventID”参数),然后将SQL查询字符串添加到命令类,执行命令,然后使用(cast-type)nwReader [“ FieldName”]拉出每个返回的字段值,并将其分配给我的EventData类(yuck)的新创建实例的成员。

因此,就是为什么像Linq / SubSonic / etc这样的人。并且我同意。

但是,从更大的角度看,我发现许多错误。我的感觉是,Microsoft也看到了错误,这就是为什么他们杀死Linq to SQL并试图将人们转移到Linq to Entities。只是,我认为微软正在加倍下注。

那么,怎么了?

问题在于,有一些架构宇航员,尤其是Microsoft的宇航员,他们研究了Linq to Sql并意识到这不是一个真正的数据管理工具:在C#中,您仍然无法轻松完成许多事情,他们的目标是修复它。 您会看到这体现在Linq to Entities背后的野心,有关Linq的革命性甚至LinqPad挑战的博客文章中。

而这个问题在于,它假定SQL的问题。也就是说,为了减轻轻微的不适(SQL和C#之间的阻抗不匹配),Microsoft建议在创可贴(Linq to SQL或类似的东西)就可以的情况下等效于太空服(完全隔离)。

据我所知,开发人员足够聪明,可以掌握关系模型,然后将其智能地应用于开发工作中。实际上,我再说一遍,Linq to SQL,SubSonic等已经太复杂了:学习曲线与掌握SQL本身并没有太大不同。由于在可预见的将来,开发人员必须掌握SQL和关系模型,因此我们现在面临学习两种查询/ CRUD语言的问题。更糟糕的是,Linq通常很难测试(您没有查询窗口),将我们从正在执行的实际工作中删除了一层(生成SQL),并且对SQL构造(例如,最多)的支持非常笨拙日期处理(例如DateDiff),“具有”甚至“分组依据”。

有什么选择?就个人而言,我不需要像Linq to Entities那样的数据访问模型。我希望仅在Visual Studio中弹出一个窗口,输入并验证我的SQL,然后按一个按钮即可生成或补充C#类以封装该调用。由于您已经知道SQL,因此您不希望仅输入以下内容:

Select EventID, Title From Events Where Location=@Location

并以一个EventData类结尾,该类A)包含EventID和Title字段作为属性,B)具有工厂方法,该方法将'Location'字符串作为参数并生成List <EventData>?您必须仔细考虑对象模型(上面的示例显然没有处理),但是在消除阻抗不匹配的同时仍然使用SQL的基本方法对我很有吸引力。

问题是:我错了吗?Microsoft是否应该重写SQL基础结构,以便您不必再学习SQL /关系数据管理? 他们可以以此方式重写SQL基础结构吗?还是您认为,在SQL之上的一个非常薄的层足以消除设置参数和访问数据字段的麻烦?

更新我想将两个链接提升到顶部,因为我认为它们抓住了我所追求的重要方面。首先,CodeMonkey指出了一篇题为“计算机科学的越南”的文章 入门需要一些时间,但阅读起来很有趣。其次,AnSGri指出了Joel Spolsky最著名的作品之一:泄漏抽象定律。它并不完全是主题,但是它很接近并且很值得一读。

更新2:尽管这里有很多很棒的答案,但我给了ocdecio一个“答案”,而“正确”答案的选择纯粹是主观的。在这种情况下,鉴于当前的技术水平,他的回答与我认为的确是最佳实践相吻合。我完全希望这是一个可以发展的领域,因此情况可能会发生变化。我要感谢所有做出贡献的人,我已经投票给所有我认为给出了深思熟虑的人。


我一直在与“泄漏抽象”建立相同的联系。试图使一堆大小和形状相互可访问的列表的所有这种复杂性似乎是为了以简单和连贯为代价来背弃这一原理。LINQ-to-SQL是一个主要的特定示例。
dkretz

很好的问题。我记得曾经在MS前往的技术日上(在Linq,实体之间)问过一位MS家伙。他似乎也不知道……
Benjol,2009年

本杰尔-谢谢。我对这个问题的回答感到非常满意。我担心许多MS技术似乎是由于需要被视为在做大事情而不是专注于开发人员的更多需求而产生的。当然,当一些大的作品(例如.NET)工作时,我们都会感激不尽。但是LINQ并不是为我做的。它认为使用一个更简单,更直接的工具会更好。
Mark Brittingham,2009年

2
从您选择的答案和您的评论中标记出来,这很明显不是问题,而是观点。贴在您的博客上。
mcintyre321,2009年

2
麦金太尔-您在说什么?这是一个非常受欢迎的问题,引发了很多辩论和讨论(如本杰尔所说:“很好的问题”)。据我所知,即使他们不同意我选择的“答案”,也有很多人从中学到了一些东西。我对SO的看法是,这里是探索软件开发整个领域的地方,并且我已经做了很多工作来帮助它朝这个方向发展。SO的唯一真正缺点是,有太多的人认为与某人不同意时应该无礼。
Mark Brittingham 2009年

Answers:


18

至少六年来,我一直在使用自己的基于一个非常简单的概念的ORM:投影。将每个表投影到一个类中,并根据该类定义即时生成SQL。它仍然需要我了解SQL,但是它可以处理90%的简单CRUD,而且我也不必管理连接等-并且它适用于主要的数据库供应商。

我对自己拥有的东西感到满意,没有发现值得丢弃的东西。


4
我一直都在做。对于单行选择/更新/删除而言更复杂的事情,您可能仍然想编写自定义SQL,因此我认为不需要Linq之类的东西。
Kibbee

@Kibbee-完全是。这就是为什么我的DAL中有一个“输出”来调用SP或自定义SQL并将结果放入DTO中的原因,并且如果我愿意,我还可以返回good'ol数据集。
OtávioDécio

1
不言而喻,LINQ是另一个抽象层。但这太多了 它没有解决任何已知的抽象问题,如果做到了,那将会消失。但是这里没有候选人。
dkretz

2
我没有尝试解决抽象问题-我只是想简化将SQL查询转换为对象并将对象返回数据库的过程,就这么简单。它减少了我的开发时间,提高了我的整体代码质量,而这正是我想要的。
OtávioDécio

2
@Jeff-您可以找到它一个databroker.codeplex.com,我将其放在那里以将其放置在集中位置。如果您有任何疑问/建议/批评,请随时检查并通过联系页面让我知道,所有这些都欢迎。
奥塔维奥·德西奥

45

首先,我要说我是一个染过数据库的家伙。

总的来说,过分笼统:开发人员不了解SQL。开发人员真的不想了解SQL。他们可以编写代码,可以设计表格,但这会让他们感到讨厌。当必要的查询不仅仅是简单的联接时,它们往往会做愚蠢的事情。不是因为开发人员很愚蠢-就是因为他们不被打扰。他们喜欢生活在一个只需要处理一个概念空间的世界中。从对象移到表再移回是上下文切换他们不愿意支付的价格。

这并不意味着它们是坏的或错误的。这意味着有改进的机会。如果您的客户(在这种情况下,使用您的框架的开发人员)不喜欢SQL和表,请给他们一个抽象层,使他们可以在不处理底层混乱的情况下摆脱困境。

这与使垃圾回收/自动内存管理大受欢迎的逻辑相同。是的,开发人员可以处理它;是的,没有它们,他们可以编写更好的代码;但不必处理它会使他们更快乐,更有生产力。


至少更快乐,这毕竟是第一要务。
dkretz

7
我完全同意。SQL很简单。您只需要知道几个关键词。编写良好的高性能SQL可以显着提高应用程序的速度。编写不当的SQL可能会使RDBMS和网站屈服。如果您不想编写SQL,请这样说。
DOK

1
您正在宣讲合唱团DOK。我只是说教堂外面也有音乐:-)
SquareCog

13
真可悲:数据处理对于良好的编程至关重要。不精通SQL就像决定成为一名吉他手,但不喜欢和弦。
Mark Brittingham,2009年

2
这就是我的猜测。我是一名开发人员,我喜欢SQL。但是我认为这并不常见。
杰夫·戴维斯

36

我认为ORM的普及是由开发人员开发数据层并在应用程序之间反复编写相同的CRUD代码而产生的。ORM只是另一种工具/技术,它使开发人员可以花费更少的时间一遍又一遍地编写相同的SQL语句,而专注于应用程序的逻辑(希望如此)。


1
吉姆,我认为您绝对正确。问题是当前的方法是否足以应对这种痛苦。我没有这么说,但是我已经开始开发代码生成器,以围绕SQL查询创建类供我自己使用。Linq / SubSonic只是对我不起作用。
Mark Brittingham,2009年

绝对正确。当我到达数据层时,我已经完全停止了副项目的工作,并意识到“哦,该为我的所有对象一遍又一遍地写200条SQL查询了”。ORM工具将大大加快速度。不幸的是,大多数ORM工具都很烂:(
CodingWithSpike

我认为这是个人选择。您总是可以像在ORM流行之前一样编写自己的数据访问层,并拥有完全的控制权,但是ORM通常提供可接受的DAL(即使有错误)的框架,以节省大量的时间和工作。
Jim Anderson's

1
“节省大量的时间和工作”是可操作的可疑断言。这不是我的主观经验,但我会相信你的话,这是你的。我认为DAL不会特别困难或乏味,除非您是在浪费时间来开发CRUD模板(好名,不是吗?)
dkretz

@le dorifier:是的,我想您的里程可能会有所不同。但是考虑到创建像Hibernate和Entity Framework这样的产品所花费的时间,我希望它们能够增加价值并减少所需的数据“管道”代码。
Jim Anderson

12

恕我直言,OR / M不仅涉及“抽象化SQL”或隐藏SQL,或启用多DBMS支持。

它使您可以将更多的精力放在问题域上,因为您只需花费较少的时间来编写无聊的CRUD SQL查询。另一方面,如果您使用的是良好的OR / M,则在必要时,此OR / M应该使您能够编写SQL查询。

如果正确使用OR / M,它可能是一个强大的工具。它可以处理延迟加载,多态查询/关联...
不要误会我的意思;普通的SQL并没有错,但是,如果您必须谨慎地将(经过深思熟虑和规范化的)关系模型转换为富有表现力的OO /域模型,那么我认为您正在花费很多时间进行管道。

使用OR / M也并不意味着您(作为开发人员)应该不具备SQL知识。相反的是真正的恕我直言。
知道SQL并知道如何编写有效的SQL查询将使您能够正确使用OR / M。

我还必须承认,我是在考虑NHibernate的情况下编写此文件的。这是我正在使用atm的OR / M,尚未使用Linq转换为SQL或将Linq转换为实体(尚未使用)。


3
我在同一条船上。编写crud sql很容易。这是关于不必编写和重写管理两个世界的映射的管道/胶水。这部分很难一致地完成,尤其是在与许多开发人员一起的团队中。ORM映射器使每个人都可以忘记它,并统一完成所有工作。
Daniel Auger

10

Linq的设计和linq to entity框架确实可以用作orm工具,但重要的想法是它将用作查询任何数据源(而不仅仅是RDBMS的)的通用api。

我记得读过linq,虽然显然是在考虑到SQL的情况下设计的,但它打算成为任何数据存储的查询语言。您可以为SQL编写linq查询,但从理论上讲,您也可以针对ldap,文件系统,交换,Web服务和无限广告编写linq查询。您不能将SQL用于这些程序。

您还需要为几乎每个数据存储学习不同的API。Linq为每个人提供了创建数据访问API的共同目标。

这个愿景是否有效还有待观察,但这就是想法。我认为随着我们希望系统越来越多地进行互操作,我们可能会发现l2e的一些很好的用途。

如果可以再次找到它们,我将添加一些参考。

http://laribee.com/blog/2007/03/17/linq-to-entities-vs-nhibernate/


9

您应该停止担心,并学会热爱ORM。诸如此类的抽象将帮助我们专注于我们的技能并在该领域取得进步。

仍有足够的空间来利用您已获得的功能技能并将其应用到应用程序层中。实际上,这是LINQ to SQL优于其他ORM的优势之一。

我只能同意许多其他意见。在节省时间的同时,您可以集中精力完善域模型并开发出更好的应用程序。而且,一旦确定了瓶颈,就可以使用它来创建优化的SQL。

可能不会立即显而易见的是,ORM附带了许多非常不错的功能。身份映射有助于避免一遍又一遍地加载项目,惰性加载可以帮助您以更少的管道表达域,而工作单元则可以帮助您跟踪更改并优化数据库写入。


1
然后,我们需要发明并实现与对象范例匹配的数据存储,而不是强制拟合SQL。您只是将阻抗不匹配移至接口的另一侧。
dkretz

3
“别担心”是生活在这个行业中的一种可怕方式。“质疑一切”要好得多。
CodingWithSpike

同样,抽象并不总是一件好事。它导致使用工具之间的通用位,而无需专门化。例如:“ DB”的抽象,您必须删除Oracle连续通知,甚至是存储的proc,因为并非所有DB都具有它们。
CodingWithSpike

@ledorfier:我可以在理论上达成共识,实际上ORM的工作效果很好@rally:那是对一部流行电影的引用=)@rally再次:反过来说,大多数时候您都可以抽象出是一件好事,但是可以肯定,总会有“其他” 5%
Cristian Libardo 09年

@le dorfier:我不同意。:)关系模型是有效存储数据的良好模型。关系模型还使您能够轻松生成报告等。(因此,请勿为此使用OR / M。)但是,OO是表示域模型的一种好方法,因此两种模型都必须适用。
Frederik Gheysels 09年

9

我同意100%。这很多是由于过程编码技能和SQL编码技能有很大不同这一事实造成的。这个事实尚未得到广泛认可。因此,在实现这一目标之前,程序员一直在寻找使自己的技能可以从一个领域转移到另一个领域的方法。

没用

您只需要简单地学习如何进行相移即可:学习如何根据要处理的域来不同地考虑代码。

还有其他人注意到从SQL映射到LINQ时查询变得多么复杂和冗长吗?喜欢,在所有在线示例中?


1
我同意您所说的一切,只是“必须”。面对现实-您和我都是Java世界中的C黑客。我们的东西可能会更有效地运行,但是我们越快接受现状,我们的血压就会越低:-)。
SquareCog

4
相反,大多数查询在LINQ中变得更简单。问题在于,许多人未能正确学习LINQ,因此他们将SQL查询音译为LINQ-当然,您只能输而从不获利。
乔·阿尔巴哈里(09.09.05)

我很高兴它对您来说变得“简单”。对我来说,这是简单的事情,并将其转化为不同的事情,无疑会增加复杂性。而且,没有什么总是能完美映射。
dkretz,2009年

@Gurdas Nijor是的。声明式==很棒。:)
Jeff Davis 2010年

7

正如Dmitriy指出的那样,开发人员并不了解SQL。更确切地说,大多数知道SQL,但不知道它绝对不喜欢,所以他们倾向于寻找灵丹妙药,创造的东西像LINQ到让他们不要幻想(HM,抽象)的需求不要使用与他们钟爱的班级不同的东西。

这很糟糕,因为泄漏抽象定律始终成立。

一些ORM解决方案绝对是不错的选择(例如JPA / Hibernate),并不是因为使用它们您不必担心SQL。实际上,要有效地使用JPA,通常需要对数据库有非常深入的了解,尤其是查询能力。好处是,它们使计算机完成了无聊的工作,以至于从头开始自动生成整个数据库。

我认为Linq to SQL无法解决实际问题。这是其他形式的演示,仅此而已。这样做可能会很好,尽管它会使本来已经很复杂的语言复杂化了。另一方面,Linq to Objects是一个非常有趣的概念,因为它是一种SQL查询集合的方法。


6

历史的角度。

当科德等。等 最初是研究关系数据库的理论和实现,一个完全独立的问题是“我们如何查询这些东西”?提出了许多策略和语法,各有优缺点。这些候选者之一是SQL(显然是最早的形式。)另一个是QBE(示例查询)。我相信另一个被称为“平息”。还有其他几个。当然,SQL并没有成为主流,因为它被认为优于其他所有语言。不过,不幸的是,其他的几乎消失了,给我们所有人带来了贫困(因为它们可以同时用于同一数据)。

如果微软有一个很好的故事,那就是他们正在复兴其他一种语言,或者发明了一个有价值的附加语言,那么我认为我们应该明智地倾听。但是到目前为止,我所看到的只是另一个“一环统治一切”。

SQL背后有很多思想和严谨性,还有许多久经考验的持久性。微软有一定的历史,相信他们公认的顶级开发组织可以超越我们所有人,包括我们的集体机构记忆。似乎并不经常以这种方式工作。只要我们绑定到关系数据存储,就应该对超集抽象范式进行三思而行,超范式抽象范式可以使我们脱离裸机,并保证性能相同或更好。


我实际上使用了QBE,因为它是在1990年代初期在“ Paradox”数据管理工具中实现的,所以我记得!您对“一环统治一切”的比喻是无价的!
Mark Brittingham

我认为比喻是胡扯。LINQ试图解决阻抗不匹配问题,而不是另一种关系查询语言。
reinierpost

QUEL是Berkeley的Ingres的原始查询语言,与SQL没什么不同,SQL很快就取代了它QBE是位于SQL之上的图形/文本GUI:对于简单的查询来说它很整洁,但对于真正复杂的事情却没有那么好。我不认为这对SQL构成很大的挑战。SQL是一种非常强大的表达语言。
Jim Ferrans 2011年

5

作为我自己的ORM项目的作者,我不得不承认我对这样的问题的回答容易有些偏颇。在阅读问题之前,我已经对答案提出了一些自己的想法,因此我已经有所基础。

我要说的是,开发ORM的原因并不是因为SQL与命令性编程之间的“阻抗不匹配”,而是仅出于与数据库平台无关的目的。必须编写更多代码来管理持久性的前一个问题是一个小障碍,如果您只与一个数据库供应商合作,则很容易解决。成为不可知论的数据库平台是一个更具挑战性的问题,并且imo对您的业务盈利能力具有更大的影响,假设像我一样,您计划将软件出售给其他人(而不仅仅是在内部使用)。

几年前,当我开始使用ORM工具时,这个概念在我的首选语言中是不切实际的,我与之交谈的大多数人都不理解我为什么要使用它,并且社区中一些受人尊敬的声音与书面文章一样多。在贸易杂志上说我已经做过的事情不仅是不可能的,而且是不可取的。给出了一些相同的原因-太复杂了,限制了,增加了开销。今天,同一社区至少拥有三种流行的数据库抽象工具(尽管对术语ORM的定义存在一些争论)。我之所以提及这一点,是因为当我开始使用这些工具时,最初的异议比现在的异议更为重要。在随后的几年中,硬件和软件的基础技术发生了变化,从长远来看,使这些工具更加实用。我的趋势是尝试从长远角度看待软件,并研究可能不太实用但很快就会变得实用的解决方案。因此,考虑到我不会把LINQ to Entities当作解决某些问题的好方法。

我也倾向于选择更多而不是更少的选择。因此,尽管我可能支持开发LINQ to Entities的想法,但由于LINQ to Entities已可用,因此我不太倾向于支持消除LINQ to SQL。对象对于执行对象的工作非常有用,这毫无疑问...在我看来(再次有偏见),人们会遇到一个问题,人们将任何给定的工具或软件范式视为“魔术子弹”,并且想要坚持一切一定是那样的。众所周知,关系数据库非常擅长处理某些其他任务,报告就是一个很好的例子。因此,在我看来,这是一种让自己步履蹒跚,坚持认为一切都必须是实体的方法,因为那样您就不得不强迫自己使用效率低下的工具来完成工作。因此,特别是在报告方面,抽象反演反模式。

所以我想答案的概要是:如果您的问题是钉子,请使用锤子;如果您的问题是螺钉,请使用螺丝刀。


5

德米特里(Dmitry)关于开发人员不喜欢SQL的说法可能有很多道理,但解决方案不仅是ORM。解决方案是聘请开发DBA作为开发团队的一部分。在我的公司中,我的.net开发团队拥有出色的Oracle DBA,他完全不生产dba。他在我们团队中的角色是数据建模,物理数据库设计,创建存储的proc,数据分析等。这就是我们数据库方面如此整洁和高效的原因。我们所有的数据库访问都是通过存储的proc。

什么是开发DBA? http://www.simple-talk.com/sql/database-administration/what-use-is-a-development-dba/


4

我同时进行数据库和分布式应用程序编程(Web和编译),并且觉得花时间开发基于存储过程的数据访问层是很花时间的。就我个人而言,我更喜欢进行数据建模并在开发过程的早期确定所需的过程……似乎有助于发现设计/接口逻辑/结构问题。

我不是内联数据库编程的忠实拥护者(无论sql代码是手工生成还是机器生成)。我认为数据库是一个人的应用程序的基础,花时间花时间对存储的过程进行手工编码是值得的。

就是说,我对OODBMS概念很感兴趣,并希望有一天我能在生产环境中进行一些工作。


4

如果希望数据库按比例扩展运行,则必须根据数据库关系模型最佳实践进行设计和规范化。

如果让对象模型和ORM支配您的数据模型,您将最终得到一个不良的数据模型,该数据模型没有被规范化和/或包含来自对象模型的工件。

1张桌子= 1类是一个坏主意。

首先,永远不要拥有代表多对多或多对一链接表的类。这些对应于对象模型中的子集合-链接本身不是对象。

如果将数据库视为表以仅将对象保留在行中(一种通用方法)并给予应用程序直接访问表的权限,那么您将放弃定义数据库服务可用来保护的数据库服务接口层的所有好处。它的周长。

ORM占有一席之地,但是如果您使用它们来按照对象模型中的设计简单地持久化对象,则您的数据库将不是关系数据库,也不能用作ETL,报表,重构等


3

我认为这些事情背后的逻辑是,与系统其他部分的开销相比,在框架层中构建和运行SQL语句的开销微不足道(例如,HTTP请求往返行程要长几个数量级)。

优点-快速开发,适合该语言而不是被转义的字符串的查询等通常会超过缺点。如果性能是一个问题,则可以稍后进行优化。

我认为“不需要了解SQL”不是一个因素。任何体面的开发人员都需要在开发的某个时候了解SQL。数据库抽象层的想法是消除为数据库查询生成样板代码的工作。

确实,在Java系统中,我创建了一个代码生成器实用程序,该实用程序使用带注释的类并生成了完整的CRUD API,并处理了随着时间的流逝而来的所有这些古怪的事情。创建模型和注释模型要比编写DAO困难得多。扩展此类工具,最终您将获得LINQ或Hibernate或其他无数的ORM DB解决方案。


但是,对于我们请求的单个请求,很容易会有10个甚至100个查询。您将要执行一个数量级或更多数量级的查询操作,从而绕过了http请求更长的数量级这一事实。
Kibbee

是的,这就是逻辑失败的地方-确实需要对在后台执行大量SQL的严肃的Web应用程序进行优化,以消除抽象速度的降低。但是对于基于标准简单Intranet表单的应用程序呢?最初,它可以使用节省时间的抽象,直到膨胀为止;)
JeeBee


3

我认为他们需要的真正解决方案更像是SQL文字。VB.Net 9.0支持XML Literals,该XML Literals允许您直接在代码中编写XML,并确保其经过验证并符合DTD。SQL文字是一个类似的不错功能,它使您可以在.Net代码中编写内联SQL代码,并通过IDE对其进行验证。需要使用某种插件架构来针对数据库验证信息,但是对于流行的数据库引擎而言,可以很容易地编写这些插件架构。这将为他们试图解决的问题提供真正的解决方案,而无需求助于次优的解决方案。


3

Codemonkey提出了一个很好的观点:存储过程提供了一定程度的抽象,可以满足更复杂的ORM模型的某些承诺。乍一看这并不直观,但是我可以从自己的代码中想到一个示例。我有一个“签到”存储过程,该存储过程涉及将近十二个表(此ID属于谁?他们有成员资格吗?是否有任何消息?他们为此签入获得积分吗?等)。

在C#中对此模型进行建模(无论数据模型多么复杂)永远都不是一个好主意,因为它将需要“遍历”多次检查数据并更新各种表。虽然确实可以在Linq或其他ORMS中处理sproc,但是我所需要的只是一个包装器类,该类允许我使用标准C#参数调用该sproc。实际上,这对我来说是迫切的需求,以至于我用T-SQL编写了一个代码生成器来创建这种包装器。


在C#中对此建模是一个好主意,因为它允许您使用继承,模块化和单元测试。脱机通常不是问题-与其说是维护中等复杂存储过程的问题,不如说是问题-甚至在没有设置数据库的情况下也无法对其进行单元测试。
Andrey Shchekin,2009年

是的,但是ORM或DAL通常提供更通用(与数据库无关的解决方案),而存储过程(如果您的数据库支持它们)是特定于数据库的。
Jim Anderson

3
我总是在这里使用与数据库无关的规则。但是,当完全开发了应用程序时,有多少人真正切换数据库?
Donny V.

@Andrey:诸如PL / SQL之类的存储过程语言也允许您使用继承,模块化和单元测试。请查看download-uk.oracle.com/docs/cd/A91202_01/901_doc/appdev.901/…@Jim :如果使用C#/。NET,则只能部署到单个平台(Windows)。如果使用PL / SQL编写存储过程,则可以在Oracle支持的任何操作系统上进行部署。换句话说,PL / SQL就像Java,“写一次,在任何地方运行”,只是它的性能比Java好!
ObiWanKenobi

3

我不喜欢任何当前的解决方案-但我更喜欢选择多于选择;-)

我很早以前就在一个项目中使用了OODBMS,该项目最接近正确了(不幸的是,该产品有一些令人毛骨悚然的错误和可怕的技术支持)-对象持久性在很大程度上是不可见的,在后台(通过预处理程序代码生成器)进行处理并受到控制通过非常简单的Update,Delete和Find方法以及简单的容器。

我很想再看到一次OCL(对象约束语言)作为本机多对象查询语言(也许有些对象实体模型已经做到了)


2

我必须同意,ORM工具的大量涌现主要源于编写SQL,处理您必须使用的任何数据库驱动程序,在数据库之间进行内部抽象(Oracle与SQL Server,以及任何可重复使用代码的事物)以及转换数据类型的烦恼。

理想的解决方案?绝对不是!但是,我认为这是在更好地将应用程序与数据存储合并的过程中的迭代。毕竟,在大多数情况下,使数据库没有用任何语言编写的访问应用程序实际上是没有用的。(您真的会只安装oracle,并希望所有员工都直接在SQLPlus中工作吗?)

因此,我认为数据存储和应用程序正在一起移动,以使应用程序开发人员可以更轻松地与数据存储进行交互。

特别是对于.NET,我更希望看到的不是Linq,而是一种内置的方式,可以将类定义映射到基础数据源到基础数据存储,并使所有管道正常工作。

换句话说,我只能说“ Employee.Name ='rally25rs';” 并且对象的属性将更改,并且在其下面将保留到数据存储本身。只是完全抛弃SQL,而不是像Linq那样直接将1/2移到SQL。

当然,类似的解决方案会带来性能,事务处理等问题。

也许需要重新考虑和重新调整编程语言和关系数据库的整个概念?在它们的核心,它们是完全独立且脱节的实体。也许是时候放弃“关系型SQL感知数据库”并构建下一个东西了,执行一行代码将直接在数据库上运行。


ODBC / JDBC(及其衍生工具)在消除dbms SQL实现差异方面做得很令人满意。但是请注意,它们似乎很少再使用了。查看所有具有专有语法问题的帖子。答案已经存在多年了-越来越被忽视。
dkretz

@le dorfier:好点。问题的一部分可能是抽象消除了所有专业化?例如:如果我不使用Oracle驱动程序,则无法使用其Continuous Notification工具。也许ODBC是四季皆宜的轮胎(在所有方面都是中等水平),而专业的驾驶员是赛车轮胎?
CodingWithSpike

1

linq没问题,但是使用它的人却忽略了“幕后”的情况

我仍然更喜欢SQL。至少我会完全了解发生了什么。



1

大多数人都遗漏了一个要点:在大多数情况下,在LINQ中查询比在SQL中查询效率更高。我写了一篇关于为什么会这样的文章

当我设置LINQPad Challenge时,我并不是在开玩笑:我几乎在LINQ中进行所有临时查询,因为大多数查询在LINQ中的编写比在SQL中可以更快,更可靠地编写。我还使用LINQ to SQL设计和处理大型业务应用程序,并且看到了生产率的重大提高。这不是“架构宇航员”的东西-LINQ to SQL是一种高效且实用的技术,可以驱动此站点

LINQ的最大障碍是无法正确学习它。我已经看到了很多LINQ查询,它们是可怕的SQL查询音译,以支持这一点。如果仅使用SQL知识来编写LINQ查询,则最终结果只能与SQL相同(或更糟)。


阿尔巴哈里-谢谢你的评论。我毫不怀疑许多LINQ查询做得不好。现在,我会说一些令人信服的事情,但我会读您的论点RE:LINQ的生产率。就我个人而言,我发现SQL是非常有效和高效的!再次,虽然谢谢。。。
Mark Brittingham,2009年

您能否举一个很好的例子说明您看到的LINQ查询,它显然是SQL的音译,并且您可以更高效地编写?除了关联和参数设置(这是次要的)之外,您能否展示出更令人信服的东西?
Timwi 2009年


1

我刚刚发现了这个问题。我想现在已经差不多了,但是我还是要投入两美分...

我只想为不太明显的事情编写代码。

CRUD代码是显而易见的。我不想写。因此,ORM是一个好主意。

这并不意味着ORM没有问题,但是问题在于执行,而不是意图。随着ORM的成熟,问题将逐渐减少,简单方案已经可以利用的生产率提高最终也将扩展到复杂方案。

LINQ也是一个好主意。其他人提到了许多优点,但是我要做的只是想想我第一次尝试在LINQ中做一个透视,而我事先不知道列数。或者,这是我第一次意识到不必DataView每次都想对某项进行分类或过滤时就创建一个新的。LINQ使我能够使用C#中的数据执行我想做的所有事情,而不必弄清楚如何在SQL和C#之间划分工作。

因此,是的,ORM,LINQ和其他新兴技术是次优的解决方案,但它们不会错失重点,而且也不会永远是次优的。


+1-好评论-特别是这样的观察:“我只想为不太明显的事情编写代码。” 请记住,我并不是在一般意义上反对DAL(实际上,我多年来已经构建了三个类似ORM的DAL)。我争辩说,一个好的DAL并不需要MS向Linq to Entities投入的所有架构问题:自动化SQL繁琐的方面并减少SQL和C#数据结构之间的阻抗不匹配是您所需要的-这是最佳的解决方案。您对L2S所描述的所有优势都可以以更低的成本获得!
Mark Brittingham'2

@Mark,我刚刚很高兴地使用SqlMetal(命令行LinqToSql生成器)来执行一个相对简单的SQL Server Express数据库项目,并且喜欢它。它只是工作。我还没有遇到任何费用。至于LinqToEntities,由于“第1代”的所有已报告的问题,我一直在回避它,因此我真的无法发表评论。升级到Visual Studio 2010后,我肯定会给新的LinqToEntities外观。我一直认为这只是类固醇上的LinqToSql,但也许区别更根本。
devuxer 2010年

我一定会对此事保持开放的态度,因此很高兴听到您的经验RE:SqlMetal。首先-您会喜欢VS2010。我使用Beta已有大约4个月的时间,它是一项巨大的升级。WRT LinqToEntites,它与LinqToSql完全不同。您知道,如果MS对满足于LinqToSql感到满意,那么我真的不会喜欢我的话,因为我确实喜欢它。但是L2Sql已被弃用,L2E被定位为前进的道路,我只是认为这是一个错误。如果您尝试了一下,但又有所不同,我很想听听为什么。
Mark Brittingham'2

嗯...也许我应该把这个标题定为“ Linq to Entities难道不是要点吗?”
Mark Brittingham'2

@Mark,从我的角度来看,如果LinqToEntities不只是让我指向一个数据库并自动生成与该数据库交互所需的所有代码,那对于我来说绝对是一个倒退。我想要一个工具,可以使我的编程工作变得更轻松,并使我专注于特定应用程序特有的内容。回顾过去,关于您的头衔,也许您的问题确实是关于L2E而不是L2S的,但是无论哪种方式,它都产生了许多有趣的答案和讨论。
devuxer 2010年

0

我想写这为@SquareCog回复回复这里,但它告诉我,我不得不离开-1836字符。所以,如果我做错了,这里的菜鸟很抱歉。


在18世纪,休闲绅士曾经学习过科学。当时,整个科学还不是一个大问题,以至于一个相当聪明的人无法理解全部。我的意思是说,一个学识渊博的研究员可以理解当时整个科学思想。

随着时间的流逝,已经发现了数百个新的科学领域,并且每个领域都进行了研究,以至于如今很少有人甚至可以理解单个完整科学领域的全部。

编程也是如此。

如今,编程语言领域已经足够大并且发展得足够快,以至于开发人员知道自己的全部专门语言就可以合理预期。对于一个熟练的编码人员来说,也希望他们理解整个数据库领域,包括数据库设计,本机SQL的细微差别以及它如何在不同的数据库上运行以及这些数据库的管理,可能会要求很多。

我认为,这里的一些响应者正在掩盖开发大型高性能企业级数据库的一些复杂性,因为知道“少量SQL语句”肯定不会减少它。这就是为什么大多数大型软件公司都有专门的数据库开发人员团队的原因。正如Stroustrup所说,“分而治之”是有效处理开发和管理大型软件项目中固有的复杂性的唯一方法。

开发人员不喜欢使用SQL是因为他们懒惰或因为它使他们感到“讨厌”。他们不喜欢使用SQL,因为它们很聪明。他们比任何人都了解,只有专门从事SQL的人才能提供最高质量的数据库功能,而让他们成为“千篇一律的”开发人员是一个次优的开发策略。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.