分享

采用tokyo cabinet搭建表格型DBM--展示过去,展望未来[周灵杰]

 Dawnxu 2009-08-11

采用tokyo cabinet搭建表格型DBM

Posted: 2009年5月12日 星期二
DBM(DataBase Manager)的特征是:按键-值对的方式进行存储,使用hash进行查找,由于没有提供更高级的sql功能,它的效率远远超过传统的关系型数据库。现 主流的dbm有:Berkeley DB(现属于oracle公司,是互联网部署最多的一款dbm),Gdbm(GNU Database Manager) QDBM: Quicker Database Manager,Tokyo cabinet,CDB:Constant Databases,Tokyo cabinet是基于QDBM再开发的一款DBM,它本身也只提供数据库引擎,所谓数据库引擎是指它提供了除SQL处理层以外的所有关系数据库的功能(如 事务性(ACID)支持,数据存储,数据恢复等)。前面提到dbm的特征是一些键-值对的形式出现,那么Tokyo Cabinet作为一款dbm,它也不例外,怎么样才能实现跟普通的关系数据库一样的表格功能呢?Tokyo Cabinet的作者开发了一款Tokyo Tyrant的工具,可以采用它调用Tokyo Cabinet数据库引擎,实现跟管理数据库一样的数据库表格的功能,下面通过一个普通的员工信息表进行演示说明
表格内容如下

在普通的关系数据库mysql中建立这个表格的sql语句如下
create table staffs (
id int primary key,
name varchar(255),
sex enum ( 'male', 'female' ),
birthday date,
div varchar(255)
);

而 根据上面所说的按键-值对方式进行存储,那么这样想的话,那不是得分成,几个db,分别是名字db,性别db,出生年月db和职务db,那这样的话表格的 逻辑不是乱了吗!如果这样的话,估计没有几个人用,下面介绍采用tokyo tyrant的命令就可以做成这个表格,实现与普通关系型数据库提供的sql使用方式。
建立数据库
tctmgr create casket
插入数据

tctmgr put casket 1 "name" "张三" "sex" "male" \
"birthday" "19900101" "div" "brd,dev"
tctmgr put casket 5 "name" "李四" "sex" "female" \
"birthday" "19850523" "div" "dev"
tctmgr put casket 23 "name" "王五" "sex" "male" \
"birthday" "19881013" "div" "hr"

查询所有数据
tctmgr list -pv casket
--------
1 name 张三 sex male birthday 19900101 div brd,dev
5 name 李四 sex female birthday 19850523 div dev
23 name 王五 sex male birthday 19881013 div hr

条件查询
通过主键进行查询,查询用户id为23的职员信息
tctmgr get casket 23
--------
name 李四
sex female
birthday 19850523
div dev

通过不是主键进行查询

#查询以王开头的用户
tctmgr search -pv casket name STRBW "王"
-------
23 name 王五 sex male birthday 19881013 div hr
#查询以85年出生以后的男职员
tctmgr search -pv casket birthday NUMGE 19850101 sex STREQ "male"
--------
1 name 张三 sex male birthday 19900101 div brd,dev
23 name 王五 sex male birthday 19881013 div hr

附查询条件表达式(前面加~,相当于标准sql中的非)
* STREQ : 完全包含字符串,相当于标准sql中的where 字段=‘字符串’
* STRINC : 包含此字符串,相当于标准sql中like ‘*字符串*’
* STRBW : 以此字符串开头的内容,相当于标准sql中like ‘字符串*’
* STREW : 以此字符串结尾的内容,相当于标准sql中like ‘*字符串’
* STRAND : 包含在某区间内的内容,如标准sql中like ‘a-z’,那么他只能是a到z的字母
* STROR : 不包含在某区间内的内容,如标准sql中like ‘!a-z’,那么他只能是数字或其他的符号
* STRRX : 组合式结构,如标准sql中like “a“!b-m”#”
* NUMEQ : 数值大小一样 相当于标准sql中 where a=‘1’
* NUMGT : 数值大于某一值 相当于标准sql中 where a>‘1’
* NUMGE : 数值大于等于某一值 相当于标准sql中 where a>=‘1’
* NUMLT : 数值小于某一值 相当于标准sql中 where a<‘1’
* NUMLE : 数值小于某一值 相当于标准sql中 where a<=‘1’
* NUMBT : 数值处于某一数值区间,相当于标准sql中 where a> 1 and a < 10
* NUMOREQ : 数值不处于某一数值的区间,如果是a大于1,小于10的话,那这个表达式右边的内容应该相当于标准sql中 where a< 1 or a > 10
附排序
* STRASC : 按字面大小的升序排序
* STRDESC : 按字面大小的降序排序
* STRASC : 按数字大小的升序排序
* STRDESC : 按数字大小的降序排序
删除操作

tctmgr out casket 23
#确认结果
tctmgr list -pv casket
--------
1 name 张三 sex male birthday 19900101 div brd,dev
5 name 李四 sex female birthday 19850523 div dev

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多