<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>vifix.cn &#187; Database</title>
	<atom:link href="http://vifix.cn/blog/tag/database/feed" rel="self" type="application/rss+xml" />
	<link>http://vifix.cn/blog</link>
	<description>compile the dream, compile tomorrow</description>
	<lastBuildDate>Sun, 20 May 2012 15:26:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>开源键-值数据库笔记</title>
		<link>http://vifix.cn/blog/opensource-key-value-database.html</link>
		<comments>http://vifix.cn/blog/opensource-key-value-database.html#comments</comments>
		<pubDate>Wed, 20 May 2009 11:58:07 +0000</pubDate>
		<dc:creator>Mac</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[Freeware]]></category>

		<guid isPermaLink="false">http://vifix.cn/blog/?p=907</guid>
		<description><![CDATA[前段时间玩了Google App Engine之后一直对开源的键-值数据库比较关注，因为其开发使用方便，也有了在研究在自己的服务器上部署的可能性，于是自己Google了一些，同时Flying殿也有推荐了一下，于是发文简单记录一下。 眼下关注的有： MongoDB Hypertable CouchDB Tokyo Cabinet Project Voldemort 1. MongoDB 今天测试了一个白天的数据库，使用JSON格式存储数据，并且用Java小测试了一下它的性能，还算不错，1000000条记录里面检索500条记录，耗时0.078秒（有索引）。不过遗憾的是，没有编译成功它的Python API，PHP API的编译也因为文档不全的问题暂时搁置。不然的话真准备在这个上面做些Project试试看。另外它的控制台客户端的命令是ECMAScript的，对我来说觉得十分亲切。 官网：http://www.mongodb.org/ 2. Hypertable 根据Google的Bigtable的论文开始的一个项目，因此可以说这是一个开源的Google Bigtable的实现，通过Thrift这个框架（Facebook开发然后捐赠给Apache的工具）为其它语言提供API（不过官网上暂时仅看到Ruby的参考）。有趣的是，官方网站下面的赞助商那里看到了百度的Logo。 官网：http://hypertable.org/ 3. CouchDB Apache旗下的项目，使用Erlang/OTP开发，同样使用JSON存储数据。眼下的版本看了网上的评测性能还很一般。期待后续的发展。 官网：http://couchdb.apache.org/ 4. Tokyo Cabinet Tokyo Cabinet 是日本人平林幹雄开发的一款DBM数据库，该数据库读写非常快，哈希模式写入100万条数据只需0.643秒，读取100万条数据只需0.773秒，是 Berkeley DB 等DBM的几倍。 暂时只有Perl, Ruby, Java, Lua的API，不过可以通过Tokyo Tyrant来支持其它语言（通过Memcached协议） 官网：http://tokyocabinet.sourceforge.net/ 5. Project Voldemort 貌似可以使用MySQL（还有其他）作为永久存储介质的分布式数据库。 官网：http://project-voldemort.com/]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-908" title="server" src="http://vifix.cn/blog/wp-content/uploads/2009/05/server.png" alt="server" width="128" height="128" /></p>
<p>前段时间玩了Google App Engine之后一直对开源的键-值数据库比较关注，因为其开发使用方便，也有了在研究在自己的服务器上部署的可能性，于是自己Google了一些，同时Flying殿也有推荐了一下，于是发文简单记录一下。</p>
<p>眼下关注的有：</p>
<ol>
<li>MongoDB</li>
<li>Hypertable</li>
<li>CouchDB</li>
<li>Tokyo Cabinet</li>
<li>Project Voldemort</li>
</ol>
<p><span id="more-907"></span></p>
<h3>1. MongoDB</h3>
<p>今天测试了一个白天的数据库，使用JSON格式存储数据，并且用Java小测试了一下它的性能，还算不错，1000000条记录里面检索500条记录，耗时0.078秒（有索引）。不过遗憾的是，没有编译成功它的Python API，PHP API的编译也因为文档不全的问题暂时搁置。不然的话真准备在这个上面做些Project试试看。另外它的控制台客户端的命令是ECMAScript的，对我来说觉得十分亲切。</p>
<p>官网：<a href="http://www.mongodb.org/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.mongodb.org/?referer=');">http://www.mongodb.org/</a></p>
<h3>2. Hypertable</h3>
<p>根据Google的Bigtable的论文开始的一个项目，因此可以说这是一个开源的Google Bigtable的实现，通过Thrift这个框架（Facebook开发然后捐赠给Apache的工具）为其它语言提供API（不过官网上暂时仅看到Ruby的参考）。有趣的是，官方网站下面的赞助商那里看到了百度的Logo。</p>
<p>官网：<a href="http://hypertable.org/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/hypertable.org/?referer=');">http://hypertable.org/</a></p>
<h3>3. CouchDB</h3>
<p>Apache旗下的项目，使用Erlang/OTP开发，同样使用JSON存储数据。眼下的版本看了网上的评测性能还很一般。期待后续的发展。</p>
<p>官网：<a href="http://couchdb.apache.org/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/couchdb.apache.org/?referer=');">http://couchdb.apache.org/</a></p>
<h3>4. Tokyo Cabinet</h3>
<p>Tokyo Cabinet 是日本人平林幹雄开发的一款DBM数据库，该数据库读写非常快，哈希模式写入100万条数据只需0.643秒，读取100万条数据只需0.773秒，是 Berkeley DB 等DBM的几倍。<br />
暂时只有Perl, Ruby, Java, Lua的API，不过可以通过Tokyo Tyrant来支持其它语言（通过Memcached协议）<br />
官网：<a href="http://tokyocabinet.sourceforge.net/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/tokyocabinet.sourceforge.net/?referer=');">http://tokyocabinet.sourceforge.net/</a></p>
<h3>5. Project Voldemort</h3>
<p>貌似可以使用MySQL（还有其他）作为永久存储介质的分布式数据库。</p>
<p>官网：<a href="http://project-voldemort.com/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/project-voldemort.com/?referer=');">http://project-voldemort.com/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://vifix.cn/blog/opensource-key-value-database.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google App Engine中datastore的Key</title>
		<link>http://vifix.cn/blog/google-app-engine-datastore-key.html</link>
		<comments>http://vifix.cn/blog/google-app-engine-datastore-key.html#comments</comments>
		<pubDate>Thu, 14 May 2009 14:56:03 +0000</pubDate>
		<dc:creator>Mac</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[GAE]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://vifix.cn/blog/?p=898</guid>
		<description><![CDATA[Google App Engine使用了一种与关系数据库完全不同的数据库，称为分布式键-值数据库（Key-Value-Database），所有的&#8221;条目&#8221;，都是一个对象。这种数据库拥有代码简单，开发效率高，高并发访问效率等特性，但同时也有不支持模糊查询等缺点。 在使用上，键-值数据库和之前熟悉的MySQL等所有的关系数据库都有点不太一样，因此在开发vxtodo时走了一些弯路，比如这个等同于关系数据库的&#8221;主键&#8221;的问题就让我奇怪了很久（当然，对于这种的键-值数据库中，是否能以主键来称呼应该值得商榷），刚才终于摸索清楚了，记录下来。 Google App Engine的datastore的每个条目的唯一的键是自动生成的，无需人工干预。因为一开始并不清楚这一点，所以定义&#8221;表&#8221;的结构时找不到类似于自动索引的功能，结果开始写vxtodo时我用的是时间戳 + 用户名邮箱地址然后Hash再取绝对值出来的一个唯一值的诡异方法，虽然也能用，但是毕竟不够优雅（这样的Hash值实在是太长了）。仔细翻阅文档后，终于把ID/Name部分给看明白了。 首先，定义一个数据类型： class Task&#40;db.Model&#41;: user = db.UserProperty&#40;&#41; title = db.StringProperty&#40;&#41; content = db.TextProperty&#40;&#41; 这个就不用多说了，一目了然，GAE的入门教程里面也说的很清楚。一个&#8221;字段&#8221;一个属性，Google提供了一批数据类型可以使用。 获取某个条目的ID： query = Task.all&#40;&#41; tasks = query.fetch&#40;50&#41; for task in tasks: print task.key&#40;&#41;.id&#40;&#41; 与别的&#8221;字段&#8221;不同的是，无法直接以task.id来获取它，而是通过调用它的key()方法返回一个Key对象然后再执行这个Key对象的id()方法来获取到这个id。 用一个给定的ID来进行查找： key = Key.from_path&#40;&#34;Task&#34;, 3&#41; #Task类别里面的ID3的对象的键 —— 翻译成关系数据库的话，就是Task表里面的主键为3的项目的主键 query = Task.all&#40;&#41; query.ancestor&#40;key&#41; task = query.get&#40;&#41; #获取对象 id这个&#8221;字段&#8221;和别的属性不一样，是用Query类专门的ancestor()的方法来处理的，虽然一开始看文档的时候就注意到了这个方法，但是由于并不知道如何给定key的值（因为不知道上面的这个获取方法）所以不明如何使用。在看了Key的文档的from_path()方法恍然大悟。 去年在Java上接触到过一种对象数据库db4o其实差不多就是这样的类型，当时也花了一些时间来研究，然而当时这个db4o并不是很成熟（印象中存储中文似乎有乱码问题），最终不了了之，最近在Google App [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://vifix.cn/blog/wp-content/uploads/2009/05/google_appengine.png" rel="shadowbox[sbpost-898];player=img;" title="google_appengine"><img class="alignnone size-thumbnail wp-image-899" title="google_appengine" src="http://vifix.cn/blog/wp-content/uploads/2009/05/google_appengine-150x150.png" alt="google_appengine" width="150" height="150" /></a></p>
<p>Google App Engine使用了一种与关系数据库完全不同的数据库，称为分布式键-值数据库（Key-Value-Database），所有的&#8221;条目&#8221;，都是一个对象。这种数据库拥有代码简单，开发效率高，高并发访问效率等特性，但同时也有不支持模糊查询等缺点。</p>
<p>在使用上，键-值数据库和之前熟悉的MySQL等所有的关系数据库都有点不太一样，因此在开发<a href="http://vifix.cn/blog/vxtodo.html">vxtodo</a>时走了一些弯路，比如这个等同于关系数据库的&#8221;主键&#8221;的问题就让我奇怪了很久（当然，对于这种的键-值数据库中，是否能以主键来称呼应该值得商榷），刚才终于摸索清楚了，记录下来。</p>
<p>Google App Engine的datastore的每个条目的唯一的键是自动生成的，无需人工干预。因为一开始并不清楚这一点，所以定义&#8221;表&#8221;的结构时找不到类似于自动索引的功能，结果开始写vxtodo时我用的是时间戳 + 用户名邮箱地址然后Hash再取绝对值出来的一个唯一值的诡异方法，虽然也能用，但是毕竟不够优雅（这样的Hash值实在是太长了）。仔细翻阅文档后，终于把ID/Name部分给看明白了。</p>
<p><span id="more-898"></span></p>
<p>首先，定义一个数据类型：</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Task<span style="color: black;">&#40;</span>db.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:
    <span style="color: #dc143c;">user</span> = db.<span style="color: black;">UserProperty</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    title = db.<span style="color: black;">StringProperty</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    content = db.<span style="color: black;">TextProperty</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>这个就不用多说了，一目了然，GAE的入门教程里面也说的很清楚。一个&#8221;字段&#8221;一个属性，Google提供了一批数据类型可以使用。</p>
<p>获取某个条目的ID：</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">query = Task.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
tasks = query.<span style="color: black;">fetch</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">50</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">for</span> task <span style="color: #ff7700;font-weight:bold;">in</span> tasks:
    <span style="color: #ff7700;font-weight:bold;">print</span> task.<span style="color: black;">key</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: #008000;">id</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>与别的&#8221;字段&#8221;不同的是，无法直接以task.id来获取它，而是通过调用它的key()方法返回一个Key对象然后再执行这个Key对象的id()方法来获取到这个id。</p>
<p>用一个给定的ID来进行查找：</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">key = Key.<span style="color: black;">from_path</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Task&quot;</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>  <span style="color: #808080; font-style: italic;">#Task类别里面的ID3的对象的键 —— 翻译成关系数据库的话，就是Task表里面的主键为3的项目的主键</span>
query = Task.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
query.<span style="color: black;">ancestor</span><span style="color: black;">&#40;</span>key<span style="color: black;">&#41;</span>
task = query.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#获取对象</span></pre></div></div>

<p>id这个&#8221;字段&#8221;和别的属性不一样，是用Query类专门的ancestor()的方法来处理的，虽然一开始看文档的时候就注意到了这个方法，但是由于并不知道如何给定key的值（因为不知道上面的这个获取方法）所以不明如何使用。在看了Key的文档的from_path()方法恍然大悟。</p>
<p>去年在Java上接触到过一种对象数据库<a href="http://www.db4o.com/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.db4o.com/?referer=');">db4o</a>其实差不多就是这样的类型，当时也花了一些时间来研究，然而当时这个db4o并不是很成熟（印象中存储中文似乎有乱码问题），最终不了了之，最近在Google App Engine重新碰到这样的数据库类型，算是对这种键-值数据库的重新认识了吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://vifix.cn/blog/google-app-engine-datastore-key.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Zend_DB访问MySQL时使用UTF-8编码的问题</title>
		<link>http://vifix.cn/blog/zend_db%e7%9a%84utf-8%e9%97%ae%e9%a2%98.html</link>
		<comments>http://vifix.cn/blog/zend_db%e7%9a%84utf-8%e9%97%ae%e9%a2%98.html#comments</comments>
		<pubDate>Thu, 24 Jul 2008 08:29:21 +0000</pubDate>
		<dc:creator>Mac</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://vifix.cn/blog/?p=22</guid>
		<description><![CDATA[最近要在项目中使用Zend_DB作为数据库访问层，虽然方便，不过发现其对UTF-8无法默认就能很好的支持（不过其实更可能是因为mysql默认输出不是utf-8而导致这个问题） 大概的解决方法就是这样： $db-&#62;query&#40;&#34;set names utf8&#34;&#41; 显然，这样显得不够优雅（也可以说是心理问题 -_-b），每次都必须要手动的进行一次query。 于是更好的方案其实也就是让这个查询成为PDO的初始化查询，方法如下： 1 2 3 4 5 6 7 8 9 10 11 $db=Zend_Db::factory&#40;'PDO_MYSQL', array&#40; 'host' =&#62; 'localhost', 'username' =&#62; 'your_username', 'password' =&#62; 'your_password', 'dbname' =&#62; 'your_database', 'driver_options' =&#62; array&#40; PDO::MYSQL_ATTR_INIT_COMMAND =&#62; 'set names utf8' &#41; &#41; &#41;; 还有一个方法也很好，就是重写Zend_Db的factory方法： 1 2 3 4 5 6 7 8 9 10 [...]]]></description>
			<content:encoded><![CDATA[<p>最近要在项目中使用Zend_DB作为数据库访问层，虽然方便，不过发现其对UTF-8无法默认就能很好的支持（不过其实更可能是因为mysql默认输出不是utf-8而导致这个问题）<br />
大概的解决方法就是这样：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;set names utf8&quot;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>显然，这样显得不够优雅（也可以说是心理问题 -_-b），每次都必须要手动的进行一次query。<br />
于是更好的方案其实也就是让这个查询成为PDO的初始化查询，方法如下：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$db</span><span style="color: #339933;">=</span>Zend_Db<span style="color: #339933;">::</span><span style="color: #004000;">factory</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'PDO_MYSQL'</span><span style="color: #339933;">,</span>
	<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
		<span style="color: #0000ff;">'host'</span>           <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'localhost'</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'username'</span>       <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'your_username'</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'password'</span>       <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'your_password'</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'dbname'</span>         <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'your_database'</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'driver_options'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
			PDO<span style="color: #339933;">::</span><span style="color: #004000;">MYSQL_ATTR_INIT_COMMAND</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'set names utf8'</span>
		<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>还有一个方法也很好，就是重写Zend_Db的factory方法：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> My_Db <span style="color: #000000; font-weight: bold;">extends</span> Zend_Db
<span style="color: #009900;">&#123;</span>
   static <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> factory<span style="color: #009900;">&#40;</span><span style="color: #000088;">$adapterName</span><span style="color: #339933;">,</span> <span style="color: #000088;">$config</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
   <span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$adapter</span> <span style="color: #339933;">=</span> parent<span style="color: #339933;">::</span><span style="color: #004000;">factory</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$adapterName</span><span style="color: #339933;">,</span> <span style="color: #000088;">$config</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000088;">$adapter</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'set names utf8'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #b1b100;">return</span> <span style="color: #000088;">$adapter</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>以后就可以通过My_Db的factory方法来创建数据库连接了。<br />
另外还有一个方法，就是也可以修改Zend_Db的Zend_Db_Adapter_Pdo_Abstract（位于Zend/Db/Adaptor/Pdo/abstract.php）的_connect方法，在里面添加：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;set names utf8&quot;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>不过这样影响到移植性，所以不推荐……</p>
]]></content:encoded>
			<wfw:commentRss>http://vifix.cn/blog/zend_db%e7%9a%84utf-8%e9%97%ae%e9%a2%98.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

