`
it农民
  • 浏览: 28881 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

数据库持久层是什么东西?(php+mysql为例)

阅读更多

    在我接触这个概念的时候好像是05年,那时候有hibernate出来很流行,各个企业招聘都不在只是j2ee了还要求struts和 hibernate,我当时理解的数据库持久层就是就是数据库长链接,觉得设计的目的就是为了减少数据库服务的链接压力,当然这个理解是完全错误的。数据 库持久层设计就是ORM(Object relationship map)设计,应该是从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的时候,就应该考虑加上第五种,同时更新我们的对象映射。先就说到这 里,下篇再说方法和操作的映射。

3
0
分享到:
评论
2 楼 OnJavaRoad 2008-11-08  
  
1 楼 lugreen 2008-11-06  
 

相关推荐

    PHP基于MySQL数据库实现对象持久层的方法

    本文实例讲述了PHP基于MySQL数据库实现对象持久层的方法。分享给大家供大家参考。具体如下: 心血来潮,做了一下PHP的对象到数据库的简单持久层。 不常用PHP,对PHP也不熟,关于PHP反射的大部分内容都是现学的。 ...

    Moldable是一个抽象层用于管理MySQL数据库

    Moldable是一个抽象层,用于管理MySQL数据库,拥有改进的状态和操作数据库模式的功能。 Moldable集成了一个ORM类来管理持久性对象并适应数据库模式

    基于php+mysql+h5的宿舍管理系统.zip

    而MyBatis则是一个优秀的持久层框架,简化了数据库操作。 这些项目的开发旨在为用户提供便捷、高效的管理和服务。采用SSM框架的优势,使得这些项目具有灵活性、扩展性和可维护性。开发者可以更加专注于业务逻辑的...

    鼎峰企业智能建站系统PHP开源版

    dfeiew采用adodo作为数据库持久层,采用smarty模板引擎,美工灵活,而且smarty是编译型的,访问快速。 鼎峰拥有php+mysql,asp+access/ms sql版本,并且都是开源、免费的! 快速提供企业建站 传统的cms...

    php-mysql-engine:用纯PHP编写MySQL引擎

    PHP MySQL引擎PHP MySQL Engine是PHP的库,可让您使用MySQL 5.6的内存模拟来测试数据库驱动的应用程序。 该项目扩展了PDO类,并允许您调用... 但是像MySQL这样的数据库被设计为充满大量持久数据,而单元测试则写入少

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    在数据库处理方面,不需要在数据层借助存储过程及数据库服务器端函数封装过多的业务逻辑,因此数据库系统采用相对精巧的MySQL[6]。 该在线博客系统服务器端如果需要布置到其他主机上,则该主机必备条件如下: 1. ...

    -e-commerce-sites-with-php:前后台自己开发的电商网站-php源码-smarty模版

    -电子商务网站与PHP前后台自己开发的电商网站-php源码-smarty模版A.2017.2-2017.4 BhereShop购物商城项目该项目的IP,域名尚在准备案途中,此为安全的IP地址整体采用MVC模式的Smarty框架,持久层使用的是Redis缓存...

    mouldable:唯一用于持续交付PHP和MySQL ORM。 使用javanilemoldable可以消除数据迁移和架构更改的步骤,这通常是手动步骤或连续交付工作流程的例外

    Moldable是用于管理MySQL数据库的抽象层,具有改进的功能来更改状态和操纵数据库模式。 Moldable集成了ORM类,用于管理持久性对象和调整数据库模式 搜寻贡献者 :smiling_face_with_sunglasses: 我们正在寻找对ORM...

    犀利:Laravel 6+内容管理框架

    CMS不应该对持久层有任何期望:MySQL很酷-但这并不是解决每个问题的理想工具。 更重要的是,数据库结构与CMS无关。 内容管理员应使用其数据和术语,而不是CMS术语。 我的意思是,如果该项目涉及太空飞船,太空旅行...

    jackalope-doctrine-dbal:Jackalope的学说DBAL传输实现

    使用关系数据库持久化数据PHP Content Repository API( )的实现。 Jackalope使用Doctrine DBAL来抽象数据库层。 目前已测试它可以与MySQL,PostgreSQL和SQLite一起使用。 目前,它比功能更不完整,性能和更强大...

    JAVA上百实例源码以及开源项目

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    JAVA上百实例源码以及开源项目源代码

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    PHP'ersist-开源

    自编写相应的连接类以来,PHP-5.x的持久层即可连接到任何数据库(Firebird,MySQL等)。 我已经实现了MySQL和Firebird连接的类已有一段时间了。 造访:http://phpersist.wiki.sourceforge.net/Doc

Global site tag (gtag.js) - Google Analytics