SQL与存储过程?

我在StackOverflow(LINQ初学者指南)上看到了“LINQ初学者指南”这篇文章,但有一个后续问题:

我们即将启动一个新项目,在这个项目中,几乎所有的数据库操作都将是相当简单的数据检索(还有另一个已经写入数据的项目段)。 到目前为止,我们大多数其他项目都使用存储过程来处理这些事情。 但是,如果它更有意义,我想要利用LINQ-to-SQL。

所以,问题是这样的:对于简单的数据检索,哪种方法更好,LINQ到SQL或存储过程? 任何特定的赞成或反对?

谢谢。


LINQ与sprocs的一些优势:

  • 类型安全 :我想我们都明白这一点。
  • 抽象 :LINQ-to-Entities尤其如此。 这种抽象还允许框架添加可以轻松利用的其他改进。 PLINQ是向LINQ添加多线程支持的一个例子。 代码更改很少添加此支持。 做这种简单调用sprocs的数据访问代码将会更加困难。
  • 调试支持 :我可以使用任何.NET调试器来调试查询。 使用sprocs时,您无法轻松调试SQL,而且体验与您的数据库供应商有很大关系(MS SQL Server提供了查询分析器,但通常这还不够)。
  • 供应商不可知论者 :LINQ适用于大量的数据库,支持的数据库数量只会增加。 Sprocs并不总是可以在数据库之间移植,因为语法或功能支持不同(如果数据库支持sprocs)。
  • 部署 :其他人已经提到过,但部署单个部件比部署一组sprocs更容易。 这也与#4相关。
  • 更简单 :您不必学习T-SQL来进行数据访问,也不必学习调用sprocs所需的数据访问API(例如ADO.NET)。 这与#3和#4有关。
  • LINQ vs sprocs的一些缺点:

  • 网络流量 :sprocs只需在LINQ发送整个查询时通过线路序列化sproc-name和参数数据。 如果查询非常复杂,这可能会非常糟糕。 但是,随着时间的推移,LINQ的抽象允许微软改进。
  • 不太灵活 :Sprocs可以充分利用数据库的功能集。 LINQ在支持方面往往更通用。 这在任何类型的语言抽象中都很常见(例如C#vs汇编程序)。
  • 重新编译 :如果您需要对数据访问方式进行更改,则需要重新编译,编译并重新部署您的程序集。 Sprocs有时可以让DBA调整数据访问例程而不需要重新部署任何东西。
  • 安全性和可管理性也是人们争论的问题。

  • 安全性 :例如,您可以通过限制直接访问表来保护敏感数据,并将ACL放在sprocs上。 但是,使用LINQ,您仍然可以限制对表的直接访问,而将ACL放置在可更新的表视图上以实现类似的结果(假设您的数据库支持可更新视图)。
  • 可管理性 :使用视图还为您提供了屏蔽应用程序不受程序架构更改影响的优势(如表格规范化)。 您可以更新视图,而无需更改数据访问代码。
  • 我曾经是一个很大的sproc家伙,但我开始倾向于LINQ作为一个更好的替代品。 如果某些区域的sprocs显然更好,那么我可能仍会编写一个sproc,但使用LINQ访问它。 :)


    由于DBA多年来一直备受折磨,所以我通常是将所有内容都放入存储过程的支持者。 在Linq的情况下,简单的CRUD查询确实不会有性能差异。

    但在做出这一决定时请记住几件事情:使用任何ORM将您紧密地连接到您的数据模型。 DBA没有自由地修改数据模型而不强迫您更改编译后的代码。 通过存储过程,您可以在某个范围内隐藏这些更改,因为从过程返回的参数列表和结果集代表其合同,并且只要该合同仍然得到满足,内部程序就可以进行更改。

    而且,如果Linq用于更复杂的查询,调整数据库变得更加困难。 当存储过程运行缓慢时,DBA可以完全专注于代码,并且有很多选项,这样合同在他/她完成时仍然可以满足。

    我看到很多很多情况下,应用程序中的严重问题是通过更改存储过程中的模式和代码来解决的,而不会对已部署的已编译代码进行任何更改。

    Linq可能是一种混合式的方法吗? 当然,Linq可以用来调用存储过程。


    Linq to Sql。

    Sql服务器将缓存查询计划,因此sprocs没有性能增益。

    另一方面,您的linq语句将在逻辑上成为您的应用程序的一部分并进行测试。 Sprocs总是有点分离,难以维护和测试。

    如果我现在正在从头开始研究一个新的应用程序,那么我只会使用Linq,而不是sprocs。

    链接地址: http://www.djcxy.com/p/53013.html

    上一篇: SQL vs stored procedures?

    下一篇: WPF LINQ and the ObservableCollection