SQL译为按每一次情况的办理,SP意为存储过程,ORM就是对象-关系映射,比如Hibernate
一,演变
  刚开始的时候,只有sql语句,即可以用交互模式一句一句执行, 也可以用批模式执行,多行sql语句一次提交执行。
  很快人们发现用批模式执行的一堆sql语言可以用过程的形式,事先存放到数据库里面,这就变成了存储过程。
  随着面向对象技术的成熟,从程序中可以自动生成sql语句,这就是ORM

二,性能
  如果我们把一堆sql,以批的方式一次送入到服务器,那么服务器,会对这一堆sql进行缓存,当下一次再度执行的时候,就好像调用一个”匿名“的存储过程一样。在这种情况下,性能差不多。
  但是,如果我们不注意,很有可能,把可以一次提交的sql,变成了多次提交,甚至是每个循环做了一次提交,那么性能就很差了,也就是说如果使用sql,只要写法得当,性能和sp区别不大。
  同样的道理,ORM的性能取决于ORM的Sql生成算法, 和用户使用的时候,对生成算法的控制,比如利用好Lazy laoding等,在某些情况下,甚至可以不通过sql,毕竟没有sql比最优化的sql还要快。

三,可维护性

  可维护性是选择sql,sp,orm最主要的因素。
  刚开始的时候,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, 唯一的好处只是锁定程序和程序员在微软的平台上。

 三,安全性

对企业来说,安全性有的时候比性能更重要,由于存储过程在数据库上多加了一道屏障,所以很多企业会把存储过程作为首选。
  ORM可以说是安全性最差的, 因为只有到程序运行起来,你才能知道,会产生什么样的sql。
  但是保证安全有许多方法和方面,比如部署前的测试, 数据库的备份,对表的权限的设置。等。用sp来保证安全,只是多个选项中的一个。
  在startup型企业中,高级程序员往往起到主导作用, 所以他们会不犹豫的选择ORM。
  在传统企业中,如果DBA或者技术主管比较强势,往往会采用sp。

综上所述:

  ORM SQL
开发速度
运行性能
方便修改    
可维护性

ORM,最大的问题是复杂查询,可以考虑SQL和ORM两者同时使用,简单地方用ORM,复杂地方用SQL;利用Cache等技术可以很好地提高查询速度,在Phalcon中,就是采用两者合用的方式:

1.Model中返回的是当前的Model集
2.PHQL中返回的是查询集
前者支持魔术方法get/count加关联Model名,用可选参数来进行二次筛选;后者采用类似SQL的方法来关联表,这样查询集
里面就利用驼峰规则就可以访问所有的字段:
$phql = "SELECT Cars.*, Brands.* FROM Cars, Brands WHERE Brands.id = Cars.brands_id"
$rows = $manager->executeQuery($phql);
foreach ($rows as $row) {
    echo "Car: ", $row->cars->name, "\n";
    echo "Brand: ", $row->brands->name, "\n";
}
还可以访问指定字段:
$phql = "SELECT Cars.name AS car_name, Brands.name AS brand_name WHERE Brands.id = Cars.brands_id";
$rows = $manager->executeQuery($phql);
foreach ($rows as $row) {
    echo $row->car_name, "\n";
    echo $row->brand_name, "\n";
}
当然可以加别名访问:
$phql = "SELECT c.*, b.* FROM Cars c, Brands b WHERE b.id = c.brands_id";
$rows = $manager->executeQuery($phql);
foreach ($rows as $row) {
    echo "Car: ", $row->c->name, "\n";
    echo "Brand: ", $row->b->name, "\n";
}

SQL,SP与ORM的更多相关文章

  1. 点评阿里JAVA手册之MySQL数据库 (建表规约、索引规约、SQL语句、ORM映射)

    下载原版阿里JAVA开发手册  [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文内容:MySQL数据库 (建表规约.索引规约.SQL语句.ORM映 ...

  2. AppBoxFuture: Sql存储的ORM查询示例

      上篇介绍集成第三方Sql数据库时未实现如导航属性.子查询等功能,经过大半个月的努力作者初步实现了这些功能,基本上能满足80%-90%查询需求,特别复杂的查询可以用原生sql来处理,下面分别示例介绍 ...

  3. 用建造者模式实现一个防SQL注入的ORM框架

    本文节选自<设计模式就该这样学> 1 建造者模式的链式写法 以构建一门课程为例,一个完整的课程由PPT课件.回放视频.课堂笔记.课后作业组成,但是这些内容的设置顺序可以随意调整,我们用建造 ...

  4. 转:C#制作ORM映射学习笔记二 配置类及Sql语句生成类

    在正式开始实现ORM之前还有一点准备工作需要完成,第一是实现一个配置类,这个很简单的就是通过静态变量来保存数据库的一些连接信息,等同于.net项目中的web.config的功能:第二需要设计实现一个s ...

  5. Python-12-MySQL & sqlalchemy ORM

    MySQL MySQL相关文章这里不在赘述,想了解的点击下面的链接: >> MySQL安装 >> 数据库介绍 && MySQL基本使用 >> MyS ...

  6. 吉特仓库管理系统-ORM框架的使用

    最近在园子里面连续看到几篇关于ORM的文章,其中有两个印象比较深刻<<SqliteSugar>>,另外一篇文章是<<我的开发框架之ORM框架>>, 第一 ...

  7. Python之路-python(mysql介绍和安装、pymysql、ORM sqlachemy)

    本节内容 1.数据库介绍 2.mysql管理 3.mysql数据类型 4.常用mysql命令 创建数据库 外键 增删改查表 5.事务 6.索引 7.python 操作mysql 8.ORM sqlac ...

  8. sqlalchemy ORM

    本节内容       ORM介绍     sqlalchemy安装     sqlalchemy基本使用     多外键关联     多对多关系   1. ORM介绍   orm英文全称object ...

  9. 解析Hibernate中的持久化—ORM(转载)

    最近一直在学习Hibernate,首先说一下Hibernate出现的原因吧,Hibernate是因为MVC的分层体系结构的出现,即数据持久层(模型层)的出现,持久层是在MVC三层架构的基础上提出来的, ...

随机推荐

  1. download plugin update site for offline installation

    Reference Eclipse Launcher Running update manager from command line   好多次为window下的eclipse不能拿到linux下直 ...

  2. JAVA基础--日期处理

    用SimpleDateFormat方法格式化日期格式: package DAO; import java.sql.Connection; import java.sql.DriverManager; ...

  3. hibernate--ID生成策略--annotation

    annotation: @GeneratedValue a) 自定义ID b)auto: 对mysql默认使用auto_increment, 对oracle使用hibernate_sequence c ...

  4. 制作win10 usb 启动盘

    Rufus 是一个开源的USB启动盘制作程序.其特点就是快速,且支持各种系统,包括各种windows系统,linux系统,使用也很简单. Rufus主页: http://rufus.akeo.ie/ ...

  5. (一)phoneGap之环境搭建教程及其example分析

    phoneGap之环境搭建教程及其example分析 一.环境搭建 与普通的开发android应用一样,phoneGap也同于原生android应用一样,环境相同,只是有部分不同,下面就我做理解,进行 ...

  6. [iOS Animation]-CALayer 图像IO

    图像IO 潜伏期值得思考 - 凯文 帕萨特 在第13章“高效绘图”中,我们研究了和Core Graphics绘图相关的性能问题,以及如何修复.和绘图性能相关紧密相关的是图像性能.在这一章中,我们将研究 ...

  7. $(function(){})的执行过程分析

    作者:zccst 首先,$(function(){})是$(document).ready(function(){})的简写形式. 在日常使用中,我们会把代码写到$(function(){})中,今天 ...

  8. LWIP_STM32_ENC28J60_NETCONN_TCP_CLIENT(4)

    既然udp说完了,那接下来自然就是TCP通讯了,今天说说TCP客户端通讯,也就是单片机作为客户端,主机PC作为服务器 相比于udp而言,tcp增加了一个连接服务器的流程,首先还是创建tcp_clien ...

  9. 扩展对EasyUI的校验规则

    var myReg = RegExp(/[(\*)(\|)(\\)(\:)(\")(\/)(\<)(\>)(\?)]+/); $.extend($.fn.validatebox. ...

  10. jquey插件开发

    1.概述 jquery插件开发的主要方法有三种: 1.通过$.extend()来扩展jQuery,即在jQuery命名空间下扩展属性,直接在$对象下调用,不需要再dom下调用,也无法在dom元素下调用 ...