zoukankan      html  css  js  c++  java
  • PEAR MDB 数据库笼统层 —— 一次编写—各处运转

    来源:网海拾贝  




    Write once - run anywhere
    一次编写——各处运转

    这是Java的一句行销标语,然则它同时也是PHP的关键特征之一。很多商业模型依靠于把持体系有关性来保证产品可以或许发卖给普及的客户群体。是以,为什么要把你自身绑在某种数据库厂商的身上呢?数据库笼统层使得你可以或许与数据库自力的斥地你的利用法度。然则,频频情况下它们对性能的影响超越了你所希望的,要么他们并不敷裕笼统以消除全数和特定命据库相关的代码。

    这篇文章将教给我什么?

    这篇文章将对数据库笼统包 PEAR MDB 有一个很好的引见。文章的核心将是对 MDB 超越类似包所供应的更前进父老的特征,比方数据规范笼统和基于 XML 的 schema 管理。对 PHP 和 SQL 的基本分明是引荐的。

    为什么其它再要一个数据库类?

    频频, web 工程在客户已经确定了要利用那种 RDBMS (干系型数据库管理体系)之后被添加给已经存在的 IT 根蒂基础结构。即使那并不是因为分歧的预算概略影响的你选择何种数据用于安放的情况。最终,你作为斥地者概略庞年夜的偏好于不把自身绑在某个厂商身上。自此,意味着给每个支撑的数据对峙版本年夜概牺牲更多性能然则失落失落多于必须的易用性:走入 PEAR MDB 吧。

    MDB 是着眼于使得编写 RDBMS 有关的 PHP 法度成为庞年夜的过程的数据库笼统层。年夜部门其他的 PHP 的所谓数据库笼统层牢牢给全数支撑的数据库供应了一个公用 API 以及很是无穷的笼统(年夜部门只是针对序列的)。MDB 另一方面可以或许用来笼统全数数据库发送和接收的数据。乃至数据库 schema 都能被定义为 RDBMS 有关的格式。然则它供应这些成效的同时仍旧对峙了很高的性能以及庞年夜易用。这是经由过程深切调查两个风行的数据库笼统层,PEAR DB 和 Metabase, 之后并且对它们间断了交融后失落失落的。并且在交融过程中,趁着这个机遇清算了它们交融后的 API 以及任何影响性能的规划。

    MDB 是如何出现的?

    早在 2001 年的秋日,我就在寻觅一种概略可以或许让我公司的法度框架与 RDBMS 自力的数据库笼统包。这个目的是把特定命据库相关的代码数目增添到零。我发明供应多么的成效的唯一的一个包是 Metabase。然则 Metabase有一些部门是因为为了和 PHP3 兼容的让人分歧意的 API。尽管云云,我们决议 Metabase 是我们唯一的选择。然则即使是在给 Metabase 添加了一本性能改善的补丁之后,我们仍旧感触我们保持了太多的性能。我们在 2001 年的 PHP 国际集会上碰到了 Metabase 的作者,并且我们群情了让像 Metabase 多么的器械成为 PEAR 工程一部门的长处。后来不久,在 PEAR 邮件列表上就 PEAR DB 和 Metabase 交融的概略的长处又动手着手了一场计议。在我们公司间断了很多计议之后,我们决议包袱这个使命。数个月的艰辛事故之后,我们而今有了 MDB 的第一个晃动的 release。

    MDB 给你供应了什么?

    MDB 结合了 PEAR DB 和 Metabase 的年夜部门特征。实践上,PEAR DB 的特征中唯一不再存在的是作为成就集前往一个对象。我们保持了这个特征是因为这个特征不常用并且凑合性能的损失落是很是清楚的。很多斥地上的工夫用在了使得 API 尽概略的好用。最终,MDB 很是高地供应了这些成效至多和 PEAR DB 一样快并且比 Metabase 快很多。这些最主要地特征的列表:

    OO 气概的 API
    预筹办的盘问模仿
    给全数传递出去以及从数据库中取出的数据的完全的数据规范笼统(包括 LOB 支撑)
    变乱支撑
    数据库/表/索引/序列设立创建/丢弃/篡改
    RDBMS 有关的数据库 schema 管理
    继承进 PEAR 框架(PEAR 装配法度,PEAR 错误处置等)

    那么它如何利用呢?

    MDB 供应了一些很是前进父老的笼统特征。记着这些特征只是供选择的是很主要的。然则在编写 RDBMS 有关的 PHP 法度时利用它们是很是主要的。一个展示利用 MDB 是多么庞年夜的例子在文章的结尾的 "链接和文献" 部门。如前面所说,文章的核心是引见使得 MDB 与其他 PHP 数据库笼统层分歧的那些特征。你可以在随本期文章一同包装的 CD 中找到全数这些例子剧本的代码。

    然则,起首我们需要把 MDB 装配上去。利用 PEAR 装配法度这真实很是容易。我不能在这篇文章中完整的申报 PEAR 装配法度然则我听说下一期将很是细致的计议 PEAR 框架的里里外外。让装配法度运转于 Windows 的事故在间断当作然则支撑仍旧有一点怪僻。凑合 *nix 体系你需要 PHP 的 CGI 版本装配在了你的体系并且庞年夜地运转下面地号令:


    lynx -source go-pear.org|php

    在装配完成之后你只需要再输出一行号令那么就全数搞定了。


    pear install MDB

    如果前面的过程对你来说不管用,总是有从 PEAR MDB 主页中央接失落掉包的选项。URL 列于文章的着末。

    利用数据规范笼统

    因为年夜部门数据库偏向于有一些特征年夜概怪癖,凑合MDB来说把这些分歧之处给斥地者潜匿起来很是主要。MDB 经由过程定义自身的外部数据规范来到达这点:text,boolean,integer,decimal,float,date,time,time stamp,large objects(文件)。全数传递给数据库和从数据库获取的数据都能转换成 MDB 的外部格式年夜概从数据库的外部格式转化归来。本节相关的例子脚天分够再 datatype 目次中找到。让我们看看下面的盘问:


    $session = '098f6bcd4621d373cade4e832627b4f6';
    // set time out to 30 minutes
    $timeout = time() 60*30;
    // SELECT query showing how the datatype conversion works
    $query = 'SELECT createtime, user_id FROM sessions';
    $query .= ' WHERE session = '.$session;
    $query .= ' AND lastaccess < '.$timeout;

    这个盘问如果发送给数据库的话八成要失落败。缘故原由是存储在 $name 中的值需要转换为精确的字符串格式。这年夜概意味着 $name 的内容概略有特另外转义字符年夜概被引号包抄。PEAR DB 为此供应了方式 DB:.quote()。在 MDB 中这个方式叫 MDB::getTextValue()。分歧之处是 MDB 给每种前面所列的数据规范都供应了多么的函数。是以我们也可以或许把 $timeout 转换为精确的格式。


    // convert $timeout to the MDB timestamp format
    $timeout = MDB_date::unix2Mdbstamp($timeout);
    // SELECT query showing how the datatype conversion works
    $query = 'SELECT createtime, user_id FROM sessions';
    $query .= ' WHERE session = '.$mdb->getTextValue($session);
    $query .= ' AND lastaccess < '.$mdb->getTimestampValue($timeout);

    为了作个演示,让我们假定我仅仅想要获取第一行。MDB::queryRow() 失落失落第一行,它开释成就集并且前往其内容,是以它恰是我们所要的。


    $result = $mdb->queryRow($query);

    然则分歧的 RDBMS 前往像日期多么的数据时用的格式是分歧的。是以,如果我们然后要对一些数据间断较劲争论,不管选择的 RDBMS 是什么,把数据以相同的格式前往是主要的。这个可以由 MDB 半主动地完成。你全数需要做的是关照你的成就列将是什么样的规范,MDB将处置转换的事故。最庞年夜的法子是把多么的信息传递给盘问函数。


    $types = array('timestamp', 'integer');
    $result = $mdb->queryRow($query, $types);

    这关照 MDB 成就集的第一列规范是 'timestamp' 以落第二列是'integer'。全数盘问函数可以或许接管多么的元信息作为可选的参数。数据还能事后用 MDB::setResultTypes() 来设置。取决于数据获取于的数据库,它然后将被相应的转换前往的数据。MDB 外部的 timestamps 的数据格式是依照 ISO 8601 规范的。其他像 PEAR::Date 多么的包可以或许处置这种格式。MDB 还在 MDB_Date 类中供应了一些数据格式转换函数,它们可以或许被可选的包括。

    因为相称多的 RDBMS 以相同的方式前往整数数据,没有需要转换整数数据。是以,为了失落失落稍许的性能改善你可以或许这么做:


    $types = array('timestamp');
    $result = $mdb->queryRow($query, $types);

    多么只要成就集的第一列会被转换。固然,如果 MDB 用于前往整数分歧的数据库,这概略成为一个题目。然则,稍许的性能改善概略并不值得冒这个危害。然则再一次的,它显露了这些特征的利用仅仅是供选择的。

    Listing 1 展示了一个利用预筹办的盘问的例子。如果你必须运转少量盘问而唯一的差异是数据传递给数据库,然则盘问的结构照样一样的,这些可以或许相称的容易。低级的数据库可以或许在内存中贮存分析');好的盘问来加快性能。

    Listing 1


    $alldata = array(
    array(1, 'one', 'un'),
    array(2, 'two', 'deux'),
    array(3, 'three', 'trois'),
    array(4, 'four', 'quatre')
    );

    $p_query = $mdb->prepareQuery('INSERT INTO numbers VALUES (?,?,?)');
    $param_types = array('integer', 'text', 'text');

    foreach ($alldata as $row) {
    $mdb->execute($p_query, NULL, $row, $param_types);
    }

    在 $alldata 中贮存的全数四个数组将用于 execute 语句。数据将主动被转换为精确的格式。因为这是一个拔出语句,MDB::execute() 的第二个参数被设置为 NULL 因为我们将没有任何成就列需要我们设置数据规范。

    在支撑的数据规范中另有 LOB (年夜对象),它使得我们可以或许在数据库中贮存文件。二进制文件贮存在 BLOB (二进制年夜对象)中并且普通文本文件贮存在 CLOB (字符年夜对象)中。在 MDB 中你仅仅可以或许利用预筹办的 INSERT 和 UPDATE 盘问贮存 LOB。利用 MDBA::setParamBlob() 年夜概 MDB::setParamClob() 你可以或许设置预筹办盘问的 LOB 域的值。两个函数都预期传递一个 LOB 对象,而它可以或许利用 MDB::createLob() 设立创建。


    $binary_lob = array(
    'Type' => 'inputfile',
    'FileName' => './myfile.gif'
    );
    $blob = $mdb->createLob($binary_lob);

    $character_lob = array(
    'Type' => 'data',
    'Data' => 'this would be a very long string container the CLOB data'
    );
    $clob = $mdb->createLob($character_lob);

    如你能看到的,MDB::createLob() 被传递一个干系数组。Type 键的值概略是以下中的一个:data, inputfile 年夜概 outputfile。前两个用于你想要把 LOB 写入数据库的时候。如果你有一个贮存在变量中的 LOB,你应当在 需要利用 inputfile 时从文件间接读取 LOB。着末,outpufile 应当在你想要从数据库中读取 LOB 时利用。取决于你可否利用数据年夜概 inputfile 你需要给 Filename 键年夜概 Data 键指定一个值,像下面的例子那样。而今,我们将把前面的 LOB 贮存到数据库中去。


    $p_query = $mdb->prepareQuery('INSERT INTO files (id, b_data, c_data) VALUES (1, ?, ?)');

    $mdb->setParamBlob($p_query, 1 , $blob, 'b_data');
    $mdb->setParamClob($p_query, 2 , $clob, 'c_data');

    $result = $mdb->executeQuery($p_query);

    为了从数据库中获取下面的文件,我们需要起首从数据库中选择数据并且利用 MDB::createLob() 设立创建 LOB 对象。此次我们将设置 'Type' 为 'outputfile'


    $mdb->query('SELECT b_data FROM files WHERE id = 1');

    $binary_lob = array(
    'Type' => 'outputfile',
    'Result' => $result,
    'Row' => 0,
    'Field' => 'b_data',
    'Binary' => 1,
    'FileName' => './myfile2.gif'
    );
    $blob = $mdb->createLob($binary_lob);

    而今我们可以或许利用 MDB::readLob() 从成就会合读取 LOB。传递长度 0 给 MDB::readLob() 意味着整个 LOB 被读取和贮存在我们前面指定的文件中。一旦使命完成了,我们可以把成本开释了。你也可以设置任何年夜于零的长度并且利用一个 while 循环搜查 MDB::endofLob() 来读取 LOB。


    $mdb->readLob($blob, $data, 0);

    注重你不要把这个获取函数和 bulk 获取函数像 MDB::fetchAll()搞混了,因为这将在年夜部门 PHP 数据库扩展中招致题目。在一些时候,MDB 概略可以或许利用 bulk 获取函数失落失落 LOB。

    如我们在这节所见,MDB 特征自身的原生数据规范集主动映射于数据库中的原生数据规范。这保证了无论我们发送和从数据库接收什么样的数据,它都能与利用的 RDBMS 有关的利用相同的格式。如我在本节开篇已经提到的,这清楚需要数据库利用的数据规范是 MDB 预期的。这种需要被用于确保映射所花费的价值很小。下一节将教给我们 MDB 如何协助在数据库中利用精确的数据规范。


    利用 XML schema 文件

    利用在上个段落中描写的特征,你能编写真正的数据库自力的法度。然则 MDB 检验考试向前愈加迈出一步:它批准你用 XML 定义你的 schema。一个管理器把这种 schema 转换为给每种 RDBMS 的需要的 SQL 语句。这意味着你能对全数支撑的 RDBMS 利用相同的 schema。本节的例子可以或许在 xml_schema 目次中找到。

    我们而今将从头编写一个 XML schema 文件。起首,我们必须定义一个 XML 文档。数据库定义是包括在一个 database 标签之中的。数据库的名字是利用 name 标签定义的。create 标签关照管理器数据库可否需要在它不存在的时候被设立创建。如果你把你的 schema 文件联结成好几个文件你你起首提交给管理器的阿谁文件中把 create 设置为 1。


    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <database>
    <name>auth</name>
    <create>1</create>
    </database>

    概略你已经从数据库名 auth 猜出了这个数据库的目的是用于贮存庞年夜的验证法度的用户数据。Listing 2 定义了在其中我们能贮存用户数据的表。

    Listing 2


    <table>
    <name>users</name>
    <declaration>
    <field>
    <name>user_id</name>
    <type>integer</type>
    <notnull>1</notnull>
    <unsigned>1</unsigned>
    <default>0</default>
    </field>
    <field>
    <name>handle</name>
    <type>text</type>
    <length>20</length>
    <notnull>1</notnull>
    <default></default>
    </field>
    <field>
    <name>is_active</name>
    <type>boolean</type>
    <notnull>1</notnull>
    <default>N</default>
    </field>
    </declaration>
    </table>

    如你能看到的,如利用 XML 时可以预期的,器械变得有一些冗长。不消担心:我们有一个基于阅读器的对象称为 MDB_frontend 使得这个过程愈加庞年夜。我将在这篇文章的前面群情这个工程。概略这极度细致地表格描写的长处是很是清楚。前面例子中的表格被称为 users 并且我们定义了 3 个域:规范为整数的 user_id,规范为文本的 handle 和规范为逻辑型的 is_active。记着如果你如前一节那样传递了需要的元数据 MDB 为你处置规范笼统。你还不需要 MDB 把这些规范映射为你的 RDBMS 中的什么。在每个域声明中还能利用的其他标签是可选的:length,notnull,unsigned 和 default。

    下一件我们而今需要做的事故是经由过程在 user_id 域放置适当的索引确保 user_id 是唯一的。索引定义就在声明标签之内(Listing 3)。

    Listing 3:


    <table>
    <name>users</name>
    <declaration>
    <index>
    <unique>1</unique>
    <name>user_id_index</name>
    <field>
    <name>user_id</name>
    <sorting>ascending</sorting>
    </field>
    </index>
    </declaration>
    </table>

    在 listing 3 中的定义在域 user_id 中设立创建一个唯一的上升排序的名为 user_id_index 的索引。固然,我们可以庞年夜地添加其它一个域标签在索引定义中指定多于一个的域。我们而今仍旧没有提到的是为我们孕育发作唯一的用户 id 的序列。


    <sequence>
    <name>users_user_id</name>
    <start>1</start>
    <on>
    <table>users</table>
    <field>user_id</field>
    </on>
    </sequence>

    上一个例子很是的绕弯。一行行看过来,我们看到起首掀开一个 sequence 标签,随着一个指定序列名字的 name 标签。这之后随着一个定义序列初始值的 start 标签。而今,我们掀开一个可选的 on标签。这儿我们需要设置一个表中的指定域。这个信息是管理器用来把序列的值设置为 users 表的 user_id 域的最年夜值。如果 users 表是空的,作为调换利用的是 start 标签中指定的值。请注重在 start 标签中指定的值是我们挪用 MDB::nextId() 前往的第一个值。

    固然,你也能利用任何值初始化表。比方你概略想要用你总是想要包括在你的法度中的管理用户来初始化前面的表格。为了这么做,我们需要把一个 initialization 标签添加给 table 标签。Listing 4 定义了一在其它一用 insert 标签包括的行之后的行。

    Listing 4


    <table>
    <name>users</name>
    <initialization>
    <insert>
    <field>
    <name>user_id</name>
    <value>1</value>
    </field>
    <field>
    <name>handle</name>
    <value>default</value>
    </field>
    <field>
    <name>is_active</name>
    <value>Y</value>
    </field>
    </insert>
    </initialization>
    </table>

    如你从上个例子中能看到的那样,全数我们需要做的便是给表的每个域设定值。我们而今已经知道了需要的根蒂基础常识来设立创建一个 MDB 的 XML schema。下一步是把这个 schema 文件传递给 MDB 管理器。


    $manager = new MDB_Manager;
    $input_file = 'auth.schema';
    // we do not have to connect to a specify a specific database at this time
    $dsn = "mysql://$user:$pass@$host";
    $manager->connect($dsn);
    $manager->updateDatabase($input_file, $input_file. '.before');

    我们而今有了一个新的名字叫 auth 的数据库,它有一个表叫 users。在域 user_id 有一个索引。并且在表中另有一行。我们另有一个序列称为 users_user_id,它将被初始化为 1。是以序列中的下一个值便是 2。着末,schema 的一个拷贝以名字auth.schema.before 被设立创建。这是因为我们给 MDB_Manger::updateDatabase() 传递了可选的第二个参数。在下一节我们将看到为什么要设立创建这个拷贝。

    全数这些都很是令人诧异然则它变得更好。很多情况下法度需要在某些处所作出篡改。比方我们概略决议需要把表的名字从 users 酿成 people。我们概略还需要添加一个域 pwd 来贮存密码域(请搜查 textbox 的保管字)。


    保管字

    我们没有称阿谁域为 password 的缘故原由是那是 Interbase 中一个域名的保管字。因为我们需要 RDBMS 自力,MDB 管理器要么给出一个警告要么在 fail_on_invalid_names 选项被设置为真的时候(这是缺省值)失落败。

    在过来的时候,你概略而今正处于把你全数已经有的器械酿成这种新的 schema 的疾苦之中。然则因为 MDB 这些事故可以或许主动完成。在 listing 5 中是我们对我们的表格定义间断的修改:

    Listing 5


    <table>
    <name>people</name>
    <was>users</was>
    <declaration>
    <field>
    <name>pwd</name>
    <type>text</type>
    <length>32</length>
    <notnull>1</notnull>
    <default></default>
    </field>
    </declaration>
    </table>

    而今我们想要管理器来作出需要的篡改,然则在此之前我像提一下概略的圈套。因为我们把表从 users 改名为 people,我们还需要把全数对原来名字的援用间断变化,歧我们树立的序列。在 on 标签中的索引需要变化为指向 people 表。为了到达这个目的,我们把 shcema 的新旧版本传递给管理器。这酒是为什么我们在第一次挪用 MDB_Manager::updateDatabase() 时我们设立创建一个 .before 文件的缘故原由。这确保了我们有一个旧版本的 shcema 来与新的版本间断比照。


    $input_file = 'auth.schema';
    $manager->updateDatabase($input_file, $input_file.'.before');

    全数的便是多么!users 体而今称为 people 并且我们也有了一个 pwd 域。

    我而今要看看 XML schema 格式的着末一个特征。如果你想要编程性的利用管理器,这个特征尤其主要。假定你有好几个有相同验证法度运转在你的数据库效能器的客户。 每个客户有一个效能器运转在这个效能器有相同的 schema 只要粗大的区别:数据库的名字。概略为每个客户零丁保管 schema 文件是可行的因为更新周期概略不是一样的,这不是我们例子验证法度的情况。这儿全数的客户同时更新。XML schema 文件批准我们为此可以利用变量。


    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <database>
    <name><variable>name</variable></name>
    </database>

    我们而今在运转时设置变量为随意率性我们需要的器械。


    foreach($clients as $name) {
    $variables = array('name' => $name)
    $manager->updateDatabase($input_file, $input_file.'.before', $variables);
    }

    XML schema 管理是 MDB 供应的数据库笼统概念的其它一个很是主要的部门。它使得我们对峙我们的 schema 定义与特定的 RDBMS 有关。然则利用这个格式还确保了利用精确的原生数据规范是以 MDB 可以或许精确地映射它的原生数据规范。着末,因为数据是基于 XML 的,编写孕育发作年夜概读取 XML schema 文件的对象要容易一些。


    听起来不错然则我的利用法度已经利用了……

    年夜部门读者概略发明它们处于多么的地步——他们已经有了少量运转于其他数据库笼统层的法度。因为 MDB 的身世,年夜部门 PEAR DB 的用户应当发明 MDB 觉得传染上很是类似,因为 MDB 的 API 是基于 PEAR DB 的。Metabase 用户应当发明他们全数偏爱的成效都在 MDB 中有对应的器械。XML schema 格式和 Metabase 中的是一摸一样的。一个完全的引导来引导你把已经写好的法度移植到 MDB 中凌驾了本文的局限,然则我将利用这个机遇给一些提示。如果你有任何细致的题目,放心的发信来询问我。

    为了把你的 PEAR DB 法度移植到 MDB,最好的终点是 PEAR wrapper。你能利用 PEAR wrapper 来运转你的法度。wrapper 固然添加了一些额外担负,是以你概略有些想要移植到原生的接口。那么第一步是列出全数你法度当前利用的 PEAR DB 函数。然后看看 wrapper 从中找出任何 API 上的区别。有两个你要注重的关键区别:成就集不再是对象并且全数的批准你传递成就集的数据规范的盘问方式将招致参数顺序上的少许篡改。第一个区别意味着不能再成就对象上挪用获取函数。


    $result = $db->query($sql);
    $row = $result->fetchRow();

    你而今必须挪用 MDB 对象来间断获取:


    $result = $mdb->query($sql);
    $row = $mdb->fetchRow($result);

    第二个区别经由过程调查 wrapper 可以容易的被操持。如你再 wrapper 中能看到的,你可以再 MDB 渴想失落失完工就集的数据规范的处所庞年夜地传递 NULL。而今,你地法度应当可以或许利用 MDB。固然,你而今没有真正失落失落了 MDB 地低级特征长处的好处。这最有概略的是需要对你当前的数据库 schema 间断一些篡改。管理器可以或许检验考试反向地从已经存在的数据库中获取 XML schema 文件。一个很是庞年夜的前端可以在 MDB 包中找到:reverse_engineer_xml_schema.php 剧本。极有概略你将需要手动修改孕育发作的 XML schema 恩见,然则它将给你一个很好的动手着手。

    如果你想要把你已经存在的法度从 Metabase 移植到 MDB 你将必须篡改全数的函数挪用。审查 Metabase wrapper 需要篡改什么将变得很是清楚。如果你知道正则表达式你概略可以或许完成年夜部门多么的调换事故。无论如何,你应当向前并且运转你原来喜好的低级笼统特征然则而今用的是 MDB。你概略注重失落失落的是函数名变得愈加冗长了。如果你作一些性能测试,你也将看到可不雅观的性能改善。


    那么 MDB 将来会是什么样子呢?

    本文发表时 MDB 概略已经不再是原来的 1.0 release 了。在原来的 MySQL 和 PostGreSQL 驱动之后,MDB还将有一个 ODBC 驱动以及概略的更多的驱动。这是 MDB 斥地过程中关注的关键地域之一。一旦 MDB 在驱动方面跟上了 PEAR DB,它很有概略成为 PEAR 框架中规范的数据库笼统层。

    然则另有其它一个斥地中的关键领域:MDB_frontend 工程。MDB_frontend将成为基于 MDB 和 MDB 管理器的 phpMyadmin。有了这个对象,你将可以或许阅读贮存在 MDB 支撑的 RDBMS 中的数据库。MDB_frontend 将同时显露原生和 MDB 数据规范。模仿的特征歧 MySQL 中的序列将被潜匿。用户将仅仅看到一个序列列表而不是一个贮存序列指的表,而在 MySQL 中这便是序列是如何被模仿的。并且 MDB_frontend 将协助移植已经存在的数据库来切合 MDB 预期利用的原生数据规范。它还将协助设立创建和更新 XML schema 文件。一些初期的事故已经完成明了则很多事故需要在地下宣布之前被添加。

    驱动和 MDB_frontend 是以后斥地的全数核心,在 MDB 中另有很多用户概略需要的:像 bulk 获取 LOB 域的集成,其别人概略需要外部和主键支撑。如不息以来的那样如果你参加测试和完成,开源的器械将加快很多。然则我也很感谢像特征需求合阳的反应。


    一些文后的思考

    在数月的艰辛事故之后,MDB 正在当前的 PEAR DB 和 Metabase 用户中失落失落供认。我还希望当前还没有被其他数据库笼统层胜过的用户看法到 MDB 给他们的长处。固然,照样有很多法度需要对 RDBMS 间断分外剪裁,凑合这种情况像 MDB 多么的对象仅仅是添加了不消要的额外担负和限制。总的来说,我很是高兴我们在我们的公司中作出导游 MDB 斥地的决议。在早先,我对检验考试同时取悦 PEAR DB 和 Metabase 的用户然则成就概略各处不奉迎几许有些担心。其它一个关切的来源是 PHP 社区可否将协助其斥地。我很是高兴 PHP 社区来了并且协助撰写驱动以及 MDB 的核心。是以我们以为这个项目是一个极年夜的乐成。我们还一并相信 MDB 将失落失落更年夜的改善。并且我们对协助 PHP 变得更好感触高兴。

    关于作者
    Lukas Smith 是 PEAR DB 的主要作者。它积极地给多个 PHP 开远项目间断贡献并且是专注于 PHP 斥地的 BackendMeida 公司的树立者。


    链接 和 文献

    PEAR MDB homepage: http://pear.php.net/package-info.php?package=MDB
    PEAR MDB documentation: http://www.backendmedia.com/MDB/docs/
    PEAR MDB sample script: http://cvs.php.net/co.php/pear/MDB/MDB_test.php
    PEAR DB homepage: http://pear.php.net/package-info.php?package=DB
    Metabase homepage: http://www.php>
    Simple benchmark: http://freshmeat.net/screenshots/30313/  



    版权声明: 原创作品,批准转载,转载时请务必以超链接方式标明文章 原始因由 、作者信息和本声明。不然将究查功令责任。

  • 相关阅读:
    VS2008编写MFC程序--使用opencv2.4()
    November 02nd, 2017 Week 44th Thursday
    November 01st, 2017 Week 44th Wednesday
    October 31st, 2017 Week 44th Tuesday
    October 30th, 2017 Week 44th Monday
    October 29th, 2017 Week 44th Sunday
    October 28th, 2017 Week 43rd Saturday
    October 27th, 2017 Week 43rd Friday
    October 26th, 2017 Week 43rd Thursday
    October 25th, 2017 Week 43rd Wednesday
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1975836.html
Copyright © 2011-2022 走看看