演变刚开始的时候只有sql语句即可以用交互模式一句一句执行 也可以用批模式执行多行sql语句一次提交执行。很快人们发现用批模式执行的一堆sql语言可以用过程的形式事先存放到数据库里面这就变成了存储过程。随着面向对象技术的成熟从程序中可以自动生成sql语句这就是ORM二性能很多人会说存储过程比sql语句性能好其实这个说法并不精确。如果我们把一堆sql以批的方式一次送入到服务器那么服务器会对这一堆sql进行缓存当下一次再度执行的时候就好像调用一个”匿名“的存储过程一样。在这种情况下性能差不多。但是如果我们不注意很有可能把可以一次提交的sql,变成了多次提交甚至是每个循环做了一次提交那么性能就很差了。也就是说如果使用sql,只要写法得当性能和sp区别不大。同样的道理ORM的性能取决于ORM的Sql生成算法 和用户使用的时候对生成算法的控制比如利用好Lazy laoding等在某些情况下甚至可以不通过sql,毕竟没有sql比最优化的sql还要快。三可维护性可维护性是选择sql,sp,orm最主要的因素。这里面有点”玄“因为不同的场景会得出不同的结论俗称“It depends刚开始的时候sql的维护性看起来是最差因为它往往散布在程序的每个角落。而存储过陈都放在数据库中有清晰接口。但是如果我们做一次重构情况居然会颠倒过来。首先存储过程完全可以照搬到C#中sp的名字直接变成method的名字sp的参数表直接变成method的参数表其实就是Command模式。其次把这些methdod放到一个文件或者文件夹中。所谓的DAL层如果喜欢层的话通过这个重构我们获得了以下的好处1首先是过程的调用和过程的定义放到了一起修改起来比较方便。IDE都有定义跳转功能。2过程的调用和定义同时进行版本控制不会出现不匹配的情况。减少了sp的参数表和调用的不匹配包括拼写类型参数次序3单元测试非常方便当然sp也有存在的价值比如所谓的安全性后面会提到。比如友好的调试环境对于中小型项目和初级程序员来说也是很好的选择。ORM则将可维护性提升身到了一个新的高度它试图将sql屏蔽起来在操作对象的同时自动就把数据库的事情给办了。ORM有两种模式一种是ActiveRecord, 一种是Datamapper前者从数据库中读取定义后者在程序中定义。不过由于前者往往用migration来生成数据库其实也是定义在程序里面的。好的ORM都有leaking的设计也就是留了个”后门“让你有机会用sql来控制。微软的linq从某个角度类说也是一种ORM, 它的设计思想可能是因为它觉得写sql语句比写c#代码效率高所以提供直接在C#中写sql语句的机制再自动生成真正的sql。不过ORM真正价值在于它可以在恰当的时候完全抛弃sql,比如比如读用cache,写用queue。而微软的linq完全是“无厘头”的风格在O中用R的写法难道是RRM 唯一的好处只是锁定程序和程序员在微软的平台上。三安全性
sql语句又叫ad hoc sql, ad hoc是拉丁语,意思是for this,可以翻译为“按每一次情况的办理”存储过程就是stored procedure, 简写为sp
演变刚开始的时候只有sql语句即可以用交互模式一句一句执行 也可以用批模式执行多行sql语句一次提交执行。很快人们发现用批模式执行的一堆sql语言可以用过程的形式事先存放到数据库里面这就变成了存储过程。随着面向对象技术的成熟从程序中可以自动生成sql语句这就是ORM二性能很多人会说存储过程比sql语句性能好其实这个说法并不精确。如果我们把一堆sql以批的方式一次送入到服务器那么服务器会对这一堆sql进行缓存当下一次再度执行的时候就好像调用一个”匿名“的存储过程一样。在这种情况下性能差不多。但是如果我们不注意很有可能把可以一次提交的sql,变成了多次提交甚至是每个循环做了一次提交那么性能就很差了。也就是说如果使用sql,只要写法得当性能和sp区别不大。同样的道理ORM的性能取决于ORM的Sql生成算法 和用户使用的时候对生成算法的控制比如利用好Lazy laoding等在某些情况下甚至可以不通过sql,毕竟没有sql比最优化的sql还要快。三可维护性可维护性是选择sql,sp,orm最主要的因素。这里面有点”玄“因为不同的场景会得出不同的结论俗称“It depends刚开始的时候sql的维护性看起来是最差因为它往往散布在程序的每个角落。而存储过陈都放在数据库中有清晰接口。但是如果我们做一次重构情况居然会颠倒过来。首先存储过程完全可以照搬到C#中sp的名字直接变成method的名字sp的参数表直接变成method的参数表其实就是Command模式。其次把这些methdod放到一个文件或者文件夹中。所谓的DAL层如果喜欢层的话通过这个重构我们获得了以下的好处1首先是过程的调用和过程的定义放到了一起修改起来比较方便。IDE都有定义跳转功能。2过程的调用和定义同时进行版本控制不会出现不匹配的情况。减少了sp的参数表和调用的不匹配包括拼写类型参数次序3单元测试非常方便当然sp也有存在的价值比如所谓的安全性后面会提到。比如友好的调试环境对于中小型项目和初级程序员来说也是很好的选择。ORM则将可维护性提升身到了一个新的高度它试图将sql屏蔽起来在操作对象的同时自动就把数据库的事情给办了。ORM有两种模式一种是ActiveRecord, 一种是Datamapper前者从数据库中读取定义后者在程序中定义。不过由于前者往往用migration来生成数据库其实也是定义在程序里面的。好的ORM都有leaking的设计也就是留了个”后门“让你有机会用sql来控制。微软的linq从某个角度类说也是一种ORM, 它的设计思想可能是因为它觉得写sql语句比写c#代码效率高所以提供直接在C#中写sql语句的机制再自动生成真正的sql。不过ORM真正价值在于它可以在恰当的时候完全抛弃sql,比如比如读用cache,写用queue。而微软的linq完全是“无厘头”的风格在O中用R的写法难道是RRM 唯一的好处只是锁定程序和程序员在微软的平台上。三安全性