TCTDB是tokyo cabinet家族中的表格数据库(如上图),其实现基于TCHDB(hash database)和TCBDB(B-tree database)。
TCHDB参考:http://blog.chinaunix.net/space.php?uid=20196318&do=blog&id=327754
TCBDB的代码没有读过,有时间也阅读一下,其结构如下图所示。
TCTDB的主要特性:
1. 松散表格实现,以primary key标示表格的一行,每行包括多列,列以名字标示。
行的存储使用TCHDB,把所有的行作为一个value(在内存中是一个map,map中为多个列的列名以及列值)存储,更新时,也必须整体更新,即使是单个colomn的更新也需要把整体读出来更新其中的部分信息。
2. 灵活的数据结构,所有的数据结构都作为char[]存储,no schema,no data type。
3. 查询机制,实现多种查询操作(字符串匹配,正则,整数比较等),结果可按列字段排序。
4. 列索引,通过TCBDB存储基于列的索引,查询机制基于列索引(toke,q-gram),先后去对应列的索引倒排表,然后在表中进行匹配。
查询支持的匹配方式
enum { /* enumeration for query conditions */
TDBQCSTREQ, /* string is equal to */
TDBQCSTRINC, /* string is included in */
TDBQCSTRBW, /* string begins with */
TDBQCSTREW, /* string ends with */
TDBQCSTRAND, /* string includes all tokens in */
TDBQCSTROR, /* string includes at least one token in */
TDBQCSTROREQ, /* string is equal to at least one token in */
TDBQCSTRRX, /* string matches regular expressions of */
TDBQCNUMEQ, /* number is equal to */
TDBQCNUMGT, /* number is greater than */
TDBQCNUMGE, /* number is greater than or equal to */
TDBQCNUMLT, /* number is less than */
TDBQCNUMLE, /* number is less than or equal to */
TDBQCNUMBT, /* number is between two tokens of */
TDBQCNUMOREQ, /* number is equal to at least one token in */
TDBQCFTSPH, /* full-text search with the phrase of */
TDBQCFTSAND, /* full-text search with all tokens in */
TDBQCFTSOR, /* full-text search with at least one token in */
TDBQCFT***, /* full-text search with the compound expression of */
TDBQCNEGATE = 1 << 24, /* negation flag */
TDBQCNOIDX = 1 << 25 /* no index flag */
};
TC支持多种类型查询,匹配主要基于字符串和数值,字符串的匹配支持正则表达式,部分匹配,前向/后向匹配;数值的主要基于比较运算符。
结果排序方式
enum { /* enumeration for order types */
TDBQOSTRASC, /* string ascending */
TDBQOSTRDESC, /* string descending */
TDBQONUMASC, /* number ascending */
TDBQONUMDESC /* number descending */
};
TCTDB可对查询结果进行排序,支持以上四种方式的排序,按字符串升降序,按数值升降序。
索引类型
enum { /* enumeration for index types */
TDBITLEXICAL, /* lexical string */
TDBITDECIMAL, /* decimal string */
TDBITTOKEN, /* token inverted index */
TDBITQGRAM, /* q-gram inverted index */
};
TCTDB在建立列索引时,可设置索引类型,主要包括字典串序索引,十进制串序索引,TOKEN索引,q-gram索引。如果需要对某个列进行建立索引,则每当插入一个新的行时,会对相应的列添加指定的索引(每个索引对应一个TCBDB来存储索引数据)。
Name(主key) | Age | Company | Interest |
Jack | 23 | baidu | basketball,sanguosha |
Rose | 22 | tencent | pingpong,poker |
Joe | 25 | taobao | kfc bicycle |
如果需要根据Age建立索引,索引类型为TDBITDECIMAL
则当三个行插入后,生成的索引(TCBDB)中包含三行,依次为22(rose),23(jack),25(joe)(索引会根据类型进行排序,括号中代表value)。
如果还需要对Company建立索引,类型为TDBITDECIMAL,则当插入三行后,生成的索引中三行依次为,baidu(jack),taobao(joe),tencent(rose)。
如果还需要对interest建立索引,类型为TDBITTOKEN,则当插入三行后,生成的索引中依次为,basketball(jack),bicycle(joe),kfc(joe),pingpong(rose),poker(rose),sanguosha(jack)。
有了以上索引,则当需要根据某个colomn的值进行查询时,效率会相当高,其基于btree进行查找。