设为首页 收藏本站
查看: 653|回复: 0

[经验分享] 数据库持久层是什么东西?(php+mysql为例)

[复制链接]

尚未签到

发表于 2016-10-19 07:33:33 | 显示全部楼层 |阅读模式
  在我接触这个概念的时候好像是05年,那时候有hibernate出来很流行,各个企业招聘都不在只是j2ee了还要求struts和hibernate,我当时理解的数据库持久层就是就是数据库长链接,觉得设计的目的就是为了减少数据库服务的链接压力,当然这个理解是完全错误的。数据库持久层设计就是ORM(Object relationshipmap)设计,应该是从java的实体bean中汲取过来的。我们用的数据库大多是关系数据库,建立关系的实体是数据表,所谓的orm设计就是让对象和数据库表之间建立映射关系,让我们操作数据表就像操作对象一样简单,表与表直接的关系映射成对象于对象之间的关系。可以简单的理解为,对象和数据表之间是一一对应的,这样设计的好处不仅仅是简单,更重要的是便于移植和维护,让程序和数据库操作分离(远离SQL)。下边我们先说说关系数据库,数据实体之间的关系。
  数据库建模的时候,比如我们用pd9.0,建立概念模型,pd会生成相应的逻辑模型和实体模型,这个也是一个比较复杂的工程,有专门的数据库建模教程,不管是实体也好,还是概念也好,之间有4种关系:1、一对多;2、多对一;3、多对多;4、内联(这种关系很多教程和书面上都把他抛弃了,但是我个人觉得还有必要存在),那映射出来的对象同样也是存在这样4种关系。接着说数据表的操作。
  我们用Sql操作数据表的时候,有四种操作:1、select;2、insert;3、update;4、delete;这是数据表操作最小四种因子,其他不管是多复杂的操作都是基于这四种操作的,那同样映射到我们的对象也就是有说有四个基础方法。这个时候大概有个思路,就是ORM设计就是4种关系加上4重操作构造一个对象实体,这样理解可以说正确也可以说不正确,因为对象不存在关系这么一说,只有方法和属性。
  现在讲讲为什么叫做持久层,这个持久并不是数据库资源是持久存在内存或者是cache中进行共享,而是映射的对象持久化,也就是系统只初始化一次映射关系,以后就不再做映射,在hibernate中要配置hibernate-config.xml来映射,在上次提到的propel有专门的配置生成工具(generator),在我自己修改后的autoCRUD也有这个工具,只是系统自己识别是不是要初始化(安装),总之一句话就是对象映射数据库表持久化。
  现在我我们心中大概有一个设计框架,下边看看我们的例子,当然是伪代码:
  Class Orm_CRUD {
    var $table;
    var $name;
    var $key;
    var $fields = array();
    var $required = array();
    var $numeric = array();
    var $indexes = array();
    var $where;
    var $orderby;
    var $_php;
    var $_parent;
    var $_relationships = array();
    var $_joins = array();
    var $_aliases = array();
  }
  上边的这些属性能不能完整的描述一个数据表,表名,主键,字段,非空字段,数字类型,索引,别名,关系,已经完全可以描述一个mysql数据表,其中的where和orderby这些属性很明显了是为统一sql准备的。数据表描述OK了,每个数据列是不是要单独映射呢?答案是必要的,下边看看我们的每个列的属性描述:
  Class Orm_ColumCRUD {
    var $table;
    var $name;
    var $iskey;
    var $isnull;
    var $type;
  var $size;
    var $isrelationship;
    var $isindexes ;
    var $isunique;
    var $description
  }
  看了这些命名我想基本上清楚了,包含列所有属性,表名,字段名,类型,长度,为空,索引,关系,唯一,描述,主键。到这里我们属性映射的工作基本上完成了,下边就应该是数据表操作的映射了。实际上在大多数的应用下列的映射基本上是没有的,也可以不要这个环节,把他的一些重要的属性加入table的映射中,比如主键,是不是为空,等等,像autoCRUD就是这样设计的。
  我们对数据表的操作上边已经说过有四种,现在就不重复了,实际在现实情况中还有一种就是alter,修改表的属性,一般系统都不支持这样用,有两个风险,第一数据库压力,第二就是持久层对象也需要跟着改变,在这里设计的时候我们忽略了这个问题,在设计好的数据库模型上设计ORM,这种经常alert操作在现在比较时髦的自定义模型中用的比较多,自定义数据表字段,这个时候我们再设计ORM的时候,就应该考虑加上第五种,同时更新我们的对象映射。先就说到这里,下篇再说方法和操作的映射。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-288107-1-1.html 上篇帖子: Fedora13 x86_64环境下搭建 nginx 0.8.x + PHP 5.3.3 (php-fpm) + MySQL 5.5.3-m3 服务器 下篇帖子: mysql 长时间没连接了 就会自动断开服务
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表