开源键-值数据库笔记

server

前段时间玩了Google App Engine之后一直对开源的键-值数据库比较关注,因为其开发使用方便,也有了在研究在自己的服务器上部署的可能性,于是自己Google了一些,同时Flying殿也有推荐了一下,于是发文简单记录一下。

眼下关注的有:

  1. MongoDB
  2. Hypertable
  3. CouchDB
  4. Tokyo Cabinet
  5. Project Voldemort

Read the rest of this entry >>

Google App Engine中datastore的Key

google_appengine

Google App Engine使用了一种与关系数据库完全不同的数据库,称为分布式键-值数据库(Key-Value-Database),所有的”条目”,都是一个对象。这种数据库拥有代码简单,开发效率高,高并发访问效率等特性,但同时也有不支持模糊查询等缺点。

在使用上,键-值数据库和之前熟悉的MySQL等所有的关系数据库都有点不太一样,因此在开发vxtodo时走了一些弯路,比如这个等同于关系数据库的”主键”的问题就让我奇怪了很久(当然,对于这种的键-值数据库中,是否能以主键来称呼应该值得商榷),刚才终于摸索清楚了,记录下来。

Google App Engine的datastore的每个条目的唯一的键是自动生成的,无需人工干预。因为一开始并不清楚这一点,所以定义”表”的结构时找不到类似于自动索引的功能,结果开始写vxtodo时我用的是时间戳 + 用户名邮箱地址然后Hash再取绝对值出来的一个唯一值的诡异方法,虽然也能用,但是毕竟不够优雅(这样的Hash值实在是太长了)。仔细翻阅文档后,终于把ID/Name部分给看明白了。

Read the rest of this entry >>

Zend_DB访问MySQL时使用UTF-8编码的问题

最近要在项目中使用Zend_DB作为数据库访问层,虽然方便,不过发现其对UTF-8无法默认就能很好的支持(不过其实更可能是因为mysql默认输出不是utf-8而导致这个问题)
大概的解决方法就是这样:

$db->query("set names utf8")

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

1
2
3
4
5
6
7
8
9
10
11
$db=Zend_Db::factory('PDO_MYSQL',
	array(
		'host'           => 'localhost',
		'username'       => 'your_username',
		'password'       => 'your_password',
		'dbname'         => 'your_database',
		'driver_options' => array(
			PDO::MYSQL_ATTR_INIT_COMMAND => 'set names utf8'
		)
	)
);

还有一个方法也很好,就是重写Zend_Db的factory方法:

1
2
3
4
5
6
7
8
9
10
class My_Db extends Zend_Db
{
   static public function factory($adapterName, $config = array())
   {
      $adapter = parent::factory($adapterName, $config);
      $adapter->query('set names utf8');
 
      return $adapter;
   }
}

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

$this->query("set names utf8")

不过这样影响到移植性,所以不推荐……