couchdb
如果您是一名典型PHP开发人员,则无需对过去的项目进行全面的审查就可以得出一种有说服力的模式:在大多数(如果不是全部)情况下,您可能会让PHP与数据库后端进行对话。所有这些动态数据优势; 在99%的实例中,您正在使用MySQL。
现在,使用关系数据库没有任何问题。 如果您正在使用具有很多关系的高度结构化的数据,那么这就是要走的路。 您可以愉快地(或不愉快地,取决于您对SQL的熟悉程度和舒适度)完成以下工作:建立模式,规范化数据关系,设置表以及所有其他工作。
但是,有时您会在一个项目上工作,您可能会想自己:“我为什么要做所有这些工作?” 您正在处理的项目包含非常简单的数据位或难以预测的数据-您可能在不同的日期甚至是交易之间获得不同的数据字段。 如果要创建一个模式来预测即将发生的事情,您将最终获得具有许多空字段或许多映射表的表。
对于那些项目,您需要一种不同的方法-一种不涉及关系数据库的方法。 在这些情况下,您需要的是一个基于文档的,无架构的,具有临时地址空间的临时数据库。 简而言之,您需要Apache CouchDB。
什么是CouchDB?
CouchDB是(根据Apache CouchDB网站):
- 可通过RESTful JSON API访问的文档数据库服务器。
- 即席且无模式,具有平坦的地址空间。
- 分布式,具有健壮的增量复制以及双向冲突检测和管理功能。
- 可查询和可索引,具有面向表的报表引擎,该引擎使用JavaScript作为查询语言。
这意味着您可以创建一个接受JSON文档的CouchDB数据库。 每个文档都有一个唯一的修订ID,并具有自己的结构,所有文档都存储在同一平面集合中。 例如,假设您要设置简历集。 第一个简历包含姓名,姓氏,电话号码,电子邮件地址,Twitter帐户,资格列表和详细工作历史的字段。 第二份简历只是带有名字,姓氏,电子邮件地址和稀疏列表的工作历史记录。 差异可能足以使关系数据库感到不满,但是从CouchDB的角度来看,这只是办公室的另一天。
简而言之,CouchDB文档是由命名字段组成的对象。 这些字段值可以是字符串,布尔值,数字,日期,有序列表或关联映射。 清单1显示了一个示例简历文档。
清单1.一个简单的CouchDB文档
{
"Firstname": "Tom"
"Lastname": "Myer"
"Twitter": "@myerman"
"Email": "tom@example.com"
"Skills": ["php","couchdb","xml","json"]
"Work History": ....
}
到目前为止,如果您习惯使用JSON,那么这里没有什么太过分了。 即使您不是,也可以轻松地将此文档映射到更舒适的内容,例如PHP数组。 实际上,您会看到可以使用内置的JSON编码/解码功能与CouchDB一起使用,或者可以使用更面向对象的路径。
要查询集合中的信息,您可以通过RESTful JSON API使用各种引发舒适性的查询方法。 使用JSON的事实简化了很多问题。 一方面,作为熟悉JavaScript,Ajax和JSON的Web开发人员,您不必了解SQL就能完成任何事情。
在继续之前,最好先按下暂停按钮一分钟以强调几点。 CouchDB不是关系数据库。 您已经听过我这么说,但是强调这一点是个好主意。 不要尝试以关系方式使用CouchDB,例如插入ID字段来帮助您清楚文档之间的关系。 无需创建关系,而是将所需的内容填充到文档中并保持移动。
CouchDB并非如此:面向对象的数据库。 它不是某种本机对象,持久性数据层,您可以将其用作面向对象结构的基础。 不要这样
安装CouchDB
如果您使用的是Mac OS X,则CouchDB的安装过程非常简单:
- 打开“终端”窗口,然后键入
sudo port install couchdb
。 - 出现提示时,键入您的root密码。
- 启动MacPorts以安装必要的CouchDB软件包。
- 在“终端”窗口中,运行以下命令以检索所有最新更改或依赖项:
sudo port upgrade couchdb
。 - 要启动并运行CouchDB,请在终端中键入以下命令:
sudo launchctl load -w /opt/local/Library/LaunchDaemons/org.apache.couchdb.plist
这将启动CouchDB服务器并使其持续运行,因此,如果您重新启动Mac,它将启动。
要查看运行中的CouchDB,请在浏览器中键入http://127.0.0.1:5984/_utils/index.html。 将出现如图1所示的Futon实用程序。
图1. Futon实用程序
在Windows®系统上,您的过程将更加复杂,因为您需要安装Cygwin,Microsoft®C编译器,任意数量的其他先决条件(例如cURL,ICU和SeaMonkey),下载并安装源代码Erlang和Couch的代码,根据README文件进行配置,然后进行完整安装。 CouchDB Wiki中描述了此过程(请参阅参考资料 )。 您还将找到有关Linux®,Berkeley软件发行版(BSD)和其他环境的说明。
使用CouchDB API
在开始使用PHP之前,最好先了解一下CouchDB API,该API可通过HTTP使用GET
和PUT
请求进行访问,并以JSON格式返回数据。 无论使用哪种语言,此设置都可以轻松地从Web应用程序存储和检索数据-PHP,Microsoft Active Server Pages(ASP),Ruby,Python甚至简单的jQuery Ajax函数。
本节说明如何使用cURL命令行工具向CouchDB发出GET
, POST
, PUT
和DELETE
请求。 一旦掌握了API,一个特定PHP包装器就可以帮助您简化开发任务。
您首先需要运行(再次从“终端”窗口运行)此命令: curl http://127.0.0.1:5984/
。 您应该看到的响应类似于{"couchdb":"Welcome","version":"0.10.0"}
。 这只是告诉您CouchDB已启动并正在运行以及正在使用哪个版本。 如果没有看到此消息,请返回安装和配置过程以启动并运行CouchDB。
现在,尝试列出CouchDB中设置的所有集合。 运行curl -X GET http://127.0.0.1:5984/_all_dbs
。
如果这是CouchDB的全新安装,则应该看到response []
,这意味着不存在集合或数据库(双括号表示一个空JavaScript数组)。 请注意,通过此cURL命令,可以使用-X
选项来显式指定GET
操作。
因此,让我们通过创建数据库来解决该问题:
curl -X PUT http://127.0.0.1:5984/songs
运行此命令时,将看到响应{"ok":true}
。 您现在知道可以检查ok
属性以确保成功。 再次运行curl -X GET http://127.0.0.1:5984/_all_dbs
产生一个非空数组: ["songs"]
。 具体来说,您的CouchDB实例中有一个数据库: 歌曲。
现在尝试创建另一个名为“ 歌曲”的数据库。 如果再次运行curl -X PUT http://127.0.0.1:5984/songs
,则会收到以下错误消息:
{"error":"file_exists","reason":"The database could not be created,
the file already exists."}
因此,您很容易检查error
属性以查看是否发生了任何问题。
创建另一个名为foobar的数据库:
curl -X PUT http://127.0.0.1:5984/foobar
如果您运行curl -X GET http://127.0.0.1:5984/_all_dbs
,它将导致响应["songs","foobar"]
。 要摆脱第二个数据库,请传递DELETE
调用:
curl -X DELETE http://127.0.0.1:5984/foobar
运行curl -X GET http://127.0.0.1:5984/_all_dbs
显示您回到了["songs"]
。
现在继续在歌曲数据库中创建一些文档。 符合实际情况,您想在此数据库中存储一些歌曲,并带有歌曲标题,艺术家姓名和专辑名称的字段。 要创建文档,请遵循以下模式:
curl -X PUT http://127.0.0.1:5984/songs/*id* -d '{ *json_data* }'
请注意,您先调用数据库的名称,后跟某种类型的ID(不仅在此CouchDB实例中,而且在可能的情况下,最好在所有实例中都是唯一的),然后是JSON数据。
为什么要使用唯一ID? 您可以使用UUID(或GUID)作为唯一ID,也可以创建某种自然键来组合各种数据(例如,带有下划线的歌曲名称,而不是带有时间戳的空格),或者您可以让CouchDB为您创建一个唯一的ID(这是一个缓慢的过程)。 这些方法中的任何一种都是好的,只是不要像在MySQL环境中那样使用某种自动增量值。
现在,在数据库中输入一首歌曲:
curl -X PUT http://localhost:5984/songs/whatever_you_like -d \
'{"title":"Whatever You Like", "artist":"T.I.","album":"Paper Trail"}'
{"ok":true,"id":"whatever_you_like","rev":"1-1d915e4c209a2e47e5cf05594f9f951b"}
请注意,我对唯一ID采用了非常简单的方法(使用带有下划线而不是空格的简化的歌曲名称)。 这种简单的方法目前可能尚可。 幸运的是,将在PHP中使用的包装程序将帮助您创建更好的ID。 还要注意,我立即收到带有文档ID和rev
属性的“ ok”响应,以告诉我修订版本设置为什么。
要查看刚刚添加的文档,请尝试以下操作:
curl -X GET http://localhost:5984/songs/whatever_you_like
{"_id":"whatever_you_like","_rev":"1-1d915e4c209a2e47e5cf05594f9f951b",
"title":"Whatever You Like", "artist":"T.I.", "album":"Paper Trail"}
如果您正在Futon跟随,则应该能够单击歌曲数据库名称,并在文档列表中看到whatever_you_like
列表。 单击该链接将显示有关文档的详细信息,如图2所示。
图2.文档详细信息
您的主意是-使用JSON发出RESTful请求,然后事情就发生了。
现在,所有这些看起来都不错,但是如果您是PHP开发人员,那么您想知道如何将所有这些与您喜欢的东西联系在一起。 下一节将向您介绍一些CouchDBPHP包装器。
使用PHP
对于下一步,需要从GitHub下载PHP-ON-沙发(见相关主题 )。 将提取的/ lib文件夹内容放入开发区域。 设置工作区后,创建一个简单PHP应用程序,该程序将与您已经设置的CouchDB数据库(您的歌曲收藏)进行对话。 创建一个新文件,并将其命名为index.php。 将清单2中的代码放入其中。
清单2. CouchDB连接设置
<?php
$couch_dsn = "http://localhost:5984/";
$couch_db = "songs";
require_once "./lib/couch.php";
require_once "./lib/couchClient.php";
require_once "./lib/couchDocument.php";
$client = new couchClient($couch_dsn,$couch_db);
?>
该代码用作您与CouchDB的连接代码,并包括与数据库一起使用所需的所有相关类。 继续并列出与数据库有关的所有信息,如清单3所示。
清单3.获取数据库信息
try {
$info = $client->getDatabaseInfos();
} catch (Exception $e) {
echo "Error:".$e->getMessage()." (errcode=".$e->getCode().")\n";
exit(1);
}
print_r($info);
您应该得到的内容类似于清单4。
清单4.数据库信息
stdClass Object
(
[db_name] => songs
[doc_count] => 2
[doc_del_count] => 0
[update_seq] => 2
[purge_seq] => 0
[compact_running] =>
[disk_size] => 8281
[instance_start_time] => 1266082749089965
[disk_format_version] => 4
)
接下来,从您的歌曲数据库中检索文档。 清单5显示了这样做的代码。
清单5.从数据库检索歌曲
try {
$doc = $client->getDoc('whatever_you_like');
} catch (Exception $e) {
if ( $e->code() == 404 ) {
echo "Document not found\n";
} else {
echo "Error: ".$e->getMessage()." (errcode=".$e->getCode().")\n";
}
exit(1);
}
print_r($doc);
清单6显示了响应。
清单6.检索到的歌曲
stdClass Object
(
[_id] => whatever_you_like
[_rev] => 1-1d915e4c209a2e47e5cf05594f9f951b
[title] => Whatever You Like
[artist] => T.I.
[album] => Paper Trail
)
很好,但是如果您需要更新文档怎么办? 您可以进行两种不同类型的更新:通过对现有字段值进行更改或通过添加具有其自身值的新字段。 您可以使用箭头符号(例如$doc->new_field
)执行此操作,然后使用storeDoc()
提交更改。 清单7显示了用于更新文档的代码。
清单7.更新文档
$doc->genre = 'hip-hop';
$doc->year = 2008;
try {
$response = $client->storeDoc($doc);
} catch (Exception $e) {
echo "Error: ".$e->getMessage()." (errcode=".$e->getCode().")\n";
exit(1);
}
运行此代码,然后可以检索文档ID并返回清单8中的响应。
清单8.更新的文档
stdClass Object
(
[_id] => whatever_you_like
[_rev] => 2-12513a362693b300928aa45f82faed83
[title] => Whatever You Like
[artist] => T.I.
[album] => Paper Trail
[genre] => hip-hop
[year] => 2008
)
注意, _rev
属性已增加为2-whatever
。 以前是1-whatever
。 这是告诉您最新版本的简便方法。
如果要在数据库中存储新文档怎么办? 您将实例化一个新对象,并使用箭头符号填写文档中的字段。 清单9中的代码显示了这样做的代码。
清单9.创建一个新文档
$song = new stdClass();
$song->_id = "in_the_meantime";
$song->title = "In the Meantime";
$song->album = "Resident Alien";
$song->artist = "Space Hog";
$song->genre = "Alternative";
$song->year = 1995;
try {
$response = $client->storeDoc($song);
} catch (Exception $e) {
echo "Error: ".$e->getMessage()." (errcode=".$e->getCode().")\n";
exit(1);
}
print_r($response);
响应类似于清单10。
清单10.创建新文档的响应
stdClass Object
(
[ok] => 1
[id] => in_the_meantime
[rev] => 1-d65b03a9fe2f3c8095b08883e7cd97df
)
结论
至此,您已经有了足够多的信息来开始使用CouchDB和PHP。 创建基本更新表单,然后允许您创建或更新数据库中的现有文档,应该很容易。 通过PHP-on-Couch软件包,您还可以访问其他方法来创建和删除数据库,使用CouchDB视图等。 幸运的是,本文中有足够的信息可以帮助您入门。
翻译自: https://www.ibm.com/developerworks/opensource/library/os-php-couchdb/index.html
couchdb