如何在东京橱柜中建造一到多排?

时间:2009-08-04 15:50:40

标签: primary-key tokyo-cabinet dht

我引用东京内阁文件......

  

对于哈希表的数据库,每个键在数据库中必须是唯一的,   所以不可能存储两个或多个密钥重叠的记录。

或tokyocabinet是否允许基于元组的键?

设置一对多商店的最佳方式是什么(比如爬虫1 kw< - >许多docids)

〜乙

2 个答案:

答案 0 :(得分:1)

使用表数据库(TDB),您只需将一个键列表存储为一个值作为标记。只要您的密钥是有效的“令牌”,您就可以在单个字段中轻松地将它们列出来。

以下是使用Pyrant的低级接口的示例:

>>> from pyrant import Tyrant
>>> t = Tyrant()
>>> includes = 5  # code for operation TDBQCSTROR
>>> t['test'] = {'foo': 'abc,def', 'bar': 'abc def', 'quux': 'abcdef'}
>>> t.proto.search([('foo',includes,'abc')])
[u'test']
>>> t.proto.search([('bar',includes,'abc')])
[u'test']
>>> t.proto.search([('quux',includes,'abc')])
[]
>>> t.proto.search([('quux',includes,'abcd')])
[]
>>> t.proto.search([('quux',includes,'abcdef')])
[u'test']

TDBQCSTROR是一种操作类型,代表“字符串包含至少一个令牌......”(参见Tokyo Cabinet API specs中的“tctdbqryaddcond”)。

请注意,“abc,def”和“abc def”都匹配“abc”关键字,但“abcdef”没有,尽管“abc”实际上是“abcdef”的子集。这可以用于搜索存储在单个字符串中的密钥,例如:

t['tokyocabinet'] = {'title': 'Tokyo Cabinet'}
t['primary-key'] = {'title': 'Primary Key'}
t['question1228313'] = {
    'title': 'how to build one to many rows in tokyo cabinet?',
    'tags': 'tokyocabinet, primary-key',
}

(标签可能不是最好的例子,因为它们不需要引用。)

如果您使用的是另一种TC数据库(不是TDB),我无法想象一个有效的解决方案。您可能想在相关的discussion group中提出这个问题。

答案 1 :(得分:0)

对于哈希表的数据库,每个密钥在数据库中必须是唯一的,因此不可能存储两个或多个密钥重叠的记录。

B + -Tree Tokyo Cabinet数据库允许重复键:

bool tcbdbputdup(TCBDB *bdb, const void *kbuf, int ksiz, const void *vbuf, int vsiz); 

使用Ruby API:

TokyoCabinet::BDB.putdup(key, value) -> true|false
TokyoCabinet::BDB.getlist(key) => [value, ...]|nil